aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--make.c21
-rw-r--r--src/grab.c93
-rw-r--r--vendor/librune/.gitignore12
-rw-r--r--vendor/librune/LICENSE14
-rw-r--r--vendor/librune/README.md33
-rw-r--r--vendor/librune/cbs.h939
-rw-r--r--vendor/librune/data/GraphemeBreakTest.txt1187
-rw-r--r--vendor/librune/data/emoji-data.txt1320
-rwxr-xr-xvendor/librune/gen/gbrk115
-rwxr-xr-xvendor/librune/gen/mkfile37
-rw-r--r--vendor/librune/include/gbrk.h10
-rw-r--r--vendor/librune/include/internal/common.h39
-rw-r--r--vendor/librune/include/internal/gbrk_lookup.h1569
-rw-r--r--vendor/librune/include/internal/types.h17
-rw-r--r--vendor/librune/include/rune.h38
-rw-r--r--vendor/librune/include/utf8.h47
-rw-r--r--vendor/librune/lib/gbrk/u8glen.c13
-rw-r--r--vendor/librune/lib/gbrk/u8gnext.c165
-rw-r--r--vendor/librune/lib/utf8/rtou8.c36
-rw-r--r--vendor/librune/lib/utf8/u8bspn.c22
-rw-r--r--vendor/librune/lib/utf8/u8cbspn.c20
-rw-r--r--vendor/librune/lib/utf8/u8chk.c19
-rw-r--r--vendor/librune/lib/utf8/u8chkr.c9
-rw-r--r--vendor/librune/lib/utf8/u8chr.c97
-rw-r--r--vendor/librune/lib/utf8/u8cspn.c20
-rw-r--r--vendor/librune/lib/utf8/u8len.c13
-rw-r--r--vendor/librune/lib/utf8/u8next.c14
-rw-r--r--vendor/librune/lib/utf8/u8prev.c37
-rw-r--r--vendor/librune/lib/utf8/u8rchr.c87
-rw-r--r--vendor/librune/lib/utf8/u8set.c24
-rw-r--r--vendor/librune/lib/utf8/u8spn.c22
-rw-r--r--vendor/librune/lib/utf8/u8tor.c31
-rw-r--r--vendor/librune/lib/utf8/u8tor_uc.c24
-rw-r--r--vendor/librune/lib/utf8/u8wdth.c13
-rw-r--r--vendor/librune/make.c100
-rw-r--r--vendor/librune/man/Lb-desc.tmac1
-rw-r--r--vendor/librune/man/rtou8.31
-rw-r--r--vendor/librune/man/u8glen.362
-rw-r--r--vendor/librune/man/u8gnext.372
-rw-r--r--vendor/librune/man/u8len.370
-rw-r--r--vendor/librune/man/u8next.3111
-rw-r--r--vendor/librune/man/u8prev.31
-rw-r--r--vendor/librune/man/u8set.3103
-rw-r--r--vendor/librune/man/u8tor.390
-rw-r--r--vendor/librune/man/u8tor_uc.31
-rw-r--r--vendor/librune/man/u8wdth.369
-rw-r--r--vendor/librune/test/gbrk.c85
-rwxr-xr-xvendor/librune/test/tests38
48 files changed, 6946 insertions, 15 deletions
diff --git a/make.c b/make.c
index 4e854dc..26a8680 100644
--- a/make.c
+++ b/make.c
@@ -17,8 +17,10 @@
#include "cbs.h"
#include "src/compat.h"
-#define CC "cc"
-#define CFLAGS "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe"
+#define CC "cc"
+#define CFLAGS \
+ "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe", \
+ "-Ivendor/librune/include"
#define CFLAGS_DEBUG "-DGRAB_DEBUG", "-g", "-ggdb3"
#ifdef __APPLE__
# define CFLAGS_RELEASE "-O3"
@@ -88,8 +90,20 @@ main(int argc, char **argv)
cmdprc(c);
}
} else {
+ cmd_t c = {0};
struct strv sv = {0};
+ if (chdir("./vendor/librune/") == -1)
+ die("chdir: ./vendor/librune/");
+
+ cmdadd(&c, CC, "-lpthread", "-o", "make", "make.c");
+ cmdprc(c);
+ cmdadd(&c, "./make");
+ cmdprc(c);
+
+ if (chdir("../../") == -1)
+ die("chdir: ../../");
+
env_or_default(&sv, "CC", CC);
if (dflag)
env_or_default(&sv, "CFLAGS", CFLAGS, CFLAGS_DEBUG);
@@ -114,7 +128,8 @@ main(int argc, char **argv)
cmdadd(&c, "-lpcre2-posix");
strvfree(&pc);
}
- cmdadd(&c, "-o", i == 0 ? "grab" : "git-grab", "src/grab.c");
+ cmdadd(&c, "-o", i == 0 ? "grab" : "git-grab", "src/grab.c",
+ "vendor/librune/librune.a");
cmdprc(c);
}
diff --git a/src/grab.c b/src/grab.c
index d1e82cf..4686a1f 100644
--- a/src/grab.c
+++ b/src/grab.c
@@ -22,6 +22,8 @@
# endif
#endif
+#include <gbrk.h>
+
#include "compat.h"
#include "da.h"
@@ -32,7 +34,9 @@
warn(__VA_ARGS__); \
rv = EXIT_FAILURE; \
} while (0)
-#define streq(a, b) (!strcmp(a, b))
+
+#define streq(a, b) (!strcmp(a, b))
+#define memeq(a, b, n) (!memcmp(a, b, n))
#define EEARLY "Input string terminated prematurely"
@@ -80,7 +84,7 @@ static bool xisspace(char);
static char *xstrchrnul(const char *, char);
static int filecnt, rv;
-static bool cflag, nflag, sflag, Uflag, zflag;
+static bool bflag, cflag, nflag, sflag, Uflag, zflag;
static bool fflag = GIT_GRAB;
static put_func putf = putm;
@@ -96,9 +100,9 @@ usage(const char *s)
{
fprintf(stderr,
#if GIT_GRAB
- "Usage: %s [-s | -z] [-cnU] pattern [glob ...]\n"
+ "Usage: %s [-s | -z] [-bcnU] pattern [glob ...]\n"
#else
- "Usage: %s [-s | -z] [-cfnU] pattern [file ...]\n"
+ "Usage: %s [-s | -z] [-bcfnU] pattern [file ...]\n"
#endif
" %s -h\n",
s, s);
@@ -111,6 +115,7 @@ main(int argc, char **argv)
int opt;
struct ops ops;
struct option longopts[] = {
+ {"byte-offset", no_argument, nullptr, 'b'},
{"color", no_argument, nullptr, 'c'},
#if GIT_GRAB
{"filenames", no_argument, nullptr, 'f'},
@@ -128,9 +133,9 @@ main(int argc, char **argv)
size_t len;
ssize_t nr;
FILE *flist;
- const char *opts = "chnsUz";
+ const char *opts = "bchnsUz";
#else
- const char *opts = "cfhnsUz";
+ const char *opts = "bcfhnsUz";
#endif
argv[0] = basename(argv[0]);
@@ -141,6 +146,9 @@ main(int argc, char **argv)
while ((opt = getopt_long(argc, argv, opts, longopts, nullptr)) != -1) {
switch (opt) {
+ case 'b':
+ bflag = true;
+ break;
case 'c':
cflag = true;
break;
@@ -410,6 +418,13 @@ void
putm(struct sv sv, regmatch_t *rm, const char *filename)
{
static const char *fn, *ln, *ma, *se;
+ static struct {
+ const char8_t *p;
+ size_t col, row;
+ } pos = {
+ .col = 1,
+ .row = 1,
+ };
if (cflag && !fn) {
char *optstr;
@@ -469,11 +484,36 @@ putm(struct sv sv, regmatch_t *rm, const char *filename)
if (fflag || filecnt > 1) {
char sep = zflag ? '\0' : ':';
printf("\33[%sm%s\33[0m" /* filename */
- "\33[%sm%c\33[0m" /* separator */
- "\33[%sm%td\33[0m" /* byte offset */
- "\33[%sm%c\33[0m" /* separator */
- ,
- fn, filename, se, sep, ln, sv.p - sv.bp, se, sep);
+ "\33[%sm%c\33[0m", /* separator */
+ fn, filename, se, sep);
+
+ if (bflag) {
+ printf("\33[%sm%td\33[0m" /* byte offset */
+ "\33[%sm%c\33[0m", /* separator */
+ ln, sv.p - sv.bp, se, sep);
+ } else {
+ size_t len;
+ struct u8view v;
+
+ if (!pos.p)
+ pos.p = (char8_t *)sv.bp;
+ len = (char8_t *)sv.p - pos.p;
+
+ while (u8gnext(&v, &pos.p, &len)) {
+ if (*v.p == '\n' || memeq(v.p, "\r\n", 2)) {
+ pos.col = 1;
+ pos.row++;
+ } else
+ pos.col++;
+ }
+
+ printf("\33[%sm%zu\33[0m" /* row */
+ "\33[%sm%c\33[0m" /* separator */
+ "\33[%sm%zu\33[0m" /* column */
+ "\33[%sm%c\33[0m" /* separator */
+ ,
+ ln, pos.row, se, sep, ln, pos.col, se, sep);
+ }
}
if (rm) {
fwrite(sv.p, 1, rm->rm_so, stdout);
@@ -491,9 +531,38 @@ putm_nc(struct sv sv, regmatch_t *rm, const char *filename)
{
(void)rm;
+ static struct {
+ const char8_t *p;
+ size_t col, row;
+ } pos = {
+ .col = 1,
+ .row = 1,
+ };
+
if (fflag || filecnt > 1) {
char sep = zflag ? '\0' : ':';
- printf("%s%c%td%c", filename, sep, sv.p - sv.bp, sep);
+ printf("%s%c", filename, sep);
+
+ if (bflag)
+ printf("%td%c", sv.p - sv.bp, sep);
+ else {
+ size_t len;
+ struct u8view v;
+
+ if (!pos.p)
+ pos.p = (char8_t *)sv.bp;
+ len = (char8_t *)sv.p - pos.p;
+
+ while (u8gnext(&v, &pos.p, &len)) {
+ if (*v.p == '\n' || memeq(v.p, "\r\n", 2)) {
+ pos.col = 1;
+ pos.row++;
+ } else
+ pos.col++;
+ }
+
+ printf("%zu%c%zu%c", pos.row, sep, pos.col, sep);
+ }
}
fwrite(sv.p, 1, sv.len, stdout);
if (!(sflag && sv.p[sv.len - 1] == '\n'))
diff --git a/vendor/librune/.gitignore b/vendor/librune/.gitignore
new file mode 100644
index 0000000..457da10
--- /dev/null
+++ b/vendor/librune/.gitignore
@@ -0,0 +1,12 @@
+.cache/
+test/gbrk
+*.[ao]
+a.out
+compile_commands.json
+failures
+main
+make
+main.c
+Makefile
+NOTE-TO-SELF
+test.c
diff --git a/vendor/librune/LICENSE b/vendor/librune/LICENSE
new file mode 100644
index 0000000..b946725
--- /dev/null
+++ b/vendor/librune/LICENSE
@@ -0,0 +1,14 @@
+BSD Zero Clause License
+
+Copyright © 2024 Thomas Voss
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/vendor/librune/README.md b/vendor/librune/README.md
new file mode 100644
index 0000000..fa98774
--- /dev/null
+++ b/vendor/librune/README.md
@@ -0,0 +1,33 @@
+# librune — easy Unicode in a post-ASCII world
+
+Librune is a C library that aims to make interacting with Unicode and
+UTF-8 easy in C. There are no plans at the moment to support UTF-16 or
+-32, but they may be supported if such a usecase ever comes up.
+
+This library has been tested to build and work properly on both C99 and
+C23.
+
+
+## Terminology
+
+This library uses the term ‘rune’ to refer to a single Unicode-codepoint,
+and defines a `rune` datatype which is an unsigned integer type which
+represents a rune (shocker).
+
+
+## Headers
+
+This library contains the following headers:
+
+1. `gbrk.h` — grapheme-iteration functions
+2. `rune.h` — rune-constants, -macros, and -functions
+3. `utf8.h` — UTF-8 encoding, decoding, iteration, etc.
+
+
+## Installation
+
+There is no ‘intended’ way in which this library should be installed,
+used, and distributed. This library is primarily written for myself, and
+I prefer to vendor it in my projects. You may choose to install it as a
+shared and/or static library. You’re an engineer aren’t you? Figure it
+out.
diff --git a/vendor/librune/cbs.h b/vendor/librune/cbs.h
new file mode 100644
index 0000000..bcf82df
--- /dev/null
+++ b/vendor/librune/cbs.h
@@ -0,0 +1,939 @@
+/* Single-header library to help write build scripts in C. This library is
+ POSIX compliant, so it should work on all respectible UNIX-like systems.
+
+ You can find the CBS git repository at https://git.sr.ht/~mango/cbs and you
+ can include this in your project with the following command:
+
+ $ wget 'https://git.sr.ht/~mango/cbs/blob/master/cbs.h'
+
+ This library is licensed under the 0-Clause BSD license, and as such you may
+ do whatever you want to it, however you want to it, whenever you want. You
+ are encouraged in fact to modify this library to suit your specific usecase.
+
+ All functions and macros are documented. You can figure out the API pretty
+ easily by just reading the comments in this file.
+
+ In many cases you may want to be able to execute commands on multiple threads
+ to speed up compilation, such as the -j option when using Make. Functions
+ for creating and using thread pools will be made available if the CBS_PTHREAD
+ macro is defined before including this file. Do note that on POSIX platforms
+ it will require linking to the pthreads library when bootstrapping the build
+ script.
+
+ This file does not support C89. Fuck C89, that shit is ancient. Move on.
+
+ IMPORTANT NOTE: Any identifiers prefixed with an underscore (e.g. ‘_rebuild’)
+ are meant for internal use only and you should not touch them unless you know
+ what you’re doing.
+
+ IMPORTANT NOTE: All the functions and macros in this library will terminate
+ the program on error. If this is undesired behavior, feel free to edit the
+ functions to return errors.
+
+ There are a few exceptions to the above rule, and they are documented.
+
+ This library does not aim to ever support Windows */
+
+#ifndef C_BUILD_SYSTEM_H
+#define C_BUILD_SYSTEM_H
+
+#ifdef __GNUC__
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunused-function"
+#endif
+
+/* Assert that the user is building for a supported platform. The only portable
+ way to check for POSIX is to validate that unistd.h exists. This is only
+ possible without compiler extensions in C23 (although some compilers support
+ it as an extension in earlier editions), so people compiling for pre-C23
+ might not get this error if on a bad platform, and may end up being a bit
+ confused.
+
+ It’s just a maybe though, this is nothing more than a sanity check for the
+ users sake. */
+#if defined(__has_include) && !__has_include(<unistd.h>)
+# error "Non-POSIX platform detected"
+#endif
+
+#ifdef __APPLE__
+# define st_mtim st_mtimespec
+#endif
+
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include <errno.h>
+#include <libgen.h>
+#include <limits.h>
+#ifdef CBS_PTHREAD
+# include <pthread.h>
+#endif
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <wordexp.h>
+
+/* C23 changed a lot so we want to check for it */
+#if __STDC_VERSION__ >= 202000
+# define CBS_IS_C23 1
+#endif
+
+/* Some C23 compat. In C23 booleans are actual keywords, and the noreturn
+ attribute is different. */
+#if CBS_IS_C23
+# define noreturn [[noreturn]]
+#else
+# include <stdbool.h>
+# include <stdnoreturn.h>
+#endif
+
+/* Give helpful diagnostics when people use die() incorrectly on GCC. C23
+ introduced C++ attribute syntax, so we need a check for that too. */
+#ifdef __GNUC__
+# if CBS_IS_C23
+# define ATTR_FMT [[gnu::format(printf, 1, 2)]]
+# else
+# define ATTR_FMT __attribute__((format(printf, 1, 2)))
+# endif
+#else
+# define ATTR_FMT
+#endif
+
+/* Clang defines this attribute, and while it does nothing it does serve as
+ good documentation. */
+#ifndef _Nullable
+# define _Nullable
+#endif
+
+/* Convert the given variadic arguments to a string array */
+#define _vtoa(...) ((char *[]){__VA_ARGS__})
+
+/* Internal global versions of argc and argv, so our functions and macros can
+ access them from anywhere. */
+static int _cbs_argc;
+static char **_cbs_argv;
+
+/* A vector of strings used to accumulate output of functions such as pcquery().
+ The array of strings buf has length len, and is not null-terminated. You
+ should always zero-initialize variables of this type. */
+struct strv {
+ char **buf;
+ size_t len;
+};
+
+/* Free and zero a string vector. Because this function zeros the structure, it
+ is safe to reuse the vector after this function is called. */
+static void strvfree(struct strv *);
+
+/* A wrapper function around realloc(). It behaves exactly the same except
+ instead of taking a buffer size as an argument, it takes a count n of
+ elements, and a size m of each element. This allows it to properly check for
+ overflow, and errors if overflow would occur. */
+static void *bufalloc(void *_Nullable, size_t n, size_t m);
+
+/* Error reporting functions. The die() function takes the same arguments as
+ printf() and prints the corresponding string to stderr. It also prefixes the
+ string with the command name followed by a colon, and suffixes the string
+ with a colon and the error string returned from strerror().
+
+ If you want to print just the error message and no custom text, NULL may be
+ passed to die(). NULL should not be passed to diex().
+
+ diex() is the same as die() but does not print a strerror() error string. */
+ATTR_FMT noreturn static void die(const char *_Nullable, ...);
+ATTR_FMT noreturn static void diex(const char *, ...);
+
+/* Initializes some data required for this header to work properly. This should
+ be the first thing called in main() with argc and argv passed. */
+static void cbsinit(int, char **);
+
+/* Get the number of items in the array a */
+#define lengthof(a) (sizeof(a) / sizeof(*(a)))
+
+/* Struct representing a CLI command that various functions act on. You should
+ always zero-initialize variables of this type before use.
+
+ After executing a command, you can reuse the already allocated buffer this
+ command holds by calling cmdclr(). When you’re really done with an object of
+ this type, remember to call free() on ._argv.
+
+ The ._argv field is a NULL-terminated list of command arguments of length
+ ._len. You may safely read from both of these fields but they should NOT be
+ modified without use of cmdadd() and cmdaddv(). */
+typedef struct {
+ char **_argv;
+ size_t _len, _cap;
+} cmd_t;
+
+/* Returns whether or not a binary of the given name exists in the users
+ environment as defined by $PATH. */
+static bool binexists(const char *);
+
+/* cmdadd() adds the variadic string arguments to the given command.
+ Alternatively, the cmdaddv() function adds the n strings pointed to by p to
+ the given command. */
+static void cmdaddv(cmd_t *, char **p, size_t n);
+#define cmdadd(cmd, ...) \
+ cmdaddv(cmd, _vtoa(__VA_ARGS__), lengthof(_vtoa(__VA_ARGS__)))
+
+/* Clear (but not free) the command c. Useful for reusing the same command
+ struct to minimize allocations. */
+static void cmdclr(cmd_t *c);
+
+/* The cmdexec() function executes the given command and waits for it to
+ terminate, returning its exit code. The cmdexeca() function executes the
+ given command and returns immediately, returning its process ID.
+
+ The cmdexecb() function is like cmdexec() except it writes the given commands
+ standard output to the character buffer pointed to by p. It also stores the
+ size of the output in *n. The character buffer p is null-terminated. If the
+ given command produces no output to the standard output, p will be set to
+ NULL.
+
+ cmdexec() and cmdexecb() have the same return values as cmdwait(). */
+static int cmdexec(cmd_t);
+static pid_t cmdexeca(cmd_t);
+static int cmdexecb(cmd_t, char **p, size_t *n);
+
+/* Wait for the process with the given PID to terminate, and return its exit
+ status. If the process was terminated by a signal 256 is returned. */
+static int cmdwait(pid_t);
+
+/* Write a representation of the given command to the given file stream. This
+ can be used to mimick the echoing behavior of make(1). The cmdput() function
+ is a nice convenience function so you can avoid writing ‘stdout’ all the
+ time. */
+static void cmdput(cmd_t);
+static void cmdputf(FILE *, cmd_t);
+
+/* Expand the environment variable s using /bin/sh expansion rules and append
+ the results in the given string vector. If the environment variable is NULL
+ or empty, then store the strings specified by the array p of length n.
+
+ env_or_default() is the same as env_or_defaultv() but you provide p as
+ variadic arguments.
+
+ If the pointer p is null, then no default value is appended to the given
+ string vector when the environment variable is not present. */
+static void env_or_defaultv(struct strv *, const char *s, char *_Nullable *p,
+ size_t n);
+#define env_or_default(sv, s, ...) \
+ env_or_defaultv((sv), (s), _vtoa(__VA_ARGS__), lengthof(_vtoa(__VA_ARGS__)))
+
+/* Returns if a file exists at the given path. A return value of false may also
+ mean you don’t have the proper file access permissions, which will also set
+ errno. */
+static bool fexists(const char *);
+
+/* Compare the modification dates of the two named files.
+
+ A return value >0 means the LHS is newer than the RHS.
+ A return value <0 means the LHS is older than the RHS.
+ A return value of 0 means the LHS and RHS have the same modification date.
+
+ The fmdnewer() and fmdolder() functions are wrappers around fmdcmp() that
+ return true when the LHS is newer or older than the RHS respectively. */
+static int fmdcmp(const char *, const char *);
+static bool fmdolder(const char *, const char *);
+static bool fmdnewer(const char *, const char *);
+
+/* Report if any of n files specified by p render the file base outdated. If
+ the file base does not exist, this function returns true. You will typically
+ call this with a compiled program as base, and C source files as p. The
+ macro foutdated() is a wrapper around foutdatedv() that allows you to specify
+ the sources to base as variadic arguments instead of as an array. */
+static bool foutdatedv(const char *base, const char **p, size_t n);
+#define foutdated(s, ...) \
+ foutdatedv(s, (const char **)_vtoa(__VA_ARGS__), \
+ lengthof(_vtoa(__VA_ARGS__)))
+
+/* Rebuild the build script if it has been modified, and execute the newly built
+ script. You should call the rebuild() macro at the very beginning of main(),
+ but right after cbsinit(). You probably don’t want to call _rebuild()
+ directly. */
+static void _rebuild(char *);
+#define rebuild() _rebuild(__FILE__)
+
+/* Get the number of available CPUs, or -1 on error. This function also returns
+ -1 if the _SC_NPROCESSORS_ONLN flag to sysconf(3) is not available. In that
+ case, errno will not be set. */
+static int nproc(void);
+
+/* Append the arguments returned by an invokation of pkg-config for the library
+ lib to the given string vector. The flags argument is one-or-more of the
+ flags in the pkg_config_flags enum bitwise-ORed together.
+
+ If PKGC_CFLAGS is specified, call pkg-config with ‘--cflags’.
+ If PKGC_LIBS is specified, call pkg-config with ‘--libs’.
+
+ This function returns true on success and false if pkg-config is not found on
+ the system. To check for pkg-configs existance, you can use the binexists()
+ function. */
+static bool pcquery(struct strv *, char *lib, int flags);
+enum pkg_config_flags {
+ PKGC_LIBS = 1 << 0,
+ PKGC_CFLAGS = 1 << 1,
+};
+
+#ifdef CBS_PTHREAD
+
+/* A tfunc_t represents a function to be executed by a threads in a thread pool.
+ It takes an argument in the form of a void * and returns nothing. */
+typedef void (*tfunc_t)(void *);
+
+/* A tfunc_free_t represents a function which frees the argument passed to a
+ tfunc_t function. */
+typedef void (*tfree_func_t)(void *);
+
+/* A thread pool job queue. Meant for internal-use only. */
+struct _tjob {
+ void *arg;
+ tfunc_t fn;
+ tfree_func_t free;
+ struct _tjob *next;
+};
+
+/* A basic thread pool. None of its fields should really be touched. */
+typedef struct {
+ bool _stop;
+ size_t _tcnt, _left;
+ pthread_t *_thrds;
+ pthread_cond_t _cnd;
+ pthread_mutex_t _mtx;
+ struct _tjob *_head, *_tail;
+} tpool_t;
+
+/* Initialize and destroy a thread pool. The tpinit() function initializes the
+ given thread pool and creates n threads ready to execute work. The tpfree()
+ function should be called after a thread pool has been used to release all
+ resources used by the thread pool. */
+static void tpinit(tpool_t *, size_t n);
+static void tpfree(tpool_t *);
+
+/* Wait for all jobs on the given thread pool to be executed. Note that this
+ function does not destroy the threads or free any resources — those are tasks
+ for the tpfree() function. */
+static void tpwait(tpool_t *);
+
+/* Enqueue and dequeue jobs to the thread pools job queue. The tpenq() function
+ is threadsafe while the _tpdeq() function is not (so don’t use it). When
+ calling the tpenq() function, the function fn will be queued to be executed
+ by a thread in the thread pool with the argument arg. If the given argument
+ needs to be deallocated after the job completes, you can pass the free
+ argument which will be called with the given argument after use. If free is
+ NULL, it will be ignored.
+
+ The free() function is a valid argument to the free parameter. */
+static void tpenq(tpool_t *, tfunc_t fn, void *arg,
+ tfree_func_t _Nullable free);
+static struct _tjob *_tpdeq(tpool_t *);
+
+#endif /* CBS_PTHREAD */
+
+/* BEGIN DEFINITIONS */
+
+void
+strvfree(struct strv *v)
+{
+ free(v->buf);
+ *v = (struct strv){0};
+}
+
+void *
+bufalloc(void *p, size_t n, size_t m)
+{
+ if (n && SIZE_MAX / n < m) {
+ errno = EOVERFLOW;
+ die(__func__);
+ }
+
+ if (!(p = realloc(p, n * m)))
+ die(__func__);
+ return p;
+}
+
+void
+die(const char *fmt, ...)
+{
+ int e = errno;
+ va_list ap;
+
+ va_start(ap, fmt);
+ flockfile(stderr);
+ fprintf(stderr, "%s: ", *_cbs_argv);
+ if (fmt) {
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ": ");
+ }
+ fprintf(stderr, "%s\n", strerror(e));
+ exit(EXIT_FAILURE);
+}
+
+void
+diex(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ flockfile(stderr);
+ fprintf(stderr, "%s: ", *_cbs_argv);
+ vfprintf(stderr, fmt, ap);
+ fputc('\n', stderr);
+ exit(EXIT_FAILURE);
+}
+
+void
+cbsinit(int argc, char **argv)
+{
+ _cbs_argc = argc;
+ _cbs_argv = bufalloc(NULL, argc, sizeof(char *));
+ for (int i = 0; i < argc; i++) {
+ if (!(_cbs_argv[i] = strdup(argv[i]))) {
+ /* We might not have set _cbs_argv[0] yet, so we can’t use die() */
+ fprintf(stderr, "%s: strdup: %s\n", *argv, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ }
+}
+
+static size_t
+_next_powerof2(size_t n)
+{
+ if (n && !(n & (n - 1)))
+ return n;
+
+ n--;
+ for (size_t i = 1; i < sizeof(size_t); i <<= 1)
+ n |= n >> i;
+ return n + 1;
+}
+
+bool
+binexists(const char *name)
+{
+ char *p, *path;
+
+ if (!(path = getenv("PATH")))
+ diex("PATH environment variable not found");
+
+ if (!(path = strdup(path)))
+ die("strdup");
+ p = strtok(path, ":");
+ while (p) {
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "%s/%s", p, name);
+ if (fexists(buf)) {
+ free(path);
+ return true;
+ }
+
+ p = strtok(NULL, ":");
+ }
+
+ free(path);
+ return false;
+}
+
+void
+cmdaddv(cmd_t *cmd, char **xs, size_t n)
+{
+ if (cmd->_len + n >= cmd->_cap) {
+ cmd->_cap = _next_powerof2(cmd->_len + n) + 2;
+ cmd->_argv = bufalloc(cmd->_argv, cmd->_cap, sizeof(char *));
+ }
+
+ memcpy(cmd->_argv + cmd->_len, xs, n * sizeof(*xs));
+ cmd->_len += n;
+ cmd->_argv[cmd->_len] = NULL;
+}
+
+void
+cmdclr(cmd_t *c)
+{
+ c->_len = 0;
+ *c->_argv = NULL;
+}
+
+int
+cmdexec(cmd_t c)
+{
+ return cmdwait(cmdexeca(c));
+}
+
+pid_t
+cmdexeca(cmd_t c)
+{
+ pid_t pid;
+
+ switch (pid = fork()) {
+ case -1:
+ die("fork");
+ case 0:
+ execvp(*c._argv, c._argv);
+ die("execvp: %s", *c._argv);
+ }
+
+ return pid;
+}
+
+int
+cmdexecb(cmd_t c, char **p, size_t *n)
+{
+ enum {
+ FD_R,
+ FD_W,
+ };
+ pid_t pid;
+ int fds[2];
+ char *buf;
+ size_t len, blksize;
+ struct stat sb;
+
+ if (pipe(fds) == -1)
+ die("pipe");
+
+ switch (pid = fork()) {
+ case -1:
+ die("fork");
+ case 0:
+ close(fds[FD_R]);
+ if (dup2(fds[FD_W], STDOUT_FILENO) == -1)
+ die("dup2");
+ execvp(*c._argv, c._argv);
+ die("execvp: %s", *c._argv);
+ }
+
+ close(fds[FD_W]);
+
+ buf = NULL;
+ len = 0;
+
+ blksize = fstat(fds[FD_R], &sb) == -1 ? BUFSIZ : sb.st_blksize;
+ for (;;) {
+ /* This can maybe somewhere somehow break some system. I do not care */
+ char tmp[blksize];
+ ssize_t nr;
+
+ if ((nr = read(fds[FD_R], tmp, blksize)) == -1)
+ die("read");
+ if (!nr)
+ break;
+ buf = bufalloc(buf, len + nr + 1, sizeof(char));
+ memcpy(buf + len, tmp, nr);
+ len += nr;
+ }
+
+ close(fds[FD_R]);
+ if (buf)
+ buf[len] = 0;
+ *p = buf;
+ *n = len;
+ return cmdwait(pid);
+}
+
+int
+cmdwait(pid_t pid)
+{
+ for (;;) {
+ int ws;
+ if (waitpid(pid, &ws, 0) == -1)
+ die("waitpid");
+
+ if (WIFEXITED(ws))
+ return WEXITSTATUS(ws);
+
+ if (WIFSIGNALED(ws))
+ return 256;
+ }
+}
+
+/* import shlex
+
+ s = '#define SHELL_SAFE "'
+ for c in map(chr, range(128)):
+ if not shlex._find_unsafe(c):
+ s += c
+ print(s + '"') */
+#define SHELL_SAFE \
+ "%+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
+
+void
+cmdput(cmd_t c)
+{
+ cmdputf(stdout, c);
+}
+
+void
+cmdputf(FILE *stream, cmd_t cmd)
+{
+ flockfile(stream);
+ for (size_t i = 0; i < cmd._len; i++) {
+ bool safe = true;
+ char *p, *q;
+
+ p = q = cmd._argv[i];
+ for (; *q; q++) {
+ if (!strchr(SHELL_SAFE, *q)) {
+ safe = false;
+ break;
+ }
+ }
+
+ if (safe)
+ fputs(p, stream);
+ else {
+ putc('\'', stream);
+ for (q = p; *q; q++) {
+ if (*q == '\'')
+ fputs("'\"'\"'", stream);
+ else
+ putc(*q, stream);
+ }
+ putc('\'', stream);
+ }
+
+ putc(i == cmd._len - 1 ? '\n' : ' ', stream);
+ }
+ funlockfile(stream);
+}
+
+void
+env_or_defaultv(struct strv *sv, const char *s, char **p, size_t n)
+{
+ wordexp_t we;
+ const char *ev;
+
+ if ((ev = getenv(s)) && *ev) {
+ switch (wordexp(ev, &we, WRDE_NOCMD)) {
+ case WRDE_BADCHAR:
+ case WRDE_BADVAL:
+ case WRDE_SYNTAX:
+ errno = EINVAL;
+ die("wordexp");
+ case WRDE_NOSPACE:
+ errno = ENOMEM;
+ die("wordexp");
+ }
+
+ p = we.we_wordv;
+ n = we.we_wordc;
+ } else if (!p)
+ return;
+
+ sv->buf = bufalloc(sv->buf, sv->len + n, sizeof(*sv->buf));
+ for (size_t i = 0; i < n; i++) {
+ if (!(sv->buf[sv->len + i] = strdup(p[i])))
+ die("strdup");
+ }
+ sv->len += n;
+
+ if (ev && *ev)
+ wordfree(&we);
+}
+
+bool
+fexists(const char *f)
+{
+ return !access(f, F_OK);
+}
+
+int
+fmdcmp(const char *lhs, const char *rhs)
+{
+ struct stat sbl, sbr;
+
+ if (stat(lhs, &sbl) == -1)
+ die("%s", lhs);
+ if (stat(rhs, &sbr) == -1)
+ die("%s", rhs);
+
+ return sbl.st_mtim.tv_sec == sbr.st_mtim.tv_sec
+ ? sbl.st_mtim.tv_nsec - sbr.st_mtim.tv_nsec
+ : sbl.st_mtim.tv_sec - sbr.st_mtim.tv_sec;
+}
+
+bool
+fmdnewer(const char *lhs, const char *rhs)
+{
+ return fmdcmp(lhs, rhs) > 0;
+}
+
+bool
+fmdolder(const char *lhs, const char *rhs)
+{
+ return fmdcmp(lhs, rhs) < 0;
+}
+
+bool
+foutdatedv(const char *src, const char **deps, size_t n)
+{
+ if (!fexists(src))
+ return true;
+ for (size_t i = 0; i < n; i++) {
+ if (fmdolder(src, deps[i]))
+ return true;
+ }
+ return false;
+}
+
+static char *
+_getcwd(void)
+{
+ char *buf = NULL;
+ size_t n = 0;
+
+ for (;;) {
+ n += PATH_MAX;
+ buf = bufalloc(buf, n, sizeof(char));
+ if (getcwd(buf, n))
+ break;
+ if (errno != ERANGE)
+ die("getcwd");
+ }
+
+ return buf;
+}
+
+void
+_rebuild(char *src)
+{
+ char *cwd, *cpy1, *cpy2, *dn, *bn;
+ cmd_t cmd = {0};
+
+ cwd = _getcwd();
+ if (!(cpy1 = strdup(*_cbs_argv)))
+ die("strdup");
+ if (!(cpy2 = strdup(*_cbs_argv)))
+ die("strdup");
+ dn = dirname(cpy1);
+ bn = basename(cpy2);
+
+ if (chdir(dn) == -1)
+ die("chdir: %s", dn);
+ if (!foutdated(bn, src)) {
+ if (chdir(cwd) == -1)
+ die("chdir: %s", cwd);
+ free(cpy1);
+ free(cpy2);
+ free(cwd);
+ return;
+ }
+
+ cmdadd(&cmd, "cc");
+#ifdef CBS_PTHREAD
+ cmdadd(&cmd, "-lpthread");
+#endif
+ cmdadd(&cmd, "-o", bn, src);
+ cmdput(cmd);
+ if (cmdexec(cmd))
+ diex("Compilation of build script failed");
+
+ cmdclr(&cmd);
+
+ if (chdir(cwd) == -1)
+ die("chdir: %s", cwd);
+
+ cmdaddv(&cmd, _cbs_argv, _cbs_argc);
+ execvp(*cmd._argv, cmd._argv);
+ die("execvp: %s", *cmd._argv);
+}
+
+int
+nproc(void)
+{
+#ifdef _SC_NPROCESSORS_ONLN
+ return (int)sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ errno = 0;
+ return -1;
+#endif
+}
+
+bool
+pcquery(struct strv *vec, char *lib, int flags)
+{
+ int ec;
+ char *p;
+ size_t n;
+ cmd_t c = {0};
+ wordexp_t we;
+
+ p = NULL;
+
+ cmdadd(&c, "pkg-config");
+ if (flags & PKGC_LIBS)
+ cmdadd(&c, "--libs");
+ if (flags & PKGC_CFLAGS)
+ cmdadd(&c, "--cflags");
+ cmdadd(&c, lib);
+
+ if ((ec = cmdexecb(c, &p, &n))) {
+ if (errno == ENOENT) {
+ free(c._argv);
+ return false;
+ }
+ diex("pkg-config terminated with exit-code %d", ec);
+ }
+
+ if (!p)
+ return true;
+
+ /* Remove trailing newline */
+ p[n - 1] = 0;
+
+ switch (wordexp(p, &we, WRDE_NOCMD)) {
+ case WRDE_BADCHAR:
+ case WRDE_BADVAL:
+ case WRDE_SYNTAX:
+ errno = EINVAL;
+ die("wordexp");
+ case WRDE_NOSPACE:
+ errno = ENOMEM;
+ die("wordexp");
+ }
+
+ vec->buf = bufalloc(vec->buf, vec->len + we.we_wordc, sizeof(char *));
+ for (size_t i = 0; i < we.we_wordc; i++) {
+ char *p = strdup(we.we_wordv[i]);
+ if (!p)
+ die(__func__);
+ vec->buf[vec->len++] = p;
+ }
+
+ wordfree(&we);
+ free(p);
+ return true;
+}
+
+#ifdef CBS_PTHREAD
+
+static void *
+_tpwork(void *arg)
+{
+ tpool_t *tp = arg;
+
+ while (!tp->_stop) {
+ struct _tjob *j;
+
+ pthread_mutex_lock(&tp->_mtx);
+ while (!tp->_stop && !tp->_head)
+ pthread_cond_wait(&tp->_cnd, &tp->_mtx);
+ if (tp->_stop) {
+ pthread_mutex_unlock(&tp->_mtx);
+ break;
+ }
+
+ j = _tpdeq(tp);
+ pthread_mutex_unlock(&tp->_mtx);
+
+ j->fn(j->arg);
+ if (j->free)
+ j->free(j->arg);
+ free(j);
+
+ pthread_mutex_lock(&tp->_mtx);
+ tp->_left--;
+ pthread_cond_broadcast(&tp->_cnd);
+ pthread_mutex_unlock(&tp->_mtx);
+ }
+
+ return NULL;
+}
+
+void
+tpinit(tpool_t *tp, size_t n)
+{
+ tp->_tcnt = n;
+ tp->_stop = false;
+ tp->_left = 0;
+ tp->_head = tp->_tail = NULL;
+ tp->_thrds = bufalloc(NULL, n, sizeof(pthread_t));
+ pthread_cond_init(&tp->_cnd, NULL);
+ pthread_mutex_init(&tp->_mtx, NULL);
+
+ for (size_t i = 0; i < n; i++)
+ pthread_create(tp->_thrds + i, NULL, _tpwork, tp);
+}
+
+void
+tpfree(tpool_t *tp)
+{
+ tp->_stop = true;
+
+ pthread_mutex_lock(&tp->_mtx);
+ pthread_cond_broadcast(&tp->_cnd);
+ pthread_mutex_unlock(&tp->_mtx);
+
+ for (size_t i = 0; i < tp->_tcnt; i++)
+ pthread_join(tp->_thrds[i], NULL);
+
+ free(tp->_thrds);
+ while (tp->_head) {
+ struct _tjob *j = _tpdeq(tp);
+ if (j->free)
+ j->free(j->arg);
+ free(j);
+ }
+
+ pthread_cond_destroy(&tp->_cnd);
+ pthread_mutex_destroy(&tp->_mtx);
+}
+
+struct _tjob *
+_tpdeq(tpool_t *tp)
+{
+ struct _tjob *j = tp->_head;
+
+ if (j) {
+ tp->_head = tp->_head->next;
+ if (!tp->_head)
+ tp->_tail = NULL;
+ }
+
+ return j;
+}
+
+void
+tpenq(tpool_t *tp, tfunc_t fn, void *arg, tfree_func_t free)
+{
+ struct _tjob *j = bufalloc(NULL, 1, sizeof(struct _tjob));
+ *j = (struct _tjob){
+ .fn = fn,
+ .arg = arg,
+ .free = free,
+ };
+
+ pthread_mutex_lock(&tp->_mtx);
+ if (tp->_tail)
+ tp->_tail->next = j;
+ if (!tp->_head)
+ tp->_head = j;
+ tp->_tail = j;
+ tp->_left++;
+ pthread_cond_signal(&tp->_cnd);
+ pthread_mutex_unlock(&tp->_mtx);
+}
+
+void
+tpwait(tpool_t *tp)
+{
+ pthread_mutex_lock(&tp->_mtx);
+ while (!tp->_stop && tp->_left)
+ pthread_cond_wait(&tp->_cnd, &tp->_mtx);
+ pthread_mutex_unlock(&tp->_mtx);
+}
+
+#endif /* CBS_PTHREAD */
+
+#ifdef __GNUC__
+# pragma GCC diagnostic pop
+#endif
+
+#ifdef __APPLE__
+# undef st_mtim
+#endif
+
+#endif /* !C_BUILD_SYSTEM_H */
diff --git a/vendor/librune/data/GraphemeBreakTest.txt b/vendor/librune/data/GraphemeBreakTest.txt
new file mode 100644
index 0000000..aeaa01a
--- /dev/null
+++ b/vendor/librune/data/GraphemeBreakTest.txt
@@ -0,0 +1,1187 @@
+0020÷0020
+0020×0308÷0020
+0020÷000D
+0020×0308÷000D
+0020÷000A
+0020×0308÷000A
+0020÷0001
+0020×0308÷0001
+0020×034F
+0020×0308×034F
+0020÷1F1E6
+0020×0308÷1F1E6
+0020÷0600
+0020×0308÷0600
+0020×0A03
+0020×0308×0A03
+0020÷1100
+0020×0308÷1100
+0020÷1160
+0020×0308÷1160
+0020÷11A8
+0020×0308÷11A8
+0020÷AC00
+0020×0308÷AC00
+0020÷AC01
+0020×0308÷AC01
+0020×0900
+0020×0308×0900
+0020×0903
+0020×0308×0903
+0020÷0904
+0020×0308÷0904
+0020÷0D4E
+0020×0308÷0D4E
+0020÷0915
+0020×0308÷0915
+0020÷231A
+0020×0308÷231A
+0020×0300
+0020×0308×0300
+0020×093C
+0020×0308×093C
+0020×094D
+0020×0308×094D
+0020×200D
+0020×0308×200D
+0020÷0378
+0020×0308÷0378
+000D÷0020
+000D÷0308÷0020
+000D÷000D
+000D÷0308÷000D
+000D×000A
+000D÷0308÷000A
+000D÷0001
+000D÷0308÷0001
+000D÷034F
+000D÷0308×034F
+000D÷1F1E6
+000D÷0308÷1F1E6
+000D÷0600
+000D÷0308÷0600
+000D÷0A03
+000D÷0308×0A03
+000D÷1100
+000D÷0308÷1100
+000D÷1160
+000D÷0308÷1160
+000D÷11A8
+000D÷0308÷11A8
+000D÷AC00
+000D÷0308÷AC00
+000D÷AC01
+000D÷0308÷AC01
+000D÷0900
+000D÷0308×0900
+000D÷0903
+000D÷0308×0903
+000D÷0904
+000D÷0308÷0904
+000D÷0D4E
+000D÷0308÷0D4E
+000D÷0915
+000D÷0308÷0915
+000D÷231A
+000D÷0308÷231A
+000D÷0300
+000D÷0308×0300
+000D÷093C
+000D÷0308×093C
+000D÷094D
+000D÷0308×094D
+000D÷200D
+000D÷0308×200D
+000D÷0378
+000D÷0308÷0378
+000A÷0020
+000A÷0308÷0020
+000A÷000D
+000A÷0308÷000D
+000A÷000A
+000A÷0308÷000A
+000A÷0001
+000A÷0308÷0001
+000A÷034F
+000A÷0308×034F
+000A÷1F1E6
+000A÷0308÷1F1E6
+000A÷0600
+000A÷0308÷0600
+000A÷0A03
+000A÷0308×0A03
+000A÷1100
+000A÷0308÷1100
+000A÷1160
+000A÷0308÷1160
+000A÷11A8
+000A÷0308÷11A8
+000A÷AC00
+000A÷0308÷AC00
+000A÷AC01
+000A÷0308÷AC01
+000A÷0900
+000A÷0308×0900
+000A÷0903
+000A÷0308×0903
+000A÷0904
+000A÷0308÷0904
+000A÷0D4E
+000A÷0308÷0D4E
+000A÷0915
+000A÷0308÷0915
+000A÷231A
+000A÷0308÷231A
+000A÷0300
+000A÷0308×0300
+000A÷093C
+000A÷0308×093C
+000A÷094D
+000A÷0308×094D
+000A÷200D
+000A÷0308×200D
+000A÷0378
+000A÷0308÷0378
+0001÷0020
+0001÷0308÷0020
+0001÷000D
+0001÷0308÷000D
+0001÷000A
+0001÷0308÷000A
+0001÷0001
+0001÷0308÷0001
+0001÷034F
+0001÷0308×034F
+0001÷1F1E6
+0001÷0308÷1F1E6
+0001÷0600
+0001÷0308÷0600
+0001÷0A03
+0001÷0308×0A03
+0001÷1100
+0001÷0308÷1100
+0001÷1160
+0001÷0308÷1160
+0001÷11A8
+0001÷0308÷11A8
+0001÷AC00
+0001÷0308÷AC00
+0001÷AC01
+0001÷0308÷AC01
+0001÷0900
+0001÷0308×0900
+0001÷0903
+0001÷0308×0903
+0001÷0904
+0001÷0308÷0904
+0001÷0D4E
+0001÷0308÷0D4E
+0001÷0915
+0001÷0308÷0915
+0001÷231A
+0001÷0308÷231A
+0001÷0300
+0001÷0308×0300
+0001÷093C
+0001÷0308×093C
+0001÷094D
+0001÷0308×094D
+0001÷200D
+0001÷0308×200D
+0001÷0378
+0001÷0308÷0378
+034F÷0020
+034F×0308÷0020
+034F÷000D
+034F×0308÷000D
+034F÷000A
+034F×0308÷000A
+034F÷0001
+034F×0308÷0001
+034F×034F
+034F×0308×034F
+034F÷1F1E6
+034F×0308÷1F1E6
+034F÷0600
+034F×0308÷0600
+034F×0A03
+034F×0308×0A03
+034F÷1100
+034F×0308÷1100
+034F÷1160
+034F×0308÷1160
+034F÷11A8
+034F×0308÷11A8
+034F÷AC00
+034F×0308÷AC00
+034F÷AC01
+034F×0308÷AC01
+034F×0900
+034F×0308×0900
+034F×0903
+034F×0308×0903
+034F÷0904
+034F×0308÷0904
+034F÷0D4E
+034F×0308÷0D4E
+034F÷0915
+034F×0308÷0915
+034F÷231A
+034F×0308÷231A
+034F×0300
+034F×0308×0300
+034F×093C
+034F×0308×093C
+034F×094D
+034F×0308×094D
+034F×200D
+034F×0308×200D
+034F÷0378
+034F×0308÷0378
+1F1E6÷0020
+1F1E6×0308÷0020
+1F1E6÷000D
+1F1E6×0308÷000D
+1F1E6÷000A
+1F1E6×0308÷000A
+1F1E6÷0001
+1F1E6×0308÷0001
+1F1E6×034F
+1F1E6×0308×034F
+1F1E6×1F1E6
+1F1E6×0308÷1F1E6
+1F1E6÷0600
+1F1E6×0308÷0600
+1F1E6×0A03
+1F1E6×0308×0A03
+1F1E6÷1100
+1F1E6×0308÷1100
+1F1E6÷1160
+1F1E6×0308÷1160
+1F1E6÷11A8
+1F1E6×0308÷11A8
+1F1E6÷AC00
+1F1E6×0308÷AC00
+1F1E6÷AC01
+1F1E6×0308÷AC01
+1F1E6×0900
+1F1E6×0308×0900
+1F1E6×0903
+1F1E6×0308×0903
+1F1E6÷0904
+1F1E6×0308÷0904
+1F1E6÷0D4E
+1F1E6×0308÷0D4E
+1F1E6÷0915
+1F1E6×0308÷0915
+1F1E6÷231A
+1F1E6×0308÷231A
+1F1E6×0300
+1F1E6×0308×0300
+1F1E6×093C
+1F1E6×0308×093C
+1F1E6×094D
+1F1E6×0308×094D
+1F1E6×200D
+1F1E6×0308×200D
+1F1E6÷0378
+1F1E6×0308÷0378
+0600×0020
+0600×0308÷0020
+0600÷000D
+0600×0308÷000D
+0600÷000A
+0600×0308÷000A
+0600÷0001
+0600×0308÷0001
+0600×034F
+0600×0308×034F
+0600×1F1E6
+0600×0308÷1F1E6
+0600×0600
+0600×0308÷0600
+0600×0A03
+0600×0308×0A03
+0600×1100
+0600×0308÷1100
+0600×1160
+0600×0308÷1160
+0600×11A8
+0600×0308÷11A8
+0600×AC00
+0600×0308÷AC00
+0600×AC01
+0600×0308÷AC01
+0600×0900
+0600×0308×0900
+0600×0903
+0600×0308×0903
+0600×0904
+0600×0308÷0904
+0600×0D4E
+0600×0308÷0D4E
+0600×0915
+0600×0308÷0915
+0600×231A
+0600×0308÷231A
+0600×0300
+0600×0308×0300
+0600×093C
+0600×0308×093C
+0600×094D
+0600×0308×094D
+0600×200D
+0600×0308×200D
+0600×0378
+0600×0308÷0378
+0A03÷0020
+0A03×0308÷0020
+0A03÷000D
+0A03×0308÷000D
+0A03÷000A
+0A03×0308÷000A
+0A03÷0001
+0A03×0308÷0001
+0A03×034F
+0A03×0308×034F
+0A03÷1F1E6
+0A03×0308÷1F1E6
+0A03÷0600
+0A03×0308÷0600
+0A03×0A03
+0A03×0308×0A03
+0A03÷1100
+0A03×0308÷1100
+0A03÷1160
+0A03×0308÷1160
+0A03÷11A8
+0A03×0308÷11A8
+0A03÷AC00
+0A03×0308÷AC00
+0A03÷AC01
+0A03×0308÷AC01
+0A03×0900
+0A03×0308×0900
+0A03×0903
+0A03×0308×0903
+0A03÷0904
+0A03×0308÷0904
+0A03÷0D4E
+0A03×0308÷0D4E
+0A03÷0915
+0A03×0308÷0915
+0A03÷231A
+0A03×0308÷231A
+0A03×0300
+0A03×0308×0300
+0A03×093C
+0A03×0308×093C
+0A03×094D
+0A03×0308×094D
+0A03×200D
+0A03×0308×200D
+0A03÷0378
+0A03×0308÷0378
+1100÷0020
+1100×0308÷0020
+1100÷000D
+1100×0308÷000D
+1100÷000A
+1100×0308÷000A
+1100÷0001
+1100×0308÷0001
+1100×034F
+1100×0308×034F
+1100÷1F1E6
+1100×0308÷1F1E6
+1100÷0600
+1100×0308÷0600
+1100×0A03
+1100×0308×0A03
+1100×1100
+1100×0308÷1100
+1100×1160
+1100×0308÷1160
+1100÷11A8
+1100×0308÷11A8
+1100×AC00
+1100×0308÷AC00
+1100×AC01
+1100×0308÷AC01
+1100×0900
+1100×0308×0900
+1100×0903
+1100×0308×0903
+1100÷0904
+1100×0308÷0904
+1100÷0D4E
+1100×0308÷0D4E
+1100÷0915
+1100×0308÷0915
+1100÷231A
+1100×0308÷231A
+1100×0300
+1100×0308×0300
+1100×093C
+1100×0308×093C
+1100×094D
+1100×0308×094D
+1100×200D
+1100×0308×200D
+1100÷0378
+1100×0308÷0378
+1160÷0020
+1160×0308÷0020
+1160÷000D
+1160×0308÷000D
+1160÷000A
+1160×0308÷000A
+1160÷0001
+1160×0308÷0001
+1160×034F
+1160×0308×034F
+1160÷1F1E6
+1160×0308÷1F1E6
+1160÷0600
+1160×0308÷0600
+1160×0A03
+1160×0308×0A03
+1160÷1100
+1160×0308÷1100
+1160×1160
+1160×0308÷1160
+1160×11A8
+1160×0308÷11A8
+1160÷AC00
+1160×0308÷AC00
+1160÷AC01
+1160×0308÷AC01
+1160×0900
+1160×0308×0900
+1160×0903
+1160×0308×0903
+1160÷0904
+1160×0308÷0904
+1160÷0D4E
+1160×0308÷0D4E
+1160÷0915
+1160×0308÷0915
+1160÷231A
+1160×0308÷231A
+1160×0300
+1160×0308×0300
+1160×093C
+1160×0308×093C
+1160×094D
+1160×0308×094D
+1160×200D
+1160×0308×200D
+1160÷0378
+1160×0308÷0378
+11A8÷0020
+11A8×0308÷0020
+11A8÷000D
+11A8×0308÷000D
+11A8÷000A
+11A8×0308÷000A
+11A8÷0001
+11A8×0308÷0001
+11A8×034F
+11A8×0308×034F
+11A8÷1F1E6
+11A8×0308÷1F1E6
+11A8÷0600
+11A8×0308÷0600
+11A8×0A03
+11A8×0308×0A03
+11A8÷1100
+11A8×0308÷1100
+11A8÷1160
+11A8×0308÷1160
+11A8×11A8
+11A8×0308÷11A8
+11A8÷AC00
+11A8×0308÷AC00
+11A8÷AC01
+11A8×0308÷AC01
+11A8×0900
+11A8×0308×0900
+11A8×0903
+11A8×0308×0903
+11A8÷0904
+11A8×0308÷0904
+11A8÷0D4E
+11A8×0308÷0D4E
+11A8÷0915
+11A8×0308÷0915
+11A8÷231A
+11A8×0308÷231A
+11A8×0300
+11A8×0308×0300
+11A8×093C
+11A8×0308×093C
+11A8×094D
+11A8×0308×094D
+11A8×200D
+11A8×0308×200D
+11A8÷0378
+11A8×0308÷0378
+AC00÷0020
+AC00×0308÷0020
+AC00÷000D
+AC00×0308÷000D
+AC00÷000A
+AC00×0308÷000A
+AC00÷0001
+AC00×0308÷0001
+AC00×034F
+AC00×0308×034F
+AC00÷1F1E6
+AC00×0308÷1F1E6
+AC00÷0600
+AC00×0308÷0600
+AC00×0A03
+AC00×0308×0A03
+AC00÷1100
+AC00×0308÷1100
+AC00×1160
+AC00×0308÷1160
+AC00×11A8
+AC00×0308÷11A8
+AC00÷AC00
+AC00×0308÷AC00
+AC00÷AC01
+AC00×0308÷AC01
+AC00×0900
+AC00×0308×0900
+AC00×0903
+AC00×0308×0903
+AC00÷0904
+AC00×0308÷0904
+AC00÷0D4E
+AC00×0308÷0D4E
+AC00÷0915
+AC00×0308÷0915
+AC00÷231A
+AC00×0308÷231A
+AC00×0300
+AC00×0308×0300
+AC00×093C
+AC00×0308×093C
+AC00×094D
+AC00×0308×094D
+AC00×200D
+AC00×0308×200D
+AC00÷0378
+AC00×0308÷0378
+AC01÷0020
+AC01×0308÷0020
+AC01÷000D
+AC01×0308÷000D
+AC01÷000A
+AC01×0308÷000A
+AC01÷0001
+AC01×0308÷0001
+AC01×034F
+AC01×0308×034F
+AC01÷1F1E6
+AC01×0308÷1F1E6
+AC01÷0600
+AC01×0308÷0600
+AC01×0A03
+AC01×0308×0A03
+AC01÷1100
+AC01×0308÷1100
+AC01÷1160
+AC01×0308÷1160
+AC01×11A8
+AC01×0308÷11A8
+AC01÷AC00
+AC01×0308÷AC00
+AC01÷AC01
+AC01×0308÷AC01
+AC01×0900
+AC01×0308×0900
+AC01×0903
+AC01×0308×0903
+AC01÷0904
+AC01×0308÷0904
+AC01÷0D4E
+AC01×0308÷0D4E
+AC01÷0915
+AC01×0308÷0915
+AC01÷231A
+AC01×0308÷231A
+AC01×0300
+AC01×0308×0300
+AC01×093C
+AC01×0308×093C
+AC01×094D
+AC01×0308×094D
+AC01×200D
+AC01×0308×200D
+AC01÷0378
+AC01×0308÷0378
+0900÷0020
+0900×0308÷0020
+0900÷000D
+0900×0308÷000D
+0900÷000A
+0900×0308÷000A
+0900÷0001
+0900×0308÷0001
+0900×034F
+0900×0308×034F
+0900÷1F1E6
+0900×0308÷1F1E6
+0900÷0600
+0900×0308÷0600
+0900×0A03
+0900×0308×0A03
+0900÷1100
+0900×0308÷1100
+0900÷1160
+0900×0308÷1160
+0900÷11A8
+0900×0308÷11A8
+0900÷AC00
+0900×0308÷AC00
+0900÷AC01
+0900×0308÷AC01
+0900×0900
+0900×0308×0900
+0900×0903
+0900×0308×0903
+0900÷0904
+0900×0308÷0904
+0900÷0D4E
+0900×0308÷0D4E
+0900÷0915
+0900×0308÷0915
+0900÷231A
+0900×0308÷231A
+0900×0300
+0900×0308×0300
+0900×093C
+0900×0308×093C
+0900×094D
+0900×0308×094D
+0900×200D
+0900×0308×200D
+0900÷0378
+0900×0308÷0378
+0903÷0020
+0903×0308÷0020
+0903÷000D
+0903×0308÷000D
+0903÷000A
+0903×0308÷000A
+0903÷0001
+0903×0308÷0001
+0903×034F
+0903×0308×034F
+0903÷1F1E6
+0903×0308÷1F1E6
+0903÷0600
+0903×0308÷0600
+0903×0A03
+0903×0308×0A03
+0903÷1100
+0903×0308÷1100
+0903÷1160
+0903×0308÷1160
+0903÷11A8
+0903×0308÷11A8
+0903÷AC00
+0903×0308÷AC00
+0903÷AC01
+0903×0308÷AC01
+0903×0900
+0903×0308×0900
+0903×0903
+0903×0308×0903
+0903÷0904
+0903×0308÷0904
+0903÷0D4E
+0903×0308÷0D4E
+0903÷0915
+0903×0308÷0915
+0903÷231A
+0903×0308÷231A
+0903×0300
+0903×0308×0300
+0903×093C
+0903×0308×093C
+0903×094D
+0903×0308×094D
+0903×200D
+0903×0308×200D
+0903÷0378
+0903×0308÷0378
+0904÷0020
+0904×0308÷0020
+0904÷000D
+0904×0308÷000D
+0904÷000A
+0904×0308÷000A
+0904÷0001
+0904×0308÷0001
+0904×034F
+0904×0308×034F
+0904÷1F1E6
+0904×0308÷1F1E6
+0904÷0600
+0904×0308÷0600
+0904×0A03
+0904×0308×0A03
+0904÷1100
+0904×0308÷1100
+0904÷1160
+0904×0308÷1160
+0904÷11A8
+0904×0308÷11A8
+0904÷AC00
+0904×0308÷AC00
+0904÷AC01
+0904×0308÷AC01
+0904×0900
+0904×0308×0900
+0904×0903
+0904×0308×0903
+0904÷0904
+0904×0308÷0904
+0904÷0D4E
+0904×0308÷0D4E
+0904÷0915
+0904×0308÷0915
+0904÷231A
+0904×0308÷231A
+0904×0300
+0904×0308×0300
+0904×093C
+0904×0308×093C
+0904×094D
+0904×0308×094D
+0904×200D
+0904×0308×200D
+0904÷0378
+0904×0308÷0378
+0D4E×0020
+0D4E×0308÷0020
+0D4E÷000D
+0D4E×0308÷000D
+0D4E÷000A
+0D4E×0308÷000A
+0D4E÷0001
+0D4E×0308÷0001
+0D4E×034F
+0D4E×0308×034F
+0D4E×1F1E6
+0D4E×0308÷1F1E6
+0D4E×0600
+0D4E×0308÷0600
+0D4E×0A03
+0D4E×0308×0A03
+0D4E×1100
+0D4E×0308÷1100
+0D4E×1160
+0D4E×0308÷1160
+0D4E×11A8
+0D4E×0308÷11A8
+0D4E×AC00
+0D4E×0308÷AC00
+0D4E×AC01
+0D4E×0308÷AC01
+0D4E×0900
+0D4E×0308×0900
+0D4E×0903
+0D4E×0308×0903
+0D4E×0904
+0D4E×0308÷0904
+0D4E×0D4E
+0D4E×0308÷0D4E
+0D4E×0915
+0D4E×0308÷0915
+0D4E×231A
+0D4E×0308÷231A
+0D4E×0300
+0D4E×0308×0300
+0D4E×093C
+0D4E×0308×093C
+0D4E×094D
+0D4E×0308×094D
+0D4E×200D
+0D4E×0308×200D
+0D4E×0378
+0D4E×0308÷0378
+0915÷0020
+0915×0308÷0020
+0915÷000D
+0915×0308÷000D
+0915÷000A
+0915×0308÷000A
+0915÷0001
+0915×0308÷0001
+0915×034F
+0915×0308×034F
+0915÷1F1E6
+0915×0308÷1F1E6
+0915÷0600
+0915×0308÷0600
+0915×0A03
+0915×0308×0A03
+0915÷1100
+0915×0308÷1100
+0915÷1160
+0915×0308÷1160
+0915÷11A8
+0915×0308÷11A8
+0915÷AC00
+0915×0308÷AC00
+0915÷AC01
+0915×0308÷AC01
+0915×0900
+0915×0308×0900
+0915×0903
+0915×0308×0903
+0915÷0904
+0915×0308÷0904
+0915÷0D4E
+0915×0308÷0D4E
+0915÷0915
+0915×0308÷0915
+0915÷231A
+0915×0308÷231A
+0915×0300
+0915×0308×0300
+0915×093C
+0915×0308×093C
+0915×094D
+0915×0308×094D
+0915×200D
+0915×0308×200D
+0915÷0378
+0915×0308÷0378
+231A÷0020
+231A×0308÷0020
+231A÷000D
+231A×0308÷000D
+231A÷000A
+231A×0308÷000A
+231A÷0001
+231A×0308÷0001
+231A×034F
+231A×0308×034F
+231A÷1F1E6
+231A×0308÷1F1E6
+231A÷0600
+231A×0308÷0600
+231A×0A03
+231A×0308×0A03
+231A÷1100
+231A×0308÷1100
+231A÷1160
+231A×0308÷1160
+231A÷11A8
+231A×0308÷11A8
+231A÷AC00
+231A×0308÷AC00
+231A÷AC01
+231A×0308÷AC01
+231A×0900
+231A×0308×0900
+231A×0903
+231A×0308×0903
+231A÷0904
+231A×0308÷0904
+231A÷0D4E
+231A×0308÷0D4E
+231A÷0915
+231A×0308÷0915
+231A÷231A
+231A×0308÷231A
+231A×0300
+231A×0308×0300
+231A×093C
+231A×0308×093C
+231A×094D
+231A×0308×094D
+231A×200D
+231A×0308×200D
+231A÷0378
+231A×0308÷0378
+0300÷0020
+0300×0308÷0020
+0300÷000D
+0300×0308÷000D
+0300÷000A
+0300×0308÷000A
+0300÷0001
+0300×0308÷0001
+0300×034F
+0300×0308×034F
+0300÷1F1E6
+0300×0308÷1F1E6
+0300÷0600
+0300×0308÷0600
+0300×0A03
+0300×0308×0A03
+0300÷1100
+0300×0308÷1100
+0300÷1160
+0300×0308÷1160
+0300÷11A8
+0300×0308÷11A8
+0300÷AC00
+0300×0308÷AC00
+0300÷AC01
+0300×0308÷AC01
+0300×0900
+0300×0308×0900
+0300×0903
+0300×0308×0903
+0300÷0904
+0300×0308÷0904
+0300÷0D4E
+0300×0308÷0D4E
+0300÷0915
+0300×0308÷0915
+0300÷231A
+0300×0308÷231A
+0300×0300
+0300×0308×0300
+0300×093C
+0300×0308×093C
+0300×094D
+0300×0308×094D
+0300×200D
+0300×0308×200D
+0300÷0378
+0300×0308÷0378
+093C÷0020
+093C×0308÷0020
+093C÷000D
+093C×0308÷000D
+093C÷000A
+093C×0308÷000A
+093C÷0001
+093C×0308÷0001
+093C×034F
+093C×0308×034F
+093C÷1F1E6
+093C×0308÷1F1E6
+093C÷0600
+093C×0308÷0600
+093C×0A03
+093C×0308×0A03
+093C÷1100
+093C×0308÷1100
+093C÷1160
+093C×0308÷1160
+093C÷11A8
+093C×0308÷11A8
+093C÷AC00
+093C×0308÷AC00
+093C÷AC01
+093C×0308÷AC01
+093C×0900
+093C×0308×0900
+093C×0903
+093C×0308×0903
+093C÷0904
+093C×0308÷0904
+093C÷0D4E
+093C×0308÷0D4E
+093C÷0915
+093C×0308÷0915
+093C÷231A
+093C×0308÷231A
+093C×0300
+093C×0308×0300
+093C×093C
+093C×0308×093C
+093C×094D
+093C×0308×094D
+093C×200D
+093C×0308×200D
+093C÷0378
+093C×0308÷0378
+094D÷0020
+094D×0308÷0020
+094D÷000D
+094D×0308÷000D
+094D÷000A
+094D×0308÷000A
+094D÷0001
+094D×0308÷0001
+094D×034F
+094D×0308×034F
+094D÷1F1E6
+094D×0308÷1F1E6
+094D÷0600
+094D×0308÷0600
+094D×0A03
+094D×0308×0A03
+094D÷1100
+094D×0308÷1100
+094D÷1160
+094D×0308÷1160
+094D÷11A8
+094D×0308÷11A8
+094D÷AC00
+094D×0308÷AC00
+094D÷AC01
+094D×0308÷AC01
+094D×0900
+094D×0308×0900
+094D×0903
+094D×0308×0903
+094D÷0904
+094D×0308÷0904
+094D÷0D4E
+094D×0308÷0D4E
+094D÷0915
+094D×0308÷0915
+094D÷231A
+094D×0308÷231A
+094D×0300
+094D×0308×0300
+094D×093C
+094D×0308×093C
+094D×094D
+094D×0308×094D
+094D×200D
+094D×0308×200D
+094D÷0378
+094D×0308÷0378
+200D÷0020
+200D×0308÷0020
+200D÷000D
+200D×0308÷000D
+200D÷000A
+200D×0308÷000A
+200D÷0001
+200D×0308÷0001
+200D×034F
+200D×0308×034F
+200D÷1F1E6
+200D×0308÷1F1E6
+200D÷0600
+200D×0308÷0600
+200D×0A03
+200D×0308×0A03
+200D÷1100
+200D×0308÷1100
+200D÷1160
+200D×0308÷1160
+200D÷11A8
+200D×0308÷11A8
+200D÷AC00
+200D×0308÷AC00
+200D÷AC01
+200D×0308÷AC01
+200D×0900
+200D×0308×0900
+200D×0903
+200D×0308×0903
+200D÷0904
+200D×0308÷0904
+200D÷0D4E
+200D×0308÷0D4E
+200D÷0915
+200D×0308÷0915
+200D÷231A
+200D×0308÷231A
+200D×0300
+200D×0308×0300
+200D×093C
+200D×0308×093C
+200D×094D
+200D×0308×094D
+200D×200D
+200D×0308×200D
+200D÷0378
+200D×0308÷0378
+0378÷0020
+0378×0308÷0020
+0378÷000D
+0378×0308÷000D
+0378÷000A
+0378×0308÷000A
+0378÷0001
+0378×0308÷0001
+0378×034F
+0378×0308×034F
+0378÷1F1E6
+0378×0308÷1F1E6
+0378÷0600
+0378×0308÷0600
+0378×0A03
+0378×0308×0A03
+0378÷1100
+0378×0308÷1100
+0378÷1160
+0378×0308÷1160
+0378÷11A8
+0378×0308÷11A8
+0378÷AC00
+0378×0308÷AC00
+0378÷AC01
+0378×0308÷AC01
+0378×0900
+0378×0308×0900
+0378×0903
+0378×0308×0903
+0378÷0904
+0378×0308÷0904
+0378÷0D4E
+0378×0308÷0D4E
+0378÷0915
+0378×0308÷0915
+0378÷231A
+0378×0308÷231A
+0378×0300
+0378×0308×0300
+0378×093C
+0378×0308×093C
+0378×094D
+0378×0308×094D
+0378×200D
+0378×0308×200D
+0378÷0378
+0378×0308÷0378
+000D×000A÷0061÷000A÷0308
+0061×0308
+0020×200D÷0646
+0646×200D÷0020
+1100×1100
+AC00×11A8÷1100
+AC01×11A8÷1100
+1F1E6×1F1E7÷1F1E8÷0062
+0061÷1F1E6×1F1E7÷1F1E8÷0062
+0061÷1F1E6×1F1E7×200D÷1F1E8÷0062
+0061÷1F1E6×200D÷1F1E7×1F1E8÷0062
+0061÷1F1E6×1F1E7÷1F1E8×1F1E9÷0062
+0061×200D
+0061×0308÷0062
+0061×0903÷0062
+0061÷0600×0062
+1F476×1F3FF÷1F476
+0061×1F3FF÷1F476
+0061×1F3FF÷1F476×200D×1F6D1
+1F476×1F3FF×0308×200D×1F476×1F3FF
+1F6D1×200D×1F6D1
+0061×200D÷1F6D1
+2701×200D×2701
+0061×200D÷2701
+0915÷0924
+0915×094D×0924
+0915×094D×094D×0924
+0915×094D×200D×0924
+0915×093C×200D×094D×0924
+0915×093C×094D×200D×0924
+0915×094D×0924×094D×092F
+0915×094D÷0061
+0061×094D÷0924
+003F×094D÷0924
+0915×094D×094D×0924
diff --git a/vendor/librune/data/emoji-data.txt b/vendor/librune/data/emoji-data.txt
new file mode 100644
index 0000000..0ba10e9
--- /dev/null
+++ b/vendor/librune/data/emoji-data.txt
@@ -0,0 +1,1320 @@
+# emoji-data.txt
+# Date: 2023-02-01, 02:22:54 GMT
+# © 2023 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
+#
+# Emoji Data for UTS #51
+# Used with Emoji Version 15.1 and subsequent minor revisions (if any)
+#
+# For documentation and usage, see https://www.unicode.org/reports/tr51
+#
+# Format:
+# <codepoint(s)> ; <property> # <comments>
+# Note: there is no guarantee as to the structure of whitespace or comments
+#
+# Characters and sequences are listed in code point order. Users should be shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+
+# ================================================
+
+# All omitted code points have Emoji=No
+
+0023 ; Emoji # E0.0 [1] (#️) hash sign
+002A ; Emoji # E0.0 [1] (*️) asterisk
+0030..0039 ; Emoji # E0.0 [10] (0️..9️) digit zero..digit nine
+00A9 ; Emoji # E0.6 [1] (©️) copyright
+00AE ; Emoji # E0.6 [1] (®️) registered
+203C ; Emoji # E0.6 [1] (‼️) double exclamation mark
+2049 ; Emoji # E0.6 [1] (⁉️) exclamation question mark
+2122 ; Emoji # E0.6 [1] (™️) trade mark
+2139 ; Emoji # E0.6 [1] (ℹ️) information
+2194..2199 ; Emoji # E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow
+21A9..21AA ; Emoji # E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right
+231A..231B ; Emoji # E0.6 [2] (⌚..⌛) watch..hourglass done
+2328 ; Emoji # E1.0 [1] (⌨️) keyboard
+23CF ; Emoji # E1.0 [1] (⏏️) eject button
+23E9..23EC ; Emoji # E0.6 [4] (⏩..⏬) fast-forward button..fast down button
+23ED..23EE ; Emoji # E0.7 [2] (⏭️..⏮️) next track button..last track button
+23EF ; Emoji # E1.0 [1] (⏯️) play or pause button
+23F0 ; Emoji # E0.6 [1] (⏰) alarm clock
+23F1..23F2 ; Emoji # E1.0 [2] (⏱️..⏲️) stopwatch..timer clock
+23F3 ; Emoji # E0.6 [1] (⏳) hourglass not done
+23F8..23FA ; Emoji # E0.7 [3] (⏸️..⏺️) pause button..record button
+24C2 ; Emoji # E0.6 [1] (Ⓜ️) circled M
+25AA..25AB ; Emoji # E0.6 [2] (▪️..▫️) black small square..white small square
+25B6 ; Emoji # E0.6 [1] (▶️) play button
+25C0 ; Emoji # E0.6 [1] (◀️) reverse button
+25FB..25FE ; Emoji # E0.6 [4] (◻️..◾) white medium square..black medium-small square
+2600..2601 ; Emoji # E0.6 [2] (☀️..☁️) sun..cloud
+2602..2603 ; Emoji # E0.7 [2] (☂️..☃️) umbrella..snowman
+2604 ; Emoji # E1.0 [1] (☄️) comet
+260E ; Emoji # E0.6 [1] (☎️) telephone
+2611 ; Emoji # E0.6 [1] (☑️) check box with check
+2614..2615 ; Emoji # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage
+2618 ; Emoji # E1.0 [1] (☘️) shamrock
+261D ; Emoji # E0.6 [1] (☝️) index pointing up
+2620 ; Emoji # E1.0 [1] (☠️) skull and crossbones
+2622..2623 ; Emoji # E1.0 [2] (☢️..☣️) radioactive..biohazard
+2626 ; Emoji # E1.0 [1] (☦️) orthodox cross
+262A ; Emoji # E0.7 [1] (☪️) star and crescent
+262E ; Emoji # E1.0 [1] (☮️) peace symbol
+262F ; Emoji # E0.7 [1] (☯️) yin yang
+2638..2639 ; Emoji # E0.7 [2] (☸️..☹️) wheel of dharma..frowning face
+263A ; Emoji # E0.6 [1] (☺️) smiling face
+2640 ; Emoji # E4.0 [1] (♀️) female sign
+2642 ; Emoji # E4.0 [1] (♂️) male sign
+2648..2653 ; Emoji # E0.6 [12] (♈..♓) Aries..Pisces
+265F ; Emoji # E11.0 [1] (♟️) chess pawn
+2660 ; Emoji # E0.6 [1] (♠️) spade suit
+2663 ; Emoji # E0.6 [1] (♣️) club suit
+2665..2666 ; Emoji # E0.6 [2] (♥️..♦️) heart suit..diamond suit
+2668 ; Emoji # E0.6 [1] (♨️) hot springs
+267B ; Emoji # E0.6 [1] (♻️) recycling symbol
+267E ; Emoji # E11.0 [1] (♾️) infinity
+267F ; Emoji # E0.6 [1] (♿) wheelchair symbol
+2692 ; Emoji # E1.0 [1] (⚒️) hammer and pick
+2693 ; Emoji # E0.6 [1] (⚓) anchor
+2694 ; Emoji # E1.0 [1] (⚔️) crossed swords
+2695 ; Emoji # E4.0 [1] (⚕️) medical symbol
+2696..2697 ; Emoji # E1.0 [2] (⚖️..⚗️) balance scale..alembic
+2699 ; Emoji # E1.0 [1] (⚙️) gear
+269B..269C ; Emoji # E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis
+26A0..26A1 ; Emoji # E0.6 [2] (⚠️..⚡) warning..high voltage
+26A7 ; Emoji # E13.0 [1] (⚧️) transgender symbol
+26AA..26AB ; Emoji # E0.6 [2] (⚪..⚫) white circle..black circle
+26B0..26B1 ; Emoji # E1.0 [2] (⚰️..⚱️) coffin..funeral urn
+26BD..26BE ; Emoji # E0.6 [2] (⚽..⚾) soccer ball..baseball
+26C4..26C5 ; Emoji # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud
+26C8 ; Emoji # E0.7 [1] (⛈️) cloud with lightning and rain
+26CE ; Emoji # E0.6 [1] (⛎) Ophiuchus
+26CF ; Emoji # E0.7 [1] (⛏️) pick
+26D1 ; Emoji # E0.7 [1] (⛑️) rescue worker’s helmet
+26D3 ; Emoji # E0.7 [1] (⛓️) chains
+26D4 ; Emoji # E0.6 [1] (⛔) no entry
+26E9 ; Emoji # E0.7 [1] (⛩️) shinto shrine
+26EA ; Emoji # E0.6 [1] (⛪) church
+26F0..26F1 ; Emoji # E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground
+26F2..26F3 ; Emoji # E0.6 [2] (⛲..⛳) fountain..flag in hole
+26F4 ; Emoji # E0.7 [1] (⛴️) ferry
+26F5 ; Emoji # E0.6 [1] (⛵) sailboat
+26F7..26F9 ; Emoji # E0.7 [3] (⛷️..⛹️) skier..person bouncing ball
+26FA ; Emoji # E0.6 [1] (⛺) tent
+26FD ; Emoji # E0.6 [1] (⛽) fuel pump
+2702 ; Emoji # E0.6 [1] (✂️) scissors
+2705 ; Emoji # E0.6 [1] (✅) check mark button
+2708..270C ; Emoji # E0.6 [5] (✈️..✌️) airplane..victory hand
+270D ; Emoji # E0.7 [1] (✍️) writing hand
+270F ; Emoji # E0.6 [1] (✏️) pencil
+2712 ; Emoji # E0.6 [1] (✒️) black nib
+2714 ; Emoji # E0.6 [1] (✔️) check mark
+2716 ; Emoji # E0.6 [1] (✖️) multiply
+271D ; Emoji # E0.7 [1] (✝️) latin cross
+2721 ; Emoji # E0.7 [1] (✡️) star of David
+2728 ; Emoji # E0.6 [1] (✨) sparkles
+2733..2734 ; Emoji # E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star
+2744 ; Emoji # E0.6 [1] (❄️) snowflake
+2747 ; Emoji # E0.6 [1] (❇️) sparkle
+274C ; Emoji # E0.6 [1] (❌) cross mark
+274E ; Emoji # E0.6 [1] (❎) cross mark button
+2753..2755 ; Emoji # E0.6 [3] (❓..❕) red question mark..white exclamation mark
+2757 ; Emoji # E0.6 [1] (❗) red exclamation mark
+2763 ; Emoji # E1.0 [1] (❣️) heart exclamation
+2764 ; Emoji # E0.6 [1] (❤️) red heart
+2795..2797 ; Emoji # E0.6 [3] (➕..➗) plus..divide
+27A1 ; Emoji # E0.6 [1] (➡️) right arrow
+27B0 ; Emoji # E0.6 [1] (➰) curly loop
+27BF ; Emoji # E1.0 [1] (➿) double curly loop
+2934..2935 ; Emoji # E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down
+2B05..2B07 ; Emoji # E0.6 [3] (⬅️..⬇️) left arrow..down arrow
+2B1B..2B1C ; Emoji # E0.6 [2] (⬛..⬜) black large square..white large square
+2B50 ; Emoji # E0.6 [1] (⭐) star
+2B55 ; Emoji # E0.6 [1] (⭕) hollow red circle
+3030 ; Emoji # E0.6 [1] (〰️) wavy dash
+303D ; Emoji # E0.6 [1] (〽️) part alternation mark
+3297 ; Emoji # E0.6 [1] (㊗️) Japanese “congratulations” button
+3299 ; Emoji # E0.6 [1] (㊙️) Japanese “secret” button
+1F004 ; Emoji # E0.6 [1] (🀄) mahjong red dragon
+1F0CF ; Emoji # E0.6 [1] (🃏) joker
+1F170..1F171 ; Emoji # E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type)
+1F17E..1F17F ; Emoji # E0.6 [2] (🅾️..🅿️) O button (blood type)..P button
+1F18E ; Emoji # E0.6 [1] (🆎) AB button (blood type)
+1F191..1F19A ; Emoji # E0.6 [10] (🆑..🆚) CL button..VS button
+1F1E6..1F1FF ; Emoji # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
+1F201..1F202 ; Emoji # E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button
+1F21A ; Emoji # E0.6 [1] (🈚) Japanese “free of charge” button
+1F22F ; Emoji # E0.6 [1] (🈯) Japanese “reserved” button
+1F232..1F23A ; Emoji # E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button
+1F250..1F251 ; Emoji # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
+1F300..1F30C ; Emoji # E0.6 [13] (🌀..🌌) cyclone..milky way
+1F30D..1F30E ; Emoji # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas
+1F30F ; Emoji # E0.6 [1] (🌏) globe showing Asia-Australia
+1F310 ; Emoji # E1.0 [1] (🌐) globe with meridians
+1F311 ; Emoji # E0.6 [1] (🌑) new moon
+1F312 ; Emoji # E1.0 [1] (🌒) waxing crescent moon
+1F313..1F315 ; Emoji # E0.6 [3] (🌓..🌕) first quarter moon..full moon
+1F316..1F318 ; Emoji # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon
+1F319 ; Emoji # E0.6 [1] (🌙) crescent moon
+1F31A ; Emoji # E1.0 [1] (🌚) new moon face
+1F31B ; Emoji # E0.6 [1] (🌛) first quarter moon face
+1F31C ; Emoji # E0.7 [1] (🌜) last quarter moon face
+1F31D..1F31E ; Emoji # E1.0 [2] (🌝..🌞) full moon face..sun with face
+1F31F..1F320 ; Emoji # E0.6 [2] (🌟..🌠) glowing star..shooting star
+1F321 ; Emoji # E0.7 [1] (🌡️) thermometer
+1F324..1F32C ; Emoji # E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face
+1F32D..1F32F ; Emoji # E1.0 [3] (🌭..🌯) hot dog..burrito
+1F330..1F331 ; Emoji # E0.6 [2] (🌰..🌱) chestnut..seedling
+1F332..1F333 ; Emoji # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree
+1F334..1F335 ; Emoji # E0.6 [2] (🌴..🌵) palm tree..cactus
+1F336 ; Emoji # E0.7 [1] (🌶️) hot pepper
+1F337..1F34A ; Emoji # E0.6 [20] (🌷..🍊) tulip..tangerine
+1F34B ; Emoji # E1.0 [1] (🍋) lemon
+1F34C..1F34F ; Emoji # E0.6 [4] (🍌..🍏) banana..green apple
+1F350 ; Emoji # E1.0 [1] (🍐) pear
+1F351..1F37B ; Emoji # E0.6 [43] (🍑..🍻) peach..clinking beer mugs
+1F37C ; Emoji # E1.0 [1] (🍼) baby bottle
+1F37D ; Emoji # E0.7 [1] (🍽️) fork and knife with plate
+1F37E..1F37F ; Emoji # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji # E0.6 [20] (🎀..🎓) ribbon..graduation cap
+1F396..1F397 ; Emoji # E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon
+1F399..1F39B ; Emoji # E0.7 [3] (🎙️..🎛️) studio microphone..control knobs
+1F39E..1F39F ; Emoji # E0.7 [2] (🎞️..🎟️) film frames..admission tickets
+1F3A0..1F3C4 ; Emoji # E0.6 [37] (🎠..🏄) carousel horse..person surfing
+1F3C5 ; Emoji # E1.0 [1] (🏅) sports medal
+1F3C6 ; Emoji # E0.6 [1] (🏆) trophy
+1F3C7 ; Emoji # E1.0 [1] (🏇) horse racing
+1F3C8 ; Emoji # E0.6 [1] (🏈) american football
+1F3C9 ; Emoji # E1.0 [1] (🏉) rugby football
+1F3CA ; Emoji # E0.6 [1] (🏊) person swimming
+1F3CB..1F3CE ; Emoji # E0.7 [4] (🏋️..🏎️) person lifting weights..racing car
+1F3CF..1F3D3 ; Emoji # E1.0 [5] (🏏..🏓) cricket game..ping pong
+1F3D4..1F3DF ; Emoji # E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium
+1F3E0..1F3E3 ; Emoji # E0.6 [4] (🏠..🏣) house..Japanese post office
+1F3E4 ; Emoji # E1.0 [1] (🏤) post office
+1F3E5..1F3F0 ; Emoji # E0.6 [12] (🏥..🏰) hospital..castle
+1F3F3 ; Emoji # E0.7 [1] (🏳️) white flag
+1F3F4 ; Emoji # E1.0 [1] (🏴) black flag
+1F3F5 ; Emoji # E0.7 [1] (🏵️) rosette
+1F3F7 ; Emoji # E0.7 [1] (🏷️) label
+1F3F8..1F407 ; Emoji # E1.0 [16] (🏸..🐇) badminton..rabbit
+1F408 ; Emoji # E0.7 [1] (🐈) cat
+1F409..1F40B ; Emoji # E1.0 [3] (🐉..🐋) dragon..whale
+1F40C..1F40E ; Emoji # E0.6 [3] (🐌..🐎) snail..horse
+1F40F..1F410 ; Emoji # E1.0 [2] (🐏..🐐) ram..goat
+1F411..1F412 ; Emoji # E0.6 [2] (🐑..🐒) ewe..monkey
+1F413 ; Emoji # E1.0 [1] (🐓) rooster
+1F414 ; Emoji # E0.6 [1] (🐔) chicken
+1F415 ; Emoji # E0.7 [1] (🐕) dog
+1F416 ; Emoji # E1.0 [1] (🐖) pig
+1F417..1F429 ; Emoji # E0.6 [19] (🐗..🐩) boar..poodle
+1F42A ; Emoji # E1.0 [1] (🐪) camel
+1F42B..1F43E ; Emoji # E0.6 [20] (🐫..🐾) two-hump camel..paw prints
+1F43F ; Emoji # E0.7 [1] (🐿️) chipmunk
+1F440 ; Emoji # E0.6 [1] (👀) eyes
+1F441 ; Emoji # E0.7 [1] (👁️) eye
+1F442..1F464 ; Emoji # E0.6 [35] (👂..👤) ear..bust in silhouette
+1F465 ; Emoji # E1.0 [1] (👥) busts in silhouette
+1F466..1F46B ; Emoji # E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Emoji # E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F4AC ; Emoji # E0.6 [63] (👮..💬) police officer..speech balloon
+1F4AD ; Emoji # E1.0 [1] (💭) thought balloon
+1F4AE..1F4B5 ; Emoji # E0.6 [8] (💮..💵) white flower..dollar banknote
+1F4B6..1F4B7 ; Emoji # E1.0 [2] (💶..💷) euro banknote..pound banknote
+1F4B8..1F4EB ; Emoji # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Emoji # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Emoji # E0.6 [1] (📮) postbox
+1F4EF ; Emoji # E1.0 [1] (📯) postal horn
+1F4F0..1F4F4 ; Emoji # E0.6 [5] (📰..📴) newspaper..mobile phone off
+1F4F5 ; Emoji # E1.0 [1] (📵) no mobile phones
+1F4F6..1F4F7 ; Emoji # E0.6 [2] (📶..📷) antenna bars..camera
+1F4F8 ; Emoji # E1.0 [1] (📸) camera with flash
+1F4F9..1F4FC ; Emoji # E0.6 [4] (📹..📼) video camera..videocassette
+1F4FD ; Emoji # E0.7 [1] (📽️) film projector
+1F4FF..1F502 ; Emoji # E1.0 [4] (📿..🔂) prayer beads..repeat single button
+1F503 ; Emoji # E0.6 [1] (🔃) clockwise vertical arrows
+1F504..1F507 ; Emoji # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker
+1F508 ; Emoji # E0.7 [1] (🔈) speaker low volume
+1F509 ; Emoji # E1.0 [1] (🔉) speaker medium volume
+1F50A..1F514 ; Emoji # E0.6 [11] (🔊..🔔) speaker high volume..bell
+1F515 ; Emoji # E1.0 [1] (🔕) bell with slash
+1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..water pistol
+1F52C..1F52D ; Emoji # E1.0 [2] (🔬..🔭) microscope..telescope
+1F52E..1F53D ; Emoji # E0.6 [16] (🔮..🔽) crystal ball..downwards button
+1F549..1F54A ; Emoji # E0.7 [2] (🕉️..🕊️) om..dove
+1F54B..1F54E ; Emoji # E1.0 [4] (🕋..🕎) kaaba..menorah
+1F550..1F55B ; Emoji # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock
+1F55C..1F567 ; Emoji # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty
+1F56F..1F570 ; Emoji # E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock
+1F573..1F579 ; Emoji # E0.7 [7] (🕳️..🕹️) hole..joystick
+1F57A ; Emoji # E3.0 [1] (🕺) man dancing
+1F587 ; Emoji # E0.7 [1] (🖇️) linked paperclips
+1F58A..1F58D ; Emoji # E0.7 [4] (🖊️..🖍️) pen..crayon
+1F590 ; Emoji # E0.7 [1] (🖐️) hand with fingers splayed
+1F595..1F596 ; Emoji # E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F5A4 ; Emoji # E3.0 [1] (🖤) black heart
+1F5A5 ; Emoji # E0.7 [1] (🖥️) desktop computer
+1F5A8 ; Emoji # E0.7 [1] (🖨️) printer
+1F5B1..1F5B2 ; Emoji # E0.7 [2] (🖱️..🖲️) computer mouse..trackball
+1F5BC ; Emoji # E0.7 [1] (🖼️) framed picture
+1F5C2..1F5C4 ; Emoji # E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet
+1F5D1..1F5D3 ; Emoji # E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar
+1F5DC..1F5DE ; Emoji # E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper
+1F5E1 ; Emoji # E0.7 [1] (🗡️) dagger
+1F5E3 ; Emoji # E0.7 [1] (🗣️) speaking head
+1F5E8 ; Emoji # E2.0 [1] (🗨️) left speech bubble
+1F5EF ; Emoji # E0.7 [1] (🗯️) right anger bubble
+1F5F3 ; Emoji # E0.7 [1] (🗳️) ballot box with ballot
+1F5FA ; Emoji # E0.7 [1] (🗺️) world map
+1F5FB..1F5FF ; Emoji # E0.6 [5] (🗻..🗿) mount fuji..moai
+1F600 ; Emoji # E1.0 [1] (😀) grinning face
+1F601..1F606 ; Emoji # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Emoji # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns
+1F609..1F60D ; Emoji # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes
+1F60E ; Emoji # E1.0 [1] (😎) smiling face with sunglasses
+1F60F ; Emoji # E0.6 [1] (😏) smirking face
+1F610 ; Emoji # E0.7 [1] (😐) neutral face
+1F611 ; Emoji # E1.0 [1] (😑) expressionless face
+1F612..1F614 ; Emoji # E0.6 [3] (😒..😔) unamused face..pensive face
+1F615 ; Emoji # E1.0 [1] (😕) confused face
+1F616 ; Emoji # E0.6 [1] (😖) confounded face
+1F617 ; Emoji # E1.0 [1] (😗) kissing face
+1F618 ; Emoji # E0.6 [1] (😘) face blowing a kiss
+1F619 ; Emoji # E1.0 [1] (😙) kissing face with smiling eyes
+1F61A ; Emoji # E0.6 [1] (😚) kissing face with closed eyes
+1F61B ; Emoji # E1.0 [1] (😛) face with tongue
+1F61C..1F61E ; Emoji # E0.6 [3] (😜..😞) winking face with tongue..disappointed face
+1F61F ; Emoji # E1.0 [1] (😟) worried face
+1F620..1F625 ; Emoji # E0.6 [6] (😠..😥) angry face..sad but relieved face
+1F626..1F627 ; Emoji # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji # E0.6 [4] (😨..😫) fearful face..tired face
+1F62C ; Emoji # E1.0 [1] (😬) grimacing face
+1F62D ; Emoji # E0.6 [1] (😭) loudly crying face
+1F62E..1F62F ; Emoji # E1.0 [2] (😮..😯) face with open mouth..hushed face
+1F630..1F633 ; Emoji # E0.6 [4] (😰..😳) anxious face with sweat..flushed face
+1F634 ; Emoji # E1.0 [1] (😴) sleeping face
+1F635 ; Emoji # E0.6 [1] (😵) face with crossed-out eyes
+1F636 ; Emoji # E1.0 [1] (😶) face without mouth
+1F637..1F640 ; Emoji # E0.6 [10] (😷..🙀) face with medical mask..weary cat
+1F641..1F644 ; Emoji # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Emoji # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands
+1F680 ; Emoji # E0.6 [1] (🚀) rocket
+1F681..1F682 ; Emoji # E1.0 [2] (🚁..🚂) helicopter..locomotive
+1F683..1F685 ; Emoji # E0.6 [3] (🚃..🚅) railway car..bullet train
+1F686 ; Emoji # E1.0 [1] (🚆) train
+1F687 ; Emoji # E0.6 [1] (🚇) metro
+1F688 ; Emoji # E1.0 [1] (🚈) light rail
+1F689 ; Emoji # E0.6 [1] (🚉) station
+1F68A..1F68B ; Emoji # E1.0 [2] (🚊..🚋) tram..tram car
+1F68C ; Emoji # E0.6 [1] (🚌) bus
+1F68D ; Emoji # E0.7 [1] (🚍) oncoming bus
+1F68E ; Emoji # E1.0 [1] (🚎) trolleybus
+1F68F ; Emoji # E0.6 [1] (🚏) bus stop
+1F690 ; Emoji # E1.0 [1] (🚐) minibus
+1F691..1F693 ; Emoji # E0.6 [3] (🚑..🚓) ambulance..police car
+1F694 ; Emoji # E0.7 [1] (🚔) oncoming police car
+1F695 ; Emoji # E0.6 [1] (🚕) taxi
+1F696 ; Emoji # E1.0 [1] (🚖) oncoming taxi
+1F697 ; Emoji # E0.6 [1] (🚗) automobile
+1F698 ; Emoji # E0.7 [1] (🚘) oncoming automobile
+1F699..1F69A ; Emoji # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Emoji # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway
+1F6A2 ; Emoji # E0.6 [1] (🚢) ship
+1F6A3 ; Emoji # E1.0 [1] (🚣) person rowing boat
+1F6A4..1F6A5 ; Emoji # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light
+1F6A6 ; Emoji # E1.0 [1] (🚦) vertical traffic light
+1F6A7..1F6AD ; Emoji # E0.6 [7] (🚧..🚭) construction..no smoking
+1F6AE..1F6B1 ; Emoji # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water
+1F6B2 ; Emoji # E0.6 [1] (🚲) bicycle
+1F6B3..1F6B5 ; Emoji # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking
+1F6B6 ; Emoji # E0.6 [1] (🚶) person walking
+1F6B7..1F6B8 ; Emoji # E1.0 [2] (🚷..🚸) no pedestrians..children crossing
+1F6B9..1F6BE ; Emoji # E0.6 [6] (🚹..🚾) men’s room..water closet
+1F6BF ; Emoji # E1.0 [1] (🚿) shower
+1F6C0 ; Emoji # E0.6 [1] (🛀) person taking bath
+1F6C1..1F6C5 ; Emoji # E1.0 [5] (🛁..🛅) bathtub..left luggage
+1F6CB ; Emoji # E0.7 [1] (🛋️) couch and lamp
+1F6CC ; Emoji # E1.0 [1] (🛌) person in bed
+1F6CD..1F6CF ; Emoji # E0.7 [3] (🛍️..🛏️) shopping bags..bed
+1F6D0 ; Emoji # E1.0 [1] (🛐) place of worship
+1F6D1..1F6D2 ; Emoji # E3.0 [2] (🛑..🛒) stop sign..shopping cart
+1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple
+1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator
+1F6DC ; Emoji # E15.0 [1] (🛜) wireless
+1F6DD..1F6DF ; Emoji # E14.0 [3] (🛝..🛟) playground slide..ring buoy
+1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat
+1F6E9 ; Emoji # E0.7 [1] (🛩️) small airplane
+1F6EB..1F6EC ; Emoji # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
+1F6F0 ; Emoji # E0.7 [1] (🛰️) satellite
+1F6F3 ; Emoji # E0.7 [1] (🛳️) passenger ship
+1F6F4..1F6F6 ; Emoji # E3.0 [3] (🛴..🛶) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji # E5.0 [2] (🛷..🛸) sled..flying saucer
+1F6F9 ; Emoji # E11.0 [1] (🛹) skateboard
+1F6FA ; Emoji # E12.0 [1] (🛺) auto rickshaw
+1F6FB..1F6FC ; Emoji # E13.0 [2] (🛻..🛼) pickup truck..roller skate
+1F7E0..1F7EB ; Emoji # E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7F0 ; Emoji # E14.0 [1] (🟰) heavy equals sign
+1F90C ; Emoji # E13.0 [1] (🤌) pinched fingers
+1F90D..1F90F ; Emoji # E12.0 [3] (🤍..🤏) white heart..pinching hand
+1F910..1F918 ; Emoji # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji # E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Emoji # E5.0 [1] (🤟) love-you gesture
+1F920..1F927 ; Emoji # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
+1F930 ; Emoji # E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Emoji # E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F93A ; Emoji # E3.0 [8] (🤳..🤺) selfie..person fencing
+1F93C..1F93E ; Emoji # E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F93F ; Emoji # E12.0 [1] (🤿) diving mask
+1F940..1F945 ; Emoji # E3.0 [6] (🥀..🥅) wilted flower..goal net
+1F947..1F94B ; Emoji # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
+1F94C ; Emoji # E5.0 [1] (🥌) curling stone
+1F94D..1F94F ; Emoji # E11.0 [3] (🥍..🥏) lacrosse..flying disc
+1F950..1F95E ; Emoji # E3.0 [15] (🥐..🥞) croissant..pancakes
+1F95F..1F96B ; Emoji # E5.0 [13] (🥟..🥫) dumpling..canned food
+1F96C..1F970 ; Emoji # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
+1F971 ; Emoji # E12.0 [1] (🥱) yawning face
+1F972 ; Emoji # E13.0 [1] (🥲) smiling face with tear
+1F973..1F976 ; Emoji # E11.0 [4] (🥳..🥶) partying face..cold face
+1F977..1F978 ; Emoji # E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Emoji # E14.0 [1] (🥹) face holding back tears
+1F97A ; Emoji # E11.0 [1] (🥺) pleading face
+1F97B ; Emoji # E12.0 [1] (🥻) sari
+1F97C..1F97F ; Emoji # E11.0 [4] (🥼..🥿) lab coat..flat shoe
+1F980..1F984 ; Emoji # E1.0 [5] (🦀..🦄) crab..unicorn
+1F985..1F991 ; Emoji # E3.0 [13] (🦅..🦑) eagle..squid
+1F992..1F997 ; Emoji # E5.0 [6] (🦒..🦗) giraffe..cricket
+1F998..1F9A2 ; Emoji # E11.0 [11] (🦘..🦢) kangaroo..swan
+1F9A3..1F9A4 ; Emoji # E13.0 [2] (🦣..🦤) mammoth..dodo
+1F9A5..1F9AA ; Emoji # E12.0 [6] (🦥..🦪) sloth..oyster
+1F9AB..1F9AD ; Emoji # E13.0 [3] (🦫..🦭) beaver..seal
+1F9AE..1F9AF ; Emoji # E12.0 [2] (🦮..🦯) guide dog..white cane
+1F9B0..1F9B9 ; Emoji # E11.0 [10] (🦰..🦹) red hair..supervillain
+1F9BA..1F9BF ; Emoji # E12.0 [6] (🦺..🦿) safety vest..mechanical leg
+1F9C0 ; Emoji # E1.0 [1] (🧀) cheese wedge
+1F9C1..1F9C2 ; Emoji # E11.0 [2] (🧁..🧂) cupcake..salt
+1F9C3..1F9CA ; Emoji # E12.0 [8] (🧃..🧊) beverage box..ice
+1F9CB ; Emoji # E13.0 [1] (🧋) bubble tea
+1F9CC ; Emoji # E14.0 [1] (🧌) troll
+1F9CD..1F9CF ; Emoji # E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D0..1F9E6 ; Emoji # E5.0 [23] (🧐..🧦) face with monocle..socks
+1F9E7..1F9FF ; Emoji # E11.0 [25] (🧧..🧿) red envelope..nazar amulet
+1FA70..1FA73 ; Emoji # E12.0 [4] (🩰..🩳) ballet shoes..shorts
+1FA74 ; Emoji # E13.0 [1] (🩴) thong sandal
+1FA75..1FA77 ; Emoji # E15.0 [3] (🩵..🩷) light blue heart..pink heart
+1FA78..1FA7A ; Emoji # E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Emoji # E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA80..1FA82 ; Emoji # E12.0 [3] (🪀..🪂) yo-yo..parachute
+1FA83..1FA86 ; Emoji # E13.0 [4] (🪃..🪆) boomerang..nesting dolls
+1FA87..1FA88 ; Emoji # E15.0 [2] (🪇..🪈) maracas..flute
+1FA90..1FA95 ; Emoji # E12.0 [6] (🪐..🪕) ringed planet..banjo
+1FA96..1FAA8 ; Emoji # E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Emoji # E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Emoji # E15.0 [3] (🪭..🪯) folding hand fan..khanda
+1FAB0..1FAB6 ; Emoji # E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Emoji # E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABD ; Emoji # E15.0 [3] (🪻..🪽) hyacinth..wing
+1FABF ; Emoji # E15.0 [1] (🪿) goose
+1FAC0..1FAC2 ; Emoji # E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Emoji # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FACE..1FACF ; Emoji # E15.0 [2] (🫎..🫏) moose..donkey
+1FAD0..1FAD6 ; Emoji # E13.0 [7] (🫐..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Emoji # E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADB ; Emoji # E15.0 [2] (🫚..🫛) ginger root..pea pod
+1FAE0..1FAE7 ; Emoji # E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8 ; Emoji # E15.0 [1] (🫨) shaking face
+1FAF0..1FAF6 ; Emoji # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Emoji # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 1424
+
+# ================================================
+
+# All omitted code points have Emoji_Presentation=No
+
+231A..231B ; Emoji_Presentation # E0.6 [2] (⌚..⌛) watch..hourglass done
+23E9..23EC ; Emoji_Presentation # E0.6 [4] (⏩..⏬) fast-forward button..fast down button
+23F0 ; Emoji_Presentation # E0.6 [1] (⏰) alarm clock
+23F3 ; Emoji_Presentation # E0.6 [1] (⏳) hourglass not done
+25FD..25FE ; Emoji_Presentation # E0.6 [2] (◽..◾) white medium-small square..black medium-small square
+2614..2615 ; Emoji_Presentation # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage
+2648..2653 ; Emoji_Presentation # E0.6 [12] (♈..♓) Aries..Pisces
+267F ; Emoji_Presentation # E0.6 [1] (♿) wheelchair symbol
+2693 ; Emoji_Presentation # E0.6 [1] (⚓) anchor
+26A1 ; Emoji_Presentation # E0.6 [1] (⚡) high voltage
+26AA..26AB ; Emoji_Presentation # E0.6 [2] (⚪..⚫) white circle..black circle
+26BD..26BE ; Emoji_Presentation # E0.6 [2] (⚽..⚾) soccer ball..baseball
+26C4..26C5 ; Emoji_Presentation # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud
+26CE ; Emoji_Presentation # E0.6 [1] (⛎) Ophiuchus
+26D4 ; Emoji_Presentation # E0.6 [1] (⛔) no entry
+26EA ; Emoji_Presentation # E0.6 [1] (⛪) church
+26F2..26F3 ; Emoji_Presentation # E0.6 [2] (⛲..⛳) fountain..flag in hole
+26F5 ; Emoji_Presentation # E0.6 [1] (⛵) sailboat
+26FA ; Emoji_Presentation # E0.6 [1] (⛺) tent
+26FD ; Emoji_Presentation # E0.6 [1] (⛽) fuel pump
+2705 ; Emoji_Presentation # E0.6 [1] (✅) check mark button
+270A..270B ; Emoji_Presentation # E0.6 [2] (✊..✋) raised fist..raised hand
+2728 ; Emoji_Presentation # E0.6 [1] (✨) sparkles
+274C ; Emoji_Presentation # E0.6 [1] (❌) cross mark
+274E ; Emoji_Presentation # E0.6 [1] (❎) cross mark button
+2753..2755 ; Emoji_Presentation # E0.6 [3] (❓..❕) red question mark..white exclamation mark
+2757 ; Emoji_Presentation # E0.6 [1] (❗) red exclamation mark
+2795..2797 ; Emoji_Presentation # E0.6 [3] (➕..➗) plus..divide
+27B0 ; Emoji_Presentation # E0.6 [1] (➰) curly loop
+27BF ; Emoji_Presentation # E1.0 [1] (➿) double curly loop
+2B1B..2B1C ; Emoji_Presentation # E0.6 [2] (⬛..⬜) black large square..white large square
+2B50 ; Emoji_Presentation # E0.6 [1] (⭐) star
+2B55 ; Emoji_Presentation # E0.6 [1] (⭕) hollow red circle
+1F004 ; Emoji_Presentation # E0.6 [1] (🀄) mahjong red dragon
+1F0CF ; Emoji_Presentation # E0.6 [1] (🃏) joker
+1F18E ; Emoji_Presentation # E0.6 [1] (🆎) AB button (blood type)
+1F191..1F19A ; Emoji_Presentation # E0.6 [10] (🆑..🆚) CL button..VS button
+1F1E6..1F1FF ; Emoji_Presentation # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
+1F201 ; Emoji_Presentation # E0.6 [1] (🈁) Japanese “here” button
+1F21A ; Emoji_Presentation # E0.6 [1] (🈚) Japanese “free of charge” button
+1F22F ; Emoji_Presentation # E0.6 [1] (🈯) Japanese “reserved” button
+1F232..1F236 ; Emoji_Presentation # E0.6 [5] (🈲..🈶) Japanese “prohibited” button..Japanese “not free of charge” button
+1F238..1F23A ; Emoji_Presentation # E0.6 [3] (🈸..🈺) Japanese “application” button..Japanese “open for business” button
+1F250..1F251 ; Emoji_Presentation # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
+1F300..1F30C ; Emoji_Presentation # E0.6 [13] (🌀..🌌) cyclone..milky way
+1F30D..1F30E ; Emoji_Presentation # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas
+1F30F ; Emoji_Presentation # E0.6 [1] (🌏) globe showing Asia-Australia
+1F310 ; Emoji_Presentation # E1.0 [1] (🌐) globe with meridians
+1F311 ; Emoji_Presentation # E0.6 [1] (🌑) new moon
+1F312 ; Emoji_Presentation # E1.0 [1] (🌒) waxing crescent moon
+1F313..1F315 ; Emoji_Presentation # E0.6 [3] (🌓..🌕) first quarter moon..full moon
+1F316..1F318 ; Emoji_Presentation # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon
+1F319 ; Emoji_Presentation # E0.6 [1] (🌙) crescent moon
+1F31A ; Emoji_Presentation # E1.0 [1] (🌚) new moon face
+1F31B ; Emoji_Presentation # E0.6 [1] (🌛) first quarter moon face
+1F31C ; Emoji_Presentation # E0.7 [1] (🌜) last quarter moon face
+1F31D..1F31E ; Emoji_Presentation # E1.0 [2] (🌝..🌞) full moon face..sun with face
+1F31F..1F320 ; Emoji_Presentation # E0.6 [2] (🌟..🌠) glowing star..shooting star
+1F32D..1F32F ; Emoji_Presentation # E1.0 [3] (🌭..🌯) hot dog..burrito
+1F330..1F331 ; Emoji_Presentation # E0.6 [2] (🌰..🌱) chestnut..seedling
+1F332..1F333 ; Emoji_Presentation # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree
+1F334..1F335 ; Emoji_Presentation # E0.6 [2] (🌴..🌵) palm tree..cactus
+1F337..1F34A ; Emoji_Presentation # E0.6 [20] (🌷..🍊) tulip..tangerine
+1F34B ; Emoji_Presentation # E1.0 [1] (🍋) lemon
+1F34C..1F34F ; Emoji_Presentation # E0.6 [4] (🍌..🍏) banana..green apple
+1F350 ; Emoji_Presentation # E1.0 [1] (🍐) pear
+1F351..1F37B ; Emoji_Presentation # E0.6 [43] (🍑..🍻) peach..clinking beer mugs
+1F37C ; Emoji_Presentation # E1.0 [1] (🍼) baby bottle
+1F37E..1F37F ; Emoji_Presentation # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji_Presentation # E0.6 [20] (🎀..🎓) ribbon..graduation cap
+1F3A0..1F3C4 ; Emoji_Presentation # E0.6 [37] (🎠..🏄) carousel horse..person surfing
+1F3C5 ; Emoji_Presentation # E1.0 [1] (🏅) sports medal
+1F3C6 ; Emoji_Presentation # E0.6 [1] (🏆) trophy
+1F3C7 ; Emoji_Presentation # E1.0 [1] (🏇) horse racing
+1F3C8 ; Emoji_Presentation # E0.6 [1] (🏈) american football
+1F3C9 ; Emoji_Presentation # E1.0 [1] (🏉) rugby football
+1F3CA ; Emoji_Presentation # E0.6 [1] (🏊) person swimming
+1F3CF..1F3D3 ; Emoji_Presentation # E1.0 [5] (🏏..🏓) cricket game..ping pong
+1F3E0..1F3E3 ; Emoji_Presentation # E0.6 [4] (🏠..🏣) house..Japanese post office
+1F3E4 ; Emoji_Presentation # E1.0 [1] (🏤) post office
+1F3E5..1F3F0 ; Emoji_Presentation # E0.6 [12] (🏥..🏰) hospital..castle
+1F3F4 ; Emoji_Presentation # E1.0 [1] (🏴) black flag
+1F3F8..1F407 ; Emoji_Presentation # E1.0 [16] (🏸..🐇) badminton..rabbit
+1F408 ; Emoji_Presentation # E0.7 [1] (🐈) cat
+1F409..1F40B ; Emoji_Presentation # E1.0 [3] (🐉..🐋) dragon..whale
+1F40C..1F40E ; Emoji_Presentation # E0.6 [3] (🐌..🐎) snail..horse
+1F40F..1F410 ; Emoji_Presentation # E1.0 [2] (🐏..🐐) ram..goat
+1F411..1F412 ; Emoji_Presentation # E0.6 [2] (🐑..🐒) ewe..monkey
+1F413 ; Emoji_Presentation # E1.0 [1] (🐓) rooster
+1F414 ; Emoji_Presentation # E0.6 [1] (🐔) chicken
+1F415 ; Emoji_Presentation # E0.7 [1] (🐕) dog
+1F416 ; Emoji_Presentation # E1.0 [1] (🐖) pig
+1F417..1F429 ; Emoji_Presentation # E0.6 [19] (🐗..🐩) boar..poodle
+1F42A ; Emoji_Presentation # E1.0 [1] (🐪) camel
+1F42B..1F43E ; Emoji_Presentation # E0.6 [20] (🐫..🐾) two-hump camel..paw prints
+1F440 ; Emoji_Presentation # E0.6 [1] (👀) eyes
+1F442..1F464 ; Emoji_Presentation # E0.6 [35] (👂..👤) ear..bust in silhouette
+1F465 ; Emoji_Presentation # E1.0 [1] (👥) busts in silhouette
+1F466..1F46B ; Emoji_Presentation # E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Emoji_Presentation # E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F4AC ; Emoji_Presentation # E0.6 [63] (👮..💬) police officer..speech balloon
+1F4AD ; Emoji_Presentation # E1.0 [1] (💭) thought balloon
+1F4AE..1F4B5 ; Emoji_Presentation # E0.6 [8] (💮..💵) white flower..dollar banknote
+1F4B6..1F4B7 ; Emoji_Presentation # E1.0 [2] (💶..💷) euro banknote..pound banknote
+1F4B8..1F4EB ; Emoji_Presentation # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Emoji_Presentation # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Emoji_Presentation # E0.6 [1] (📮) postbox
+1F4EF ; Emoji_Presentation # E1.0 [1] (📯) postal horn
+1F4F0..1F4F4 ; Emoji_Presentation # E0.6 [5] (📰..📴) newspaper..mobile phone off
+1F4F5 ; Emoji_Presentation # E1.0 [1] (📵) no mobile phones
+1F4F6..1F4F7 ; Emoji_Presentation # E0.6 [2] (📶..📷) antenna bars..camera
+1F4F8 ; Emoji_Presentation # E1.0 [1] (📸) camera with flash
+1F4F9..1F4FC ; Emoji_Presentation # E0.6 [4] (📹..📼) video camera..videocassette
+1F4FF..1F502 ; Emoji_Presentation # E1.0 [4] (📿..🔂) prayer beads..repeat single button
+1F503 ; Emoji_Presentation # E0.6 [1] (🔃) clockwise vertical arrows
+1F504..1F507 ; Emoji_Presentation # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker
+1F508 ; Emoji_Presentation # E0.7 [1] (🔈) speaker low volume
+1F509 ; Emoji_Presentation # E1.0 [1] (🔉) speaker medium volume
+1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (🔊..🔔) speaker high volume..bell
+1F515 ; Emoji_Presentation # E1.0 [1] (🔕) bell with slash
+1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..water pistol
+1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (🔬..🔭) microscope..telescope
+1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (🔮..🔽) crystal ball..downwards button
+1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (🕋..🕎) kaaba..menorah
+1F550..1F55B ; Emoji_Presentation # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock
+1F55C..1F567 ; Emoji_Presentation # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty
+1F57A ; Emoji_Presentation # E3.0 [1] (🕺) man dancing
+1F595..1F596 ; Emoji_Presentation # E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F5A4 ; Emoji_Presentation # E3.0 [1] (🖤) black heart
+1F5FB..1F5FF ; Emoji_Presentation # E0.6 [5] (🗻..🗿) mount fuji..moai
+1F600 ; Emoji_Presentation # E1.0 [1] (😀) grinning face
+1F601..1F606 ; Emoji_Presentation # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Emoji_Presentation # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns
+1F609..1F60D ; Emoji_Presentation # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes
+1F60E ; Emoji_Presentation # E1.0 [1] (😎) smiling face with sunglasses
+1F60F ; Emoji_Presentation # E0.6 [1] (😏) smirking face
+1F610 ; Emoji_Presentation # E0.7 [1] (😐) neutral face
+1F611 ; Emoji_Presentation # E1.0 [1] (😑) expressionless face
+1F612..1F614 ; Emoji_Presentation # E0.6 [3] (😒..😔) unamused face..pensive face
+1F615 ; Emoji_Presentation # E1.0 [1] (😕) confused face
+1F616 ; Emoji_Presentation # E0.6 [1] (😖) confounded face
+1F617 ; Emoji_Presentation # E1.0 [1] (😗) kissing face
+1F618 ; Emoji_Presentation # E0.6 [1] (😘) face blowing a kiss
+1F619 ; Emoji_Presentation # E1.0 [1] (😙) kissing face with smiling eyes
+1F61A ; Emoji_Presentation # E0.6 [1] (😚) kissing face with closed eyes
+1F61B ; Emoji_Presentation # E1.0 [1] (😛) face with tongue
+1F61C..1F61E ; Emoji_Presentation # E0.6 [3] (😜..😞) winking face with tongue..disappointed face
+1F61F ; Emoji_Presentation # E1.0 [1] (😟) worried face
+1F620..1F625 ; Emoji_Presentation # E0.6 [6] (😠..😥) angry face..sad but relieved face
+1F626..1F627 ; Emoji_Presentation # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji_Presentation # E0.6 [4] (😨..😫) fearful face..tired face
+1F62C ; Emoji_Presentation # E1.0 [1] (😬) grimacing face
+1F62D ; Emoji_Presentation # E0.6 [1] (😭) loudly crying face
+1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (😮..😯) face with open mouth..hushed face
+1F630..1F633 ; Emoji_Presentation # E0.6 [4] (😰..😳) anxious face with sweat..flushed face
+1F634 ; Emoji_Presentation # E1.0 [1] (😴) sleeping face
+1F635 ; Emoji_Presentation # E0.6 [1] (😵) face with crossed-out eyes
+1F636 ; Emoji_Presentation # E1.0 [1] (😶) face without mouth
+1F637..1F640 ; Emoji_Presentation # E0.6 [10] (😷..🙀) face with medical mask..weary cat
+1F641..1F644 ; Emoji_Presentation # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Emoji_Presentation # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands
+1F680 ; Emoji_Presentation # E0.6 [1] (🚀) rocket
+1F681..1F682 ; Emoji_Presentation # E1.0 [2] (🚁..🚂) helicopter..locomotive
+1F683..1F685 ; Emoji_Presentation # E0.6 [3] (🚃..🚅) railway car..bullet train
+1F686 ; Emoji_Presentation # E1.0 [1] (🚆) train
+1F687 ; Emoji_Presentation # E0.6 [1] (🚇) metro
+1F688 ; Emoji_Presentation # E1.0 [1] (🚈) light rail
+1F689 ; Emoji_Presentation # E0.6 [1] (🚉) station
+1F68A..1F68B ; Emoji_Presentation # E1.0 [2] (🚊..🚋) tram..tram car
+1F68C ; Emoji_Presentation # E0.6 [1] (🚌) bus
+1F68D ; Emoji_Presentation # E0.7 [1] (🚍) oncoming bus
+1F68E ; Emoji_Presentation # E1.0 [1] (🚎) trolleybus
+1F68F ; Emoji_Presentation # E0.6 [1] (🚏) bus stop
+1F690 ; Emoji_Presentation # E1.0 [1] (🚐) minibus
+1F691..1F693 ; Emoji_Presentation # E0.6 [3] (🚑..🚓) ambulance..police car
+1F694 ; Emoji_Presentation # E0.7 [1] (🚔) oncoming police car
+1F695 ; Emoji_Presentation # E0.6 [1] (🚕) taxi
+1F696 ; Emoji_Presentation # E1.0 [1] (🚖) oncoming taxi
+1F697 ; Emoji_Presentation # E0.6 [1] (🚗) automobile
+1F698 ; Emoji_Presentation # E0.7 [1] (🚘) oncoming automobile
+1F699..1F69A ; Emoji_Presentation # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Emoji_Presentation # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway
+1F6A2 ; Emoji_Presentation # E0.6 [1] (🚢) ship
+1F6A3 ; Emoji_Presentation # E1.0 [1] (🚣) person rowing boat
+1F6A4..1F6A5 ; Emoji_Presentation # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light
+1F6A6 ; Emoji_Presentation # E1.0 [1] (🚦) vertical traffic light
+1F6A7..1F6AD ; Emoji_Presentation # E0.6 [7] (🚧..🚭) construction..no smoking
+1F6AE..1F6B1 ; Emoji_Presentation # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water
+1F6B2 ; Emoji_Presentation # E0.6 [1] (🚲) bicycle
+1F6B3..1F6B5 ; Emoji_Presentation # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking
+1F6B6 ; Emoji_Presentation # E0.6 [1] (🚶) person walking
+1F6B7..1F6B8 ; Emoji_Presentation # E1.0 [2] (🚷..🚸) no pedestrians..children crossing
+1F6B9..1F6BE ; Emoji_Presentation # E0.6 [6] (🚹..🚾) men’s room..water closet
+1F6BF ; Emoji_Presentation # E1.0 [1] (🚿) shower
+1F6C0 ; Emoji_Presentation # E0.6 [1] (🛀) person taking bath
+1F6C1..1F6C5 ; Emoji_Presentation # E1.0 [5] (🛁..🛅) bathtub..left luggage
+1F6CC ; Emoji_Presentation # E1.0 [1] (🛌) person in bed
+1F6D0 ; Emoji_Presentation # E1.0 [1] (🛐) place of worship
+1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (🛑..🛒) stop sign..shopping cart
+1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple
+1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator
+1F6DC ; Emoji_Presentation # E15.0 [1] (🛜) wireless
+1F6DD..1F6DF ; Emoji_Presentation # E14.0 [3] (🛝..🛟) playground slide..ring buoy
+1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
+1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (🛴..🛶) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (🛷..🛸) sled..flying saucer
+1F6F9 ; Emoji_Presentation # E11.0 [1] (🛹) skateboard
+1F6FA ; Emoji_Presentation # E12.0 [1] (🛺) auto rickshaw
+1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (🛻..🛼) pickup truck..roller skate
+1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7F0 ; Emoji_Presentation # E14.0 [1] (🟰) heavy equals sign
+1F90C ; Emoji_Presentation # E13.0 [1] (🤌) pinched fingers
+1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (🤍..🤏) white heart..pinching hand
+1F910..1F918 ; Emoji_Presentation # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji_Presentation # E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Emoji_Presentation # E5.0 [1] (🤟) love-you gesture
+1F920..1F927 ; Emoji_Presentation # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji_Presentation # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
+1F930 ; Emoji_Presentation # E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Emoji_Presentation # E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F93A ; Emoji_Presentation # E3.0 [8] (🤳..🤺) selfie..person fencing
+1F93C..1F93E ; Emoji_Presentation # E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F93F ; Emoji_Presentation # E12.0 [1] (🤿) diving mask
+1F940..1F945 ; Emoji_Presentation # E3.0 [6] (🥀..🥅) wilted flower..goal net
+1F947..1F94B ; Emoji_Presentation # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
+1F94C ; Emoji_Presentation # E5.0 [1] (🥌) curling stone
+1F94D..1F94F ; Emoji_Presentation # E11.0 [3] (🥍..🥏) lacrosse..flying disc
+1F950..1F95E ; Emoji_Presentation # E3.0 [15] (🥐..🥞) croissant..pancakes
+1F95F..1F96B ; Emoji_Presentation # E5.0 [13] (🥟..🥫) dumpling..canned food
+1F96C..1F970 ; Emoji_Presentation # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
+1F971 ; Emoji_Presentation # E12.0 [1] (🥱) yawning face
+1F972 ; Emoji_Presentation # E13.0 [1] (🥲) smiling face with tear
+1F973..1F976 ; Emoji_Presentation # E11.0 [4] (🥳..🥶) partying face..cold face
+1F977..1F978 ; Emoji_Presentation # E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Emoji_Presentation # E14.0 [1] (🥹) face holding back tears
+1F97A ; Emoji_Presentation # E11.0 [1] (🥺) pleading face
+1F97B ; Emoji_Presentation # E12.0 [1] (🥻) sari
+1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (🥼..🥿) lab coat..flat shoe
+1F980..1F984 ; Emoji_Presentation # E1.0 [5] (🦀..🦄) crab..unicorn
+1F985..1F991 ; Emoji_Presentation # E3.0 [13] (🦅..🦑) eagle..squid
+1F992..1F997 ; Emoji_Presentation # E5.0 [6] (🦒..🦗) giraffe..cricket
+1F998..1F9A2 ; Emoji_Presentation # E11.0 [11] (🦘..🦢) kangaroo..swan
+1F9A3..1F9A4 ; Emoji_Presentation # E13.0 [2] (🦣..🦤) mammoth..dodo
+1F9A5..1F9AA ; Emoji_Presentation # E12.0 [6] (🦥..🦪) sloth..oyster
+1F9AB..1F9AD ; Emoji_Presentation # E13.0 [3] (🦫..🦭) beaver..seal
+1F9AE..1F9AF ; Emoji_Presentation # E12.0 [2] (🦮..🦯) guide dog..white cane
+1F9B0..1F9B9 ; Emoji_Presentation # E11.0 [10] (🦰..🦹) red hair..supervillain
+1F9BA..1F9BF ; Emoji_Presentation # E12.0 [6] (🦺..🦿) safety vest..mechanical leg
+1F9C0 ; Emoji_Presentation # E1.0 [1] (🧀) cheese wedge
+1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (🧁..🧂) cupcake..salt
+1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (🧃..🧊) beverage box..ice
+1F9CB ; Emoji_Presentation # E13.0 [1] (🧋) bubble tea
+1F9CC ; Emoji_Presentation # E14.0 [1] (🧌) troll
+1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (🧐..🧦) face with monocle..socks
+1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (🧧..🧿) red envelope..nazar amulet
+1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (🩰..🩳) ballet shoes..shorts
+1FA74 ; Emoji_Presentation # E13.0 [1] (🩴) thong sandal
+1FA75..1FA77 ; Emoji_Presentation # E15.0 [3] (🩵..🩷) light blue heart..pink heart
+1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Emoji_Presentation # E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (🪀..🪂) yo-yo..parachute
+1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (🪃..🪆) boomerang..nesting dolls
+1FA87..1FA88 ; Emoji_Presentation # E15.0 [2] (🪇..🪈) maracas..flute
+1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (🪐..🪕) ringed planet..banjo
+1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Emoji_Presentation # E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Emoji_Presentation # E15.0 [3] (🪭..🪯) folding hand fan..khanda
+1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Emoji_Presentation # E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABD ; Emoji_Presentation # E15.0 [3] (🪻..🪽) hyacinth..wing
+1FABF ; Emoji_Presentation # E15.0 [1] (🪿) goose
+1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Emoji_Presentation # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FACE..1FACF ; Emoji_Presentation # E15.0 [2] (🫎..🫏) moose..donkey
+1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (🫐..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Emoji_Presentation # E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADB ; Emoji_Presentation # E15.0 [2] (🫚..🫛) ginger root..pea pod
+1FAE0..1FAE7 ; Emoji_Presentation # E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8 ; Emoji_Presentation # E15.0 [1] (🫨) shaking face
+1FAF0..1FAF6 ; Emoji_Presentation # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Emoji_Presentation # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 1205
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier=No
+
+1F3FB..1F3FF ; Emoji_Modifier # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone
+
+# Total elements: 5
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier_Base=No
+
+261D ; Emoji_Modifier_Base # E0.6 [1] (☝️) index pointing up
+26F9 ; Emoji_Modifier_Base # E0.7 [1] (⛹️) person bouncing ball
+270A..270C ; Emoji_Modifier_Base # E0.6 [3] (✊..✌️) raised fist..victory hand
+270D ; Emoji_Modifier_Base # E0.7 [1] (✍️) writing hand
+1F385 ; Emoji_Modifier_Base # E0.6 [1] (🎅) Santa Claus
+1F3C2..1F3C4 ; Emoji_Modifier_Base # E0.6 [3] (🏂..🏄) snowboarder..person surfing
+1F3C7 ; Emoji_Modifier_Base # E1.0 [1] (🏇) horse racing
+1F3CA ; Emoji_Modifier_Base # E0.6 [1] (🏊) person swimming
+1F3CB..1F3CC ; Emoji_Modifier_Base # E0.7 [2] (🏋️..🏌️) person lifting weights..person golfing
+1F442..1F443 ; Emoji_Modifier_Base # E0.6 [2] (👂..👃) ear..nose
+1F446..1F450 ; Emoji_Modifier_Base # E0.6 [11] (👆..👐) backhand index pointing up..open hands
+1F466..1F46B ; Emoji_Modifier_Base # E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Emoji_Modifier_Base # E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F478 ; Emoji_Modifier_Base # E0.6 [11] (👮..👸) police officer..princess
+1F47C ; Emoji_Modifier_Base # E0.6 [1] (👼) baby angel
+1F481..1F483 ; Emoji_Modifier_Base # E0.6 [3] (💁..💃) person tipping hand..woman dancing
+1F485..1F487 ; Emoji_Modifier_Base # E0.6 [3] (💅..💇) nail polish..person getting haircut
+1F48F ; Emoji_Modifier_Base # E0.6 [1] (💏) kiss
+1F491 ; Emoji_Modifier_Base # E0.6 [1] (💑) couple with heart
+1F4AA ; Emoji_Modifier_Base # E0.6 [1] (💪) flexed biceps
+1F574..1F575 ; Emoji_Modifier_Base # E0.7 [2] (🕴️..🕵️) person in suit levitating..detective
+1F57A ; Emoji_Modifier_Base # E3.0 [1] (🕺) man dancing
+1F590 ; Emoji_Modifier_Base # E0.7 [1] (🖐️) hand with fingers splayed
+1F595..1F596 ; Emoji_Modifier_Base # E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F645..1F647 ; Emoji_Modifier_Base # E0.6 [3] (🙅..🙇) person gesturing NO..person bowing
+1F64B..1F64F ; Emoji_Modifier_Base # E0.6 [5] (🙋..🙏) person raising hand..folded hands
+1F6A3 ; Emoji_Modifier_Base # E1.0 [1] (🚣) person rowing boat
+1F6B4..1F6B5 ; Emoji_Modifier_Base # E1.0 [2] (🚴..🚵) person biking..person mountain biking
+1F6B6 ; Emoji_Modifier_Base # E0.6 [1] (🚶) person walking
+1F6C0 ; Emoji_Modifier_Base # E0.6 [1] (🛀) person taking bath
+1F6CC ; Emoji_Modifier_Base # E1.0 [1] (🛌) person in bed
+1F90C ; Emoji_Modifier_Base # E13.0 [1] (🤌) pinched fingers
+1F90F ; Emoji_Modifier_Base # E12.0 [1] (🤏) pinching hand
+1F918 ; Emoji_Modifier_Base # E1.0 [1] (🤘) sign of the horns
+1F919..1F91E ; Emoji_Modifier_Base # E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Emoji_Modifier_Base # E5.0 [1] (🤟) love-you gesture
+1F926 ; Emoji_Modifier_Base # E3.0 [1] (🤦) person facepalming
+1F930 ; Emoji_Modifier_Base # E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Emoji_Modifier_Base # E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F939 ; Emoji_Modifier_Base # E3.0 [7] (🤳..🤹) selfie..person juggling
+1F93C..1F93E ; Emoji_Modifier_Base # E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F977 ; Emoji_Modifier_Base # E13.0 [1] (🥷) ninja
+1F9B5..1F9B6 ; Emoji_Modifier_Base # E11.0 [2] (🦵..🦶) leg..foot
+1F9B8..1F9B9 ; Emoji_Modifier_Base # E11.0 [2] (🦸..🦹) superhero..supervillain
+1F9BB ; Emoji_Modifier_Base # E12.0 [1] (🦻) ear with hearing aid
+1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (🧑..🧝) person..elf
+1FAC3..1FAC5 ; Emoji_Modifier_Base # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FAF0..1FAF6 ; Emoji_Modifier_Base # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Emoji_Modifier_Base # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 134
+
+# ================================================
+
+# All omitted code points have Emoji_Component=No
+
+0023 ; Emoji_Component # E0.0 [1] (#️) hash sign
+002A ; Emoji_Component # E0.0 [1] (*️) asterisk
+0030..0039 ; Emoji_Component # E0.0 [10] (0️..9️) digit zero..digit nine
+200D ; Emoji_Component # E0.0 [1] (‍) zero width joiner
+20E3 ; Emoji_Component # E0.0 [1] (⃣) combining enclosing keycap
+FE0F ; Emoji_Component # E0.0 [1] () VARIATION SELECTOR-16
+1F1E6..1F1FF ; Emoji_Component # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
+1F3FB..1F3FF ; Emoji_Component # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone
+1F9B0..1F9B3 ; Emoji_Component # E11.0 [4] (🦰..🦳) red hair..white hair
+E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..cancel tag
+
+# Total elements: 146
+
+# ================================================
+
+# All omitted code points have Extended_Pictographic=No
+
+00A9 ; Extended_Pictographic# E0.6 [1] (©️) copyright
+00AE ; Extended_Pictographic# E0.6 [1] (®️) registered
+203C ; Extended_Pictographic# E0.6 [1] (‼️) double exclamation mark
+2049 ; Extended_Pictographic# E0.6 [1] (⁉️) exclamation question mark
+2122 ; Extended_Pictographic# E0.6 [1] (™️) trade mark
+2139 ; Extended_Pictographic# E0.6 [1] (ℹ️) information
+2194..2199 ; Extended_Pictographic# E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow
+21A9..21AA ; Extended_Pictographic# E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right
+231A..231B ; Extended_Pictographic# E0.6 [2] (⌚..⌛) watch..hourglass done
+2328 ; Extended_Pictographic# E1.0 [1] (⌨️) keyboard
+2388 ; Extended_Pictographic# E0.0 [1] (⎈) HELM SYMBOL
+23CF ; Extended_Pictographic# E1.0 [1] (⏏️) eject button
+23E9..23EC ; Extended_Pictographic# E0.6 [4] (⏩..⏬) fast-forward button..fast down button
+23ED..23EE ; Extended_Pictographic# E0.7 [2] (⏭️..⏮️) next track button..last track button
+23EF ; Extended_Pictographic# E1.0 [1] (⏯️) play or pause button
+23F0 ; Extended_Pictographic# E0.6 [1] (⏰) alarm clock
+23F1..23F2 ; Extended_Pictographic# E1.0 [2] (⏱️..⏲️) stopwatch..timer clock
+23F3 ; Extended_Pictographic# E0.6 [1] (⏳) hourglass not done
+23F8..23FA ; Extended_Pictographic# E0.7 [3] (⏸️..⏺️) pause button..record button
+24C2 ; Extended_Pictographic# E0.6 [1] (Ⓜ️) circled M
+25AA..25AB ; Extended_Pictographic# E0.6 [2] (▪️..▫️) black small square..white small square
+25B6 ; Extended_Pictographic# E0.6 [1] (▶️) play button
+25C0 ; Extended_Pictographic# E0.6 [1] (◀️) reverse button
+25FB..25FE ; Extended_Pictographic# E0.6 [4] (◻️..◾) white medium square..black medium-small square
+2600..2601 ; Extended_Pictographic# E0.6 [2] (☀️..☁️) sun..cloud
+2602..2603 ; Extended_Pictographic# E0.7 [2] (☂️..☃️) umbrella..snowman
+2604 ; Extended_Pictographic# E1.0 [1] (☄️) comet
+2605 ; Extended_Pictographic# E0.0 [1] (★) BLACK STAR
+2607..260D ; Extended_Pictographic# E0.0 [7] (☇..☍) LIGHTNING..OPPOSITION
+260E ; Extended_Pictographic# E0.6 [1] (☎️) telephone
+260F..2610 ; Extended_Pictographic# E0.0 [2] (☏..☐) WHITE TELEPHONE..BALLOT BOX
+2611 ; Extended_Pictographic# E0.6 [1] (☑️) check box with check
+2612 ; Extended_Pictographic# E0.0 [1] (☒) BALLOT BOX WITH X
+2614..2615 ; Extended_Pictographic# E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage
+2616..2617 ; Extended_Pictographic# E0.0 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE
+2618 ; Extended_Pictographic# E1.0 [1] (☘️) shamrock
+2619..261C ; Extended_Pictographic# E0.0 [4] (☙..☜) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX
+261D ; Extended_Pictographic# E0.6 [1] (☝️) index pointing up
+261E..261F ; Extended_Pictographic# E0.0 [2] (☞..☟) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX
+2620 ; Extended_Pictographic# E1.0 [1] (☠️) skull and crossbones
+2621 ; Extended_Pictographic# E0.0 [1] (☡) CAUTION SIGN
+2622..2623 ; Extended_Pictographic# E1.0 [2] (☢️..☣️) radioactive..biohazard
+2624..2625 ; Extended_Pictographic# E0.0 [2] (☤..☥) CADUCEUS..ANKH
+2626 ; Extended_Pictographic# E1.0 [1] (☦️) orthodox cross
+2627..2629 ; Extended_Pictographic# E0.0 [3] (☧..☩) CHI RHO..CROSS OF JERUSALEM
+262A ; Extended_Pictographic# E0.7 [1] (☪️) star and crescent
+262B..262D ; Extended_Pictographic# E0.0 [3] (☫..☭) FARSI SYMBOL..HAMMER AND SICKLE
+262E ; Extended_Pictographic# E1.0 [1] (☮️) peace symbol
+262F ; Extended_Pictographic# E0.7 [1] (☯️) yin yang
+2630..2637 ; Extended_Pictographic# E0.0 [8] (☰..☷) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH
+2638..2639 ; Extended_Pictographic# E0.7 [2] (☸️..☹️) wheel of dharma..frowning face
+263A ; Extended_Pictographic# E0.6 [1] (☺️) smiling face
+263B..263F ; Extended_Pictographic# E0.0 [5] (☻..☿) BLACK SMILING FACE..MERCURY
+2640 ; Extended_Pictographic# E4.0 [1] (♀️) female sign
+2641 ; Extended_Pictographic# E0.0 [1] (♁) EARTH
+2642 ; Extended_Pictographic# E4.0 [1] (♂️) male sign
+2643..2647 ; Extended_Pictographic# E0.0 [5] (♃..♇) JUPITER..PLUTO
+2648..2653 ; Extended_Pictographic# E0.6 [12] (♈..♓) Aries..Pisces
+2654..265E ; Extended_Pictographic# E0.0 [11] (♔..♞) WHITE CHESS KING..BLACK CHESS KNIGHT
+265F ; Extended_Pictographic# E11.0 [1] (♟️) chess pawn
+2660 ; Extended_Pictographic# E0.6 [1] (♠️) spade suit
+2661..2662 ; Extended_Pictographic# E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT
+2663 ; Extended_Pictographic# E0.6 [1] (♣️) club suit
+2664 ; Extended_Pictographic# E0.0 [1] (♤) WHITE SPADE SUIT
+2665..2666 ; Extended_Pictographic# E0.6 [2] (♥️..♦️) heart suit..diamond suit
+2667 ; Extended_Pictographic# E0.0 [1] (♧) WHITE CLUB SUIT
+2668 ; Extended_Pictographic# E0.6 [1] (♨️) hot springs
+2669..267A ; Extended_Pictographic# E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B ; Extended_Pictographic# E0.6 [1] (♻️) recycling symbol
+267C..267D ; Extended_Pictographic# E0.0 [2] (♼..♽) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
+267E ; Extended_Pictographic# E11.0 [1] (♾️) infinity
+267F ; Extended_Pictographic# E0.6 [1] (♿) wheelchair symbol
+2680..2685 ; Extended_Pictographic# E0.0 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6
+2690..2691 ; Extended_Pictographic# E0.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG
+2692 ; Extended_Pictographic# E1.0 [1] (⚒️) hammer and pick
+2693 ; Extended_Pictographic# E0.6 [1] (⚓) anchor
+2694 ; Extended_Pictographic# E1.0 [1] (⚔️) crossed swords
+2695 ; Extended_Pictographic# E4.0 [1] (⚕️) medical symbol
+2696..2697 ; Extended_Pictographic# E1.0 [2] (⚖️..⚗️) balance scale..alembic
+2698 ; Extended_Pictographic# E0.0 [1] (⚘) FLOWER
+2699 ; Extended_Pictographic# E1.0 [1] (⚙️) gear
+269A ; Extended_Pictographic# E0.0 [1] (⚚) STAFF OF HERMES
+269B..269C ; Extended_Pictographic# E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis
+269D..269F ; Extended_Pictographic# E0.0 [3] (⚝..⚟) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT
+26A0..26A1 ; Extended_Pictographic# E0.6 [2] (⚠️..⚡) warning..high voltage
+26A2..26A6 ; Extended_Pictographic# E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN
+26A7 ; Extended_Pictographic# E13.0 [1] (⚧️) transgender symbol
+26A8..26A9 ; Extended_Pictographic# E0.0 [2] (⚨..⚩) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN
+26AA..26AB ; Extended_Pictographic# E0.6 [2] (⚪..⚫) white circle..black circle
+26AC..26AF ; Extended_Pictographic# E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL
+26B0..26B1 ; Extended_Pictographic# E1.0 [2] (⚰️..⚱️) coffin..funeral urn
+26B2..26BC ; Extended_Pictographic# E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE
+26BD..26BE ; Extended_Pictographic# E0.6 [2] (⚽..⚾) soccer ball..baseball
+26BF..26C3 ; Extended_Pictographic# E0.0 [5] (⚿..⛃) SQUARED KEY..BLACK DRAUGHTS KING
+26C4..26C5 ; Extended_Pictographic# E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud
+26C6..26C7 ; Extended_Pictographic# E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN
+26C8 ; Extended_Pictographic# E0.7 [1] (⛈️) cloud with lightning and rain
+26C9..26CD ; Extended_Pictographic# E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR
+26CE ; Extended_Pictographic# E0.6 [1] (⛎) Ophiuchus
+26CF ; Extended_Pictographic# E0.7 [1] (⛏️) pick
+26D0 ; Extended_Pictographic# E0.0 [1] (⛐) CAR SLIDING
+26D1 ; Extended_Pictographic# E0.7 [1] (⛑️) rescue worker’s helmet
+26D2 ; Extended_Pictographic# E0.0 [1] (⛒) CIRCLED CROSSING LANES
+26D3 ; Extended_Pictographic# E0.7 [1] (⛓️) chains
+26D4 ; Extended_Pictographic# E0.6 [1] (⛔) no entry
+26D5..26E8 ; Extended_Pictographic# E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD
+26E9 ; Extended_Pictographic# E0.7 [1] (⛩️) shinto shrine
+26EA ; Extended_Pictographic# E0.6 [1] (⛪) church
+26EB..26EF ; Extended_Pictographic# E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE
+26F0..26F1 ; Extended_Pictographic# E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground
+26F2..26F3 ; Extended_Pictographic# E0.6 [2] (⛲..⛳) fountain..flag in hole
+26F4 ; Extended_Pictographic# E0.7 [1] (⛴️) ferry
+26F5 ; Extended_Pictographic# E0.6 [1] (⛵) sailboat
+26F6 ; Extended_Pictographic# E0.0 [1] (⛶) SQUARE FOUR CORNERS
+26F7..26F9 ; Extended_Pictographic# E0.7 [3] (⛷️..⛹️) skier..person bouncing ball
+26FA ; Extended_Pictographic# E0.6 [1] (⛺) tent
+26FB..26FC ; Extended_Pictographic# E0.0 [2] (⛻..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL
+26FD ; Extended_Pictographic# E0.6 [1] (⛽) fuel pump
+26FE..2701 ; Extended_Pictographic# E0.0 [4] (⛾..✁) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS
+2702 ; Extended_Pictographic# E0.6 [1] (✂️) scissors
+2703..2704 ; Extended_Pictographic# E0.0 [2] (✃..✄) LOWER BLADE SCISSORS..WHITE SCISSORS
+2705 ; Extended_Pictographic# E0.6 [1] (✅) check mark button
+2708..270C ; Extended_Pictographic# E0.6 [5] (✈️..✌️) airplane..victory hand
+270D ; Extended_Pictographic# E0.7 [1] (✍️) writing hand
+270E ; Extended_Pictographic# E0.0 [1] (✎) LOWER RIGHT PENCIL
+270F ; Extended_Pictographic# E0.6 [1] (✏️) pencil
+2710..2711 ; Extended_Pictographic# E0.0 [2] (✐..✑) UPPER RIGHT PENCIL..WHITE NIB
+2712 ; Extended_Pictographic# E0.6 [1] (✒️) black nib
+2714 ; Extended_Pictographic# E0.6 [1] (✔️) check mark
+2716 ; Extended_Pictographic# E0.6 [1] (✖️) multiply
+271D ; Extended_Pictographic# E0.7 [1] (✝️) latin cross
+2721 ; Extended_Pictographic# E0.7 [1] (✡️) star of David
+2728 ; Extended_Pictographic# E0.6 [1] (✨) sparkles
+2733..2734 ; Extended_Pictographic# E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star
+2744 ; Extended_Pictographic# E0.6 [1] (❄️) snowflake
+2747 ; Extended_Pictographic# E0.6 [1] (❇️) sparkle
+274C ; Extended_Pictographic# E0.6 [1] (❌) cross mark
+274E ; Extended_Pictographic# E0.6 [1] (❎) cross mark button
+2753..2755 ; Extended_Pictographic# E0.6 [3] (❓..❕) red question mark..white exclamation mark
+2757 ; Extended_Pictographic# E0.6 [1] (❗) red exclamation mark
+2763 ; Extended_Pictographic# E1.0 [1] (❣️) heart exclamation
+2764 ; Extended_Pictographic# E0.6 [1] (❤️) red heart
+2765..2767 ; Extended_Pictographic# E0.0 [3] (❥..❧) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET
+2795..2797 ; Extended_Pictographic# E0.6 [3] (➕..➗) plus..divide
+27A1 ; Extended_Pictographic# E0.6 [1] (➡️) right arrow
+27B0 ; Extended_Pictographic# E0.6 [1] (➰) curly loop
+27BF ; Extended_Pictographic# E1.0 [1] (➿) double curly loop
+2934..2935 ; Extended_Pictographic# E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down
+2B05..2B07 ; Extended_Pictographic# E0.6 [3] (⬅️..⬇️) left arrow..down arrow
+2B1B..2B1C ; Extended_Pictographic# E0.6 [2] (⬛..⬜) black large square..white large square
+2B50 ; Extended_Pictographic# E0.6 [1] (⭐) star
+2B55 ; Extended_Pictographic# E0.6 [1] (⭕) hollow red circle
+3030 ; Extended_Pictographic# E0.6 [1] (〰️) wavy dash
+303D ; Extended_Pictographic# E0.6 [1] (〽️) part alternation mark
+3297 ; Extended_Pictographic# E0.6 [1] (㊗️) Japanese “congratulations” button
+3299 ; Extended_Pictographic# E0.6 [1] (㊙️) Japanese “secret” button
+1F000..1F003 ; Extended_Pictographic# E0.0 [4] (🀀..🀃) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND
+1F004 ; Extended_Pictographic# E0.6 [1] (🀄) mahjong red dragon
+1F005..1F0CE ; Extended_Pictographic# E0.0 [202] (🀅..🃎) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS
+1F0CF ; Extended_Pictographic# E0.6 [1] (🃏) joker
+1F0D0..1F0FF ; Extended_Pictographic# E0.0 [48] (🃐..🃿) <reserved-1F0D0>..<reserved-1F0FF>
+1F10D..1F10F ; Extended_Pictographic# E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH
+1F12F ; Extended_Pictographic# E0.0 [1] (🄯) COPYLEFT SYMBOL
+1F16C..1F16F ; Extended_Pictographic# E0.0 [4] (🅬..🅯) RAISED MR SIGN..CIRCLED HUMAN FIGURE
+1F170..1F171 ; Extended_Pictographic# E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type)
+1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (🅾️..🅿️) O button (blood type)..P button
+1F18E ; Extended_Pictographic# E0.6 [1] (🆎) AB button (blood type)
+1F191..1F19A ; Extended_Pictographic# E0.6 [10] (🆑..🆚) CL button..VS button
+1F1AD..1F1E5 ; Extended_Pictographic# E0.0 [57] (🆭..🇥) MASK WORK SYMBOL..<reserved-1F1E5>
+1F201..1F202 ; Extended_Pictographic# E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button
+1F203..1F20F ; Extended_Pictographic# E0.0 [13] (🈃..🈏) <reserved-1F203>..<reserved-1F20F>
+1F21A ; Extended_Pictographic# E0.6 [1] (🈚) Japanese “free of charge” button
+1F22F ; Extended_Pictographic# E0.6 [1] (🈯) Japanese “reserved” button
+1F232..1F23A ; Extended_Pictographic# E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button
+1F23C..1F23F ; Extended_Pictographic# E0.0 [4] (🈼..🈿) <reserved-1F23C>..<reserved-1F23F>
+1F249..1F24F ; Extended_Pictographic# E0.0 [7] (🉉..🉏) <reserved-1F249>..<reserved-1F24F>
+1F250..1F251 ; Extended_Pictographic# E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
+1F252..1F2FF ; Extended_Pictographic# E0.0 [174] (🉒..🋿) <reserved-1F252>..<reserved-1F2FF>
+1F300..1F30C ; Extended_Pictographic# E0.6 [13] (🌀..🌌) cyclone..milky way
+1F30D..1F30E ; Extended_Pictographic# E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas
+1F30F ; Extended_Pictographic# E0.6 [1] (🌏) globe showing Asia-Australia
+1F310 ; Extended_Pictographic# E1.0 [1] (🌐) globe with meridians
+1F311 ; Extended_Pictographic# E0.6 [1] (🌑) new moon
+1F312 ; Extended_Pictographic# E1.0 [1] (🌒) waxing crescent moon
+1F313..1F315 ; Extended_Pictographic# E0.6 [3] (🌓..🌕) first quarter moon..full moon
+1F316..1F318 ; Extended_Pictographic# E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon
+1F319 ; Extended_Pictographic# E0.6 [1] (🌙) crescent moon
+1F31A ; Extended_Pictographic# E1.0 [1] (🌚) new moon face
+1F31B ; Extended_Pictographic# E0.6 [1] (🌛) first quarter moon face
+1F31C ; Extended_Pictographic# E0.7 [1] (🌜) last quarter moon face
+1F31D..1F31E ; Extended_Pictographic# E1.0 [2] (🌝..🌞) full moon face..sun with face
+1F31F..1F320 ; Extended_Pictographic# E0.6 [2] (🌟..🌠) glowing star..shooting star
+1F321 ; Extended_Pictographic# E0.7 [1] (🌡️) thermometer
+1F322..1F323 ; Extended_Pictographic# E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN
+1F324..1F32C ; Extended_Pictographic# E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face
+1F32D..1F32F ; Extended_Pictographic# E1.0 [3] (🌭..🌯) hot dog..burrito
+1F330..1F331 ; Extended_Pictographic# E0.6 [2] (🌰..🌱) chestnut..seedling
+1F332..1F333 ; Extended_Pictographic# E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree
+1F334..1F335 ; Extended_Pictographic# E0.6 [2] (🌴..🌵) palm tree..cactus
+1F336 ; Extended_Pictographic# E0.7 [1] (🌶️) hot pepper
+1F337..1F34A ; Extended_Pictographic# E0.6 [20] (🌷..🍊) tulip..tangerine
+1F34B ; Extended_Pictographic# E1.0 [1] (🍋) lemon
+1F34C..1F34F ; Extended_Pictographic# E0.6 [4] (🍌..🍏) banana..green apple
+1F350 ; Extended_Pictographic# E1.0 [1] (🍐) pear
+1F351..1F37B ; Extended_Pictographic# E0.6 [43] (🍑..🍻) peach..clinking beer mugs
+1F37C ; Extended_Pictographic# E1.0 [1] (🍼) baby bottle
+1F37D ; Extended_Pictographic# E0.7 [1] (🍽️) fork and knife with plate
+1F37E..1F37F ; Extended_Pictographic# E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn
+1F380..1F393 ; Extended_Pictographic# E0.6 [20] (🎀..🎓) ribbon..graduation cap
+1F394..1F395 ; Extended_Pictographic# E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS
+1F396..1F397 ; Extended_Pictographic# E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon
+1F398 ; Extended_Pictographic# E0.0 [1] (🎘) MUSICAL KEYBOARD WITH JACKS
+1F399..1F39B ; Extended_Pictographic# E0.7 [3] (🎙️..🎛️) studio microphone..control knobs
+1F39C..1F39D ; Extended_Pictographic# E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES
+1F39E..1F39F ; Extended_Pictographic# E0.7 [2] (🎞️..🎟️) film frames..admission tickets
+1F3A0..1F3C4 ; Extended_Pictographic# E0.6 [37] (🎠..🏄) carousel horse..person surfing
+1F3C5 ; Extended_Pictographic# E1.0 [1] (🏅) sports medal
+1F3C6 ; Extended_Pictographic# E0.6 [1] (🏆) trophy
+1F3C7 ; Extended_Pictographic# E1.0 [1] (🏇) horse racing
+1F3C8 ; Extended_Pictographic# E0.6 [1] (🏈) american football
+1F3C9 ; Extended_Pictographic# E1.0 [1] (🏉) rugby football
+1F3CA ; Extended_Pictographic# E0.6 [1] (🏊) person swimming
+1F3CB..1F3CE ; Extended_Pictographic# E0.7 [4] (🏋️..🏎️) person lifting weights..racing car
+1F3CF..1F3D3 ; Extended_Pictographic# E1.0 [5] (🏏..🏓) cricket game..ping pong
+1F3D4..1F3DF ; Extended_Pictographic# E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium
+1F3E0..1F3E3 ; Extended_Pictographic# E0.6 [4] (🏠..🏣) house..Japanese post office
+1F3E4 ; Extended_Pictographic# E1.0 [1] (🏤) post office
+1F3E5..1F3F0 ; Extended_Pictographic# E0.6 [12] (🏥..🏰) hospital..castle
+1F3F1..1F3F2 ; Extended_Pictographic# E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT
+1F3F3 ; Extended_Pictographic# E0.7 [1] (🏳️) white flag
+1F3F4 ; Extended_Pictographic# E1.0 [1] (🏴) black flag
+1F3F5 ; Extended_Pictographic# E0.7 [1] (🏵️) rosette
+1F3F6 ; Extended_Pictographic# E0.0 [1] (🏶) BLACK ROSETTE
+1F3F7 ; Extended_Pictographic# E0.7 [1] (🏷️) label
+1F3F8..1F3FA ; Extended_Pictographic# E1.0 [3] (🏸..🏺) badminton..amphora
+1F400..1F407 ; Extended_Pictographic# E1.0 [8] (🐀..🐇) rat..rabbit
+1F408 ; Extended_Pictographic# E0.7 [1] (🐈) cat
+1F409..1F40B ; Extended_Pictographic# E1.0 [3] (🐉..🐋) dragon..whale
+1F40C..1F40E ; Extended_Pictographic# E0.6 [3] (🐌..🐎) snail..horse
+1F40F..1F410 ; Extended_Pictographic# E1.0 [2] (🐏..🐐) ram..goat
+1F411..1F412 ; Extended_Pictographic# E0.6 [2] (🐑..🐒) ewe..monkey
+1F413 ; Extended_Pictographic# E1.0 [1] (🐓) rooster
+1F414 ; Extended_Pictographic# E0.6 [1] (🐔) chicken
+1F415 ; Extended_Pictographic# E0.7 [1] (🐕) dog
+1F416 ; Extended_Pictographic# E1.0 [1] (🐖) pig
+1F417..1F429 ; Extended_Pictographic# E0.6 [19] (🐗..🐩) boar..poodle
+1F42A ; Extended_Pictographic# E1.0 [1] (🐪) camel
+1F42B..1F43E ; Extended_Pictographic# E0.6 [20] (🐫..🐾) two-hump camel..paw prints
+1F43F ; Extended_Pictographic# E0.7 [1] (🐿️) chipmunk
+1F440 ; Extended_Pictographic# E0.6 [1] (👀) eyes
+1F441 ; Extended_Pictographic# E0.7 [1] (👁️) eye
+1F442..1F464 ; Extended_Pictographic# E0.6 [35] (👂..👤) ear..bust in silhouette
+1F465 ; Extended_Pictographic# E1.0 [1] (👥) busts in silhouette
+1F466..1F46B ; Extended_Pictographic# E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Extended_Pictographic# E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F4AC ; Extended_Pictographic# E0.6 [63] (👮..💬) police officer..speech balloon
+1F4AD ; Extended_Pictographic# E1.0 [1] (💭) thought balloon
+1F4AE..1F4B5 ; Extended_Pictographic# E0.6 [8] (💮..💵) white flower..dollar banknote
+1F4B6..1F4B7 ; Extended_Pictographic# E1.0 [2] (💶..💷) euro banknote..pound banknote
+1F4B8..1F4EB ; Extended_Pictographic# E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Extended_Pictographic# E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Extended_Pictographic# E0.6 [1] (📮) postbox
+1F4EF ; Extended_Pictographic# E1.0 [1] (📯) postal horn
+1F4F0..1F4F4 ; Extended_Pictographic# E0.6 [5] (📰..📴) newspaper..mobile phone off
+1F4F5 ; Extended_Pictographic# E1.0 [1] (📵) no mobile phones
+1F4F6..1F4F7 ; Extended_Pictographic# E0.6 [2] (📶..📷) antenna bars..camera
+1F4F8 ; Extended_Pictographic# E1.0 [1] (📸) camera with flash
+1F4F9..1F4FC ; Extended_Pictographic# E0.6 [4] (📹..📼) video camera..videocassette
+1F4FD ; Extended_Pictographic# E0.7 [1] (📽️) film projector
+1F4FE ; Extended_Pictographic# E0.0 [1] (📾) PORTABLE STEREO
+1F4FF..1F502 ; Extended_Pictographic# E1.0 [4] (📿..🔂) prayer beads..repeat single button
+1F503 ; Extended_Pictographic# E0.6 [1] (🔃) clockwise vertical arrows
+1F504..1F507 ; Extended_Pictographic# E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker
+1F508 ; Extended_Pictographic# E0.7 [1] (🔈) speaker low volume
+1F509 ; Extended_Pictographic# E1.0 [1] (🔉) speaker medium volume
+1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (🔊..🔔) speaker high volume..bell
+1F515 ; Extended_Pictographic# E1.0 [1] (🔕) bell with slash
+1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..water pistol
+1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (🔬..🔭) microscope..telescope
+1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (🔮..🔽) crystal ball..downwards button
+1F546..1F548 ; Extended_Pictographic# E0.0 [3] (🕆..🕈) WHITE LATIN CROSS..CELTIC CROSS
+1F549..1F54A ; Extended_Pictographic# E0.7 [2] (🕉️..🕊️) om..dove
+1F54B..1F54E ; Extended_Pictographic# E1.0 [4] (🕋..🕎) kaaba..menorah
+1F54F ; Extended_Pictographic# E0.0 [1] (🕏) BOWL OF HYGIEIA
+1F550..1F55B ; Extended_Pictographic# E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock
+1F55C..1F567 ; Extended_Pictographic# E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty
+1F568..1F56E ; Extended_Pictographic# E0.0 [7] (🕨..🕮) RIGHT SPEAKER..BOOK
+1F56F..1F570 ; Extended_Pictographic# E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock
+1F571..1F572 ; Extended_Pictographic# E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY
+1F573..1F579 ; Extended_Pictographic# E0.7 [7] (🕳️..🕹️) hole..joystick
+1F57A ; Extended_Pictographic# E3.0 [1] (🕺) man dancing
+1F57B..1F586 ; Extended_Pictographic# E0.0 [12] (🕻..🖆) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE
+1F587 ; Extended_Pictographic# E0.7 [1] (🖇️) linked paperclips
+1F588..1F589 ; Extended_Pictographic# E0.0 [2] (🖈..🖉) BLACK PUSHPIN..LOWER LEFT PENCIL
+1F58A..1F58D ; Extended_Pictographic# E0.7 [4] (🖊️..🖍️) pen..crayon
+1F58E..1F58F ; Extended_Pictographic# E0.0 [2] (🖎..🖏) LEFT WRITING HAND..TURNED OK HAND SIGN
+1F590 ; Extended_Pictographic# E0.7 [1] (🖐️) hand with fingers splayed
+1F591..1F594 ; Extended_Pictographic# E0.0 [4] (🖑..🖔) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND
+1F595..1F596 ; Extended_Pictographic# E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F597..1F5A3 ; Extended_Pictographic# E0.0 [13] (🖗..🖣) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX
+1F5A4 ; Extended_Pictographic# E3.0 [1] (🖤) black heart
+1F5A5 ; Extended_Pictographic# E0.7 [1] (🖥️) desktop computer
+1F5A6..1F5A7 ; Extended_Pictographic# E0.0 [2] (🖦..🖧) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS
+1F5A8 ; Extended_Pictographic# E0.7 [1] (🖨️) printer
+1F5A9..1F5B0 ; Extended_Pictographic# E0.0 [8] (🖩..🖰) POCKET CALCULATOR..TWO BUTTON MOUSE
+1F5B1..1F5B2 ; Extended_Pictographic# E0.7 [2] (🖱️..🖲️) computer mouse..trackball
+1F5B3..1F5BB ; Extended_Pictographic# E0.0 [9] (🖳..🖻) OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE
+1F5BC ; Extended_Pictographic# E0.7 [1] (🖼️) framed picture
+1F5BD..1F5C1 ; Extended_Pictographic# E0.0 [5] (🖽..🗁) FRAME WITH TILES..OPEN FOLDER
+1F5C2..1F5C4 ; Extended_Pictographic# E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet
+1F5C5..1F5D0 ; Extended_Pictographic# E0.0 [12] (🗅..🗐) EMPTY NOTE..PAGES
+1F5D1..1F5D3 ; Extended_Pictographic# E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar
+1F5D4..1F5DB ; Extended_Pictographic# E0.0 [8] (🗔..🗛) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL
+1F5DC..1F5DE ; Extended_Pictographic# E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper
+1F5DF..1F5E0 ; Extended_Pictographic# E0.0 [2] (🗟..🗠) PAGE WITH CIRCLED TEXT..STOCK CHART
+1F5E1 ; Extended_Pictographic# E0.7 [1] (🗡️) dagger
+1F5E2 ; Extended_Pictographic# E0.0 [1] (🗢) LIPS
+1F5E3 ; Extended_Pictographic# E0.7 [1] (🗣️) speaking head
+1F5E4..1F5E7 ; Extended_Pictographic# E0.0 [4] (🗤..🗧) THREE RAYS ABOVE..THREE RAYS RIGHT
+1F5E8 ; Extended_Pictographic# E2.0 [1] (🗨️) left speech bubble
+1F5E9..1F5EE ; Extended_Pictographic# E0.0 [6] (🗩..🗮) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE
+1F5EF ; Extended_Pictographic# E0.7 [1] (🗯️) right anger bubble
+1F5F0..1F5F2 ; Extended_Pictographic# E0.0 [3] (🗰..🗲) MOOD BUBBLE..LIGHTNING MOOD
+1F5F3 ; Extended_Pictographic# E0.7 [1] (🗳️) ballot box with ballot
+1F5F4..1F5F9 ; Extended_Pictographic# E0.0 [6] (🗴..🗹) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK
+1F5FA ; Extended_Pictographic# E0.7 [1] (🗺️) world map
+1F5FB..1F5FF ; Extended_Pictographic# E0.6 [5] (🗻..🗿) mount fuji..moai
+1F600 ; Extended_Pictographic# E1.0 [1] (😀) grinning face
+1F601..1F606 ; Extended_Pictographic# E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Extended_Pictographic# E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns
+1F609..1F60D ; Extended_Pictographic# E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes
+1F60E ; Extended_Pictographic# E1.0 [1] (😎) smiling face with sunglasses
+1F60F ; Extended_Pictographic# E0.6 [1] (😏) smirking face
+1F610 ; Extended_Pictographic# E0.7 [1] (😐) neutral face
+1F611 ; Extended_Pictographic# E1.0 [1] (😑) expressionless face
+1F612..1F614 ; Extended_Pictographic# E0.6 [3] (😒..😔) unamused face..pensive face
+1F615 ; Extended_Pictographic# E1.0 [1] (😕) confused face
+1F616 ; Extended_Pictographic# E0.6 [1] (😖) confounded face
+1F617 ; Extended_Pictographic# E1.0 [1] (😗) kissing face
+1F618 ; Extended_Pictographic# E0.6 [1] (😘) face blowing a kiss
+1F619 ; Extended_Pictographic# E1.0 [1] (😙) kissing face with smiling eyes
+1F61A ; Extended_Pictographic# E0.6 [1] (😚) kissing face with closed eyes
+1F61B ; Extended_Pictographic# E1.0 [1] (😛) face with tongue
+1F61C..1F61E ; Extended_Pictographic# E0.6 [3] (😜..😞) winking face with tongue..disappointed face
+1F61F ; Extended_Pictographic# E1.0 [1] (😟) worried face
+1F620..1F625 ; Extended_Pictographic# E0.6 [6] (😠..😥) angry face..sad but relieved face
+1F626..1F627 ; Extended_Pictographic# E1.0 [2] (😦..😧) frowning face with open mouth..anguished face
+1F628..1F62B ; Extended_Pictographic# E0.6 [4] (😨..😫) fearful face..tired face
+1F62C ; Extended_Pictographic# E1.0 [1] (😬) grimacing face
+1F62D ; Extended_Pictographic# E0.6 [1] (😭) loudly crying face
+1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (😮..😯) face with open mouth..hushed face
+1F630..1F633 ; Extended_Pictographic# E0.6 [4] (😰..😳) anxious face with sweat..flushed face
+1F634 ; Extended_Pictographic# E1.0 [1] (😴) sleeping face
+1F635 ; Extended_Pictographic# E0.6 [1] (😵) face with crossed-out eyes
+1F636 ; Extended_Pictographic# E1.0 [1] (😶) face without mouth
+1F637..1F640 ; Extended_Pictographic# E0.6 [10] (😷..🙀) face with medical mask..weary cat
+1F641..1F644 ; Extended_Pictographic# E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Extended_Pictographic# E0.6 [11] (🙅..🙏) person gesturing NO..folded hands
+1F680 ; Extended_Pictographic# E0.6 [1] (🚀) rocket
+1F681..1F682 ; Extended_Pictographic# E1.0 [2] (🚁..🚂) helicopter..locomotive
+1F683..1F685 ; Extended_Pictographic# E0.6 [3] (🚃..🚅) railway car..bullet train
+1F686 ; Extended_Pictographic# E1.0 [1] (🚆) train
+1F687 ; Extended_Pictographic# E0.6 [1] (🚇) metro
+1F688 ; Extended_Pictographic# E1.0 [1] (🚈) light rail
+1F689 ; Extended_Pictographic# E0.6 [1] (🚉) station
+1F68A..1F68B ; Extended_Pictographic# E1.0 [2] (🚊..🚋) tram..tram car
+1F68C ; Extended_Pictographic# E0.6 [1] (🚌) bus
+1F68D ; Extended_Pictographic# E0.7 [1] (🚍) oncoming bus
+1F68E ; Extended_Pictographic# E1.0 [1] (🚎) trolleybus
+1F68F ; Extended_Pictographic# E0.6 [1] (🚏) bus stop
+1F690 ; Extended_Pictographic# E1.0 [1] (🚐) minibus
+1F691..1F693 ; Extended_Pictographic# E0.6 [3] (🚑..🚓) ambulance..police car
+1F694 ; Extended_Pictographic# E0.7 [1] (🚔) oncoming police car
+1F695 ; Extended_Pictographic# E0.6 [1] (🚕) taxi
+1F696 ; Extended_Pictographic# E1.0 [1] (🚖) oncoming taxi
+1F697 ; Extended_Pictographic# E0.6 [1] (🚗) automobile
+1F698 ; Extended_Pictographic# E0.7 [1] (🚘) oncoming automobile
+1F699..1F69A ; Extended_Pictographic# E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Extended_Pictographic# E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway
+1F6A2 ; Extended_Pictographic# E0.6 [1] (🚢) ship
+1F6A3 ; Extended_Pictographic# E1.0 [1] (🚣) person rowing boat
+1F6A4..1F6A5 ; Extended_Pictographic# E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light
+1F6A6 ; Extended_Pictographic# E1.0 [1] (🚦) vertical traffic light
+1F6A7..1F6AD ; Extended_Pictographic# E0.6 [7] (🚧..🚭) construction..no smoking
+1F6AE..1F6B1 ; Extended_Pictographic# E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water
+1F6B2 ; Extended_Pictographic# E0.6 [1] (🚲) bicycle
+1F6B3..1F6B5 ; Extended_Pictographic# E1.0 [3] (🚳..🚵) no bicycles..person mountain biking
+1F6B6 ; Extended_Pictographic# E0.6 [1] (🚶) person walking
+1F6B7..1F6B8 ; Extended_Pictographic# E1.0 [2] (🚷..🚸) no pedestrians..children crossing
+1F6B9..1F6BE ; Extended_Pictographic# E0.6 [6] (🚹..🚾) men’s room..water closet
+1F6BF ; Extended_Pictographic# E1.0 [1] (🚿) shower
+1F6C0 ; Extended_Pictographic# E0.6 [1] (🛀) person taking bath
+1F6C1..1F6C5 ; Extended_Pictographic# E1.0 [5] (🛁..🛅) bathtub..left luggage
+1F6C6..1F6CA ; Extended_Pictographic# E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL
+1F6CB ; Extended_Pictographic# E0.7 [1] (🛋️) couch and lamp
+1F6CC ; Extended_Pictographic# E1.0 [1] (🛌) person in bed
+1F6CD..1F6CF ; Extended_Pictographic# E0.7 [3] (🛍️..🛏️) shopping bags..bed
+1F6D0 ; Extended_Pictographic# E1.0 [1] (🛐) place of worship
+1F6D1..1F6D2 ; Extended_Pictographic# E3.0 [2] (🛑..🛒) stop sign..shopping cart
+1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (🛓..🛔) STUPA..PAGODA
+1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple
+1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator
+1F6D8..1F6DB ; Extended_Pictographic# E0.0 [4] (🛘..🛛) <reserved-1F6D8>..<reserved-1F6DB>
+1F6DC ; Extended_Pictographic# E15.0 [1] (🛜) wireless
+1F6DD..1F6DF ; Extended_Pictographic# E14.0 [3] (🛝..🛟) playground slide..ring buoy
+1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat
+1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE
+1F6E9 ; Extended_Pictographic# E0.7 [1] (🛩️) small airplane
+1F6EA ; Extended_Pictographic# E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE
+1F6EB..1F6EC ; Extended_Pictographic# E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
+1F6ED..1F6EF ; Extended_Pictographic# E0.0 [3] (🛭..🛯) <reserved-1F6ED>..<reserved-1F6EF>
+1F6F0 ; Extended_Pictographic# E0.7 [1] (🛰️) satellite
+1F6F1..1F6F2 ; Extended_Pictographic# E0.0 [2] (🛱..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE
+1F6F3 ; Extended_Pictographic# E0.7 [1] (🛳️) passenger ship
+1F6F4..1F6F6 ; Extended_Pictographic# E3.0 [3] (🛴..🛶) kick scooter..canoe
+1F6F7..1F6F8 ; Extended_Pictographic# E5.0 [2] (🛷..🛸) sled..flying saucer
+1F6F9 ; Extended_Pictographic# E11.0 [1] (🛹) skateboard
+1F6FA ; Extended_Pictographic# E12.0 [1] (🛺) auto rickshaw
+1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (🛻..🛼) pickup truck..roller skate
+1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (🛽..🛿) <reserved-1F6FD>..<reserved-1F6FF>
+1F774..1F77F ; Extended_Pictographic# E0.0 [12] (🝴..🝿) LOT OF FORTUNE..ORCUS
+1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (🟕..🟟) CIRCLED TRIANGLE..<reserved-1F7DF>
+1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7EC..1F7EF ; Extended_Pictographic# E0.0 [4] (🟬..🟯) <reserved-1F7EC>..<reserved-1F7EF>
+1F7F0 ; Extended_Pictographic# E14.0 [1] (🟰) heavy equals sign
+1F7F1..1F7FF ; Extended_Pictographic# E0.0 [15] (🟱..🟿) <reserved-1F7F1>..<reserved-1F7FF>
+1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (🠌..🠏) <reserved-1F80C>..<reserved-1F80F>
+1F848..1F84F ; Extended_Pictographic# E0.0 [8] (🡈..🡏) <reserved-1F848>..<reserved-1F84F>
+1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (🡚..🡟) <reserved-1F85A>..<reserved-1F85F>
+1F888..1F88F ; Extended_Pictographic# E0.0 [8] (🢈..🢏) <reserved-1F888>..<reserved-1F88F>
+1F8AE..1F8FF ; Extended_Pictographic# E0.0 [82] (🢮..🣿) <reserved-1F8AE>..<reserved-1F8FF>
+1F90C ; Extended_Pictographic# E13.0 [1] (🤌) pinched fingers
+1F90D..1F90F ; Extended_Pictographic# E12.0 [3] (🤍..🤏) white heart..pinching hand
+1F910..1F918 ; Extended_Pictographic# E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
+1F919..1F91E ; Extended_Pictographic# E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Extended_Pictographic# E5.0 [1] (🤟) love-you gesture
+1F920..1F927 ; Extended_Pictographic# E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face
+1F928..1F92F ; Extended_Pictographic# E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
+1F930 ; Extended_Pictographic# E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Extended_Pictographic# E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F93A ; Extended_Pictographic# E3.0 [8] (🤳..🤺) selfie..person fencing
+1F93C..1F93E ; Extended_Pictographic# E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F93F ; Extended_Pictographic# E12.0 [1] (🤿) diving mask
+1F940..1F945 ; Extended_Pictographic# E3.0 [6] (🥀..🥅) wilted flower..goal net
+1F947..1F94B ; Extended_Pictographic# E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
+1F94C ; Extended_Pictographic# E5.0 [1] (🥌) curling stone
+1F94D..1F94F ; Extended_Pictographic# E11.0 [3] (🥍..🥏) lacrosse..flying disc
+1F950..1F95E ; Extended_Pictographic# E3.0 [15] (🥐..🥞) croissant..pancakes
+1F95F..1F96B ; Extended_Pictographic# E5.0 [13] (🥟..🥫) dumpling..canned food
+1F96C..1F970 ; Extended_Pictographic# E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
+1F971 ; Extended_Pictographic# E12.0 [1] (🥱) yawning face
+1F972 ; Extended_Pictographic# E13.0 [1] (🥲) smiling face with tear
+1F973..1F976 ; Extended_Pictographic# E11.0 [4] (🥳..🥶) partying face..cold face
+1F977..1F978 ; Extended_Pictographic# E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Extended_Pictographic# E14.0 [1] (🥹) face holding back tears
+1F97A ; Extended_Pictographic# E11.0 [1] (🥺) pleading face
+1F97B ; Extended_Pictographic# E12.0 [1] (🥻) sari
+1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (🥼..🥿) lab coat..flat shoe
+1F980..1F984 ; Extended_Pictographic# E1.0 [5] (🦀..🦄) crab..unicorn
+1F985..1F991 ; Extended_Pictographic# E3.0 [13] (🦅..🦑) eagle..squid
+1F992..1F997 ; Extended_Pictographic# E5.0 [6] (🦒..🦗) giraffe..cricket
+1F998..1F9A2 ; Extended_Pictographic# E11.0 [11] (🦘..🦢) kangaroo..swan
+1F9A3..1F9A4 ; Extended_Pictographic# E13.0 [2] (🦣..🦤) mammoth..dodo
+1F9A5..1F9AA ; Extended_Pictographic# E12.0 [6] (🦥..🦪) sloth..oyster
+1F9AB..1F9AD ; Extended_Pictographic# E13.0 [3] (🦫..🦭) beaver..seal
+1F9AE..1F9AF ; Extended_Pictographic# E12.0 [2] (🦮..🦯) guide dog..white cane
+1F9B0..1F9B9 ; Extended_Pictographic# E11.0 [10] (🦰..🦹) red hair..supervillain
+1F9BA..1F9BF ; Extended_Pictographic# E12.0 [6] (🦺..🦿) safety vest..mechanical leg
+1F9C0 ; Extended_Pictographic# E1.0 [1] (🧀) cheese wedge
+1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (🧁..🧂) cupcake..salt
+1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (🧃..🧊) beverage box..ice
+1F9CB ; Extended_Pictographic# E13.0 [1] (🧋) bubble tea
+1F9CC ; Extended_Pictographic# E14.0 [1] (🧌) troll
+1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (🧐..🧦) face with monocle..socks
+1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (🧧..🧿) red envelope..nazar amulet
+1FA00..1FA6F ; Extended_Pictographic# E0.0 [112] (🨀..🩯) NEUTRAL CHESS KING..<reserved-1FA6F>
+1FA70..1FA73 ; Extended_Pictographic# E12.0 [4] (🩰..🩳) ballet shoes..shorts
+1FA74 ; Extended_Pictographic# E13.0 [1] (🩴) thong sandal
+1FA75..1FA77 ; Extended_Pictographic# E15.0 [3] (🩵..🩷) light blue heart..pink heart
+1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Extended_Pictographic# E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA7D..1FA7F ; Extended_Pictographic# E0.0 [3] (🩽..🩿) <reserved-1FA7D>..<reserved-1FA7F>
+1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (🪀..🪂) yo-yo..parachute
+1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (🪃..🪆) boomerang..nesting dolls
+1FA87..1FA88 ; Extended_Pictographic# E15.0 [2] (🪇..🪈) maracas..flute
+1FA89..1FA8F ; Extended_Pictographic# E0.0 [7] (🪉..🪏) <reserved-1FA89>..<reserved-1FA8F>
+1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (🪐..🪕) ringed planet..banjo
+1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Extended_Pictographic# E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Extended_Pictographic# E15.0 [3] (🪭..🪯) folding hand fan..khanda
+1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Extended_Pictographic# E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABD ; Extended_Pictographic# E15.0 [3] (🪻..🪽) hyacinth..wing
+1FABE ; Extended_Pictographic# E0.0 [1] (🪾) <reserved-1FABE>
+1FABF ; Extended_Pictographic# E15.0 [1] (🪿) goose
+1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Extended_Pictographic# E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FAC6..1FACD ; Extended_Pictographic# E0.0 [8] (🫆..🫍) <reserved-1FAC6>..<reserved-1FACD>
+1FACE..1FACF ; Extended_Pictographic# E15.0 [2] (🫎..🫏) moose..donkey
+1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (🫐..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Extended_Pictographic# E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADB ; Extended_Pictographic# E15.0 [2] (🫚..🫛) ginger root..pea pod
+1FADC..1FADF ; Extended_Pictographic# E0.0 [4] (🫜..🫟) <reserved-1FADC>..<reserved-1FADF>
+1FAE0..1FAE7 ; Extended_Pictographic# E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8 ; Extended_Pictographic# E15.0 [1] (🫨) shaking face
+1FAE9..1FAEF ; Extended_Pictographic# E0.0 [7] (🫩..🫯) <reserved-1FAE9>..<reserved-1FAEF>
+1FAF0..1FAF6 ; Extended_Pictographic# E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Extended_Pictographic# E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+1FAF9..1FAFF ; Extended_Pictographic# E0.0 [7] (🫹..🫿) <reserved-1FAF9>..<reserved-1FAFF>
+1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (🰀..🿽) <reserved-1FC00>..<reserved-1FFFD>
+
+# Total elements: 3537
+
+#EOF
diff --git a/vendor/librune/gen/gbrk b/vendor/librune/gen/gbrk
new file mode 100755
index 0000000..5cbd87f
--- /dev/null
+++ b/vendor/librune/gen/gbrk
@@ -0,0 +1,115 @@
+#!/bin/sh
+
+cache()
+{
+ name="/tmp/librune/$(basename "$1")"
+ if test ! -f "$name"
+ then
+ mkdir -p /tmp/librune
+ wget -q "$1" -O "$name"
+ fi
+}
+
+set -e
+cd "${0%/*}/.."
+exec >lib/internal/gbrk_lookup.h
+
+readonly URL1='https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt'
+readonly URL2='https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt'
+readonly URL3='https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt'
+
+cache "$URL1" &
+cache "$URL2" &
+cache "$URL3" &
+wait
+
+cat <<C
+/* This file is autogenerated by gen/gbrk; DO NOT EDIT. */
+
+/* TODO: Change tables to constexpr from const when Clangd gets better */
+
+#ifndef RUNE_INTERNAL_GBRK_LOOKUP_H
+#define RUNE_INTERNAL_GBRK_LOOKUP_H
+
+/* clang-format off */
+
+#include "types.h"
+
+typedef enum {
+ GBP_OTHER = 0,
+
+ GBP_CTRL = 1 << 0, /* Control */
+ GBP_EXT = 1 << 1, /* Extend */
+ GBP_PIC = 1 << 2, /* Extended_Pictographic */
+ GBP_PREP = 1 << 3, /* Prepend */
+ GBP_RI = 1 << 4, /* Regional_Indicator */
+ GBP_SM = 1 << 5, /* SpacingMark */
+ GBP_ZWJ = 1 << 6, /* ZWJ */
+
+ GBP_HNGL_L = 1 << 7, /* Hangul L */
+ GBP_HNGL_LV = 1 << 8, /* Hangul LV */
+ GBP_HNGL_LVT = 1 << 9, /* Hangul LVT */
+ GBP_HNGL_T = 1 << 10, /* Hangul T */
+ GBP_HNGL_V = 1 << 11, /* Hangul V */
+
+ GBP_INDC_CNSNT = 1 << 12, /* Indic Consonant */
+ GBP_INDC_EXT = 1 << 13, /* Indic Extend */
+ GBP_INDC_LNK = 1 << 14, /* Indic Linker */
+} gbrk_prop;
+
+static const struct {
+ rune lo, hi;
+ gbrk_prop prop;
+} gbrk_prop_tbl[] = {
+C
+
+gawk '
+BEGIN {
+ FS = "( *#.*| +; +)"
+ map["Control"] = "CTRL"
+ map["Extend"] = "EXT"
+ map["Extended_Pictographic"] = "PIC"
+ map["Prepend"] = "PREP"
+ map["Regional_Indicator"] = "RI"
+ map["SpacingMark"] = "SM"
+ map["ZWJ"] = "ZWJ"
+
+ map["L"] = "HNGL_L"
+ map["LV"] = "HNGL_LV"
+ map["LVT"] = "HNGL_LVT"
+ map["T"] = "HNGL_T"
+ map["V"] = "HNGL_V"
+
+ map["InCB; Consonant"] = "INDC_CNSNT"
+ map["InCB; Extend"] = "INDC_EXT"
+ map["InCB; Linker"] = "INDC_LNK"
+}
+
+map[$2] {
+ n = split($1, a, /\.\./)
+ lo = strtonum("0X" a[1])
+ hi = strtonum("0X" a[n])
+
+ for (i = lo; i <= hi; i++) {
+ s = "GBP_" map[$2]
+ props[i] = props[i] ? props[i] " | " s : s
+ }
+}
+
+END {
+ for (i = 0; i <= 0x10FFFF; i++) {
+ if (!props[i])
+ continue
+ lo = i
+ while (props[lo] == props[i + 1])
+ i++
+ printf "\t{0x%05X, 0x%05X, %s},\n", lo, i, props[lo]
+ }
+}
+' /tmp/librune/* | sort
+
+cat <<C
+};
+
+#endif /* !RUNE_INTERNAL_GBRK_LOOKUP_H */
+C
diff --git a/vendor/librune/gen/mkfile b/vendor/librune/gen/mkfile
new file mode 100755
index 0000000..a55b08a
--- /dev/null
+++ b/vendor/librune/gen/mkfile
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+set -e
+cd "${0%/*}/.."
+exec >Makefile
+
+cat <<make
+.POSIX:
+
+CC = cc
+CFLAGS = -Wall -Wextra -Wpedantic -g -ggdb3 -fanalyzer -Iinclude
+
+make
+
+printf 'objs = \\\n'
+find lib -name '*.c' | sort | sed '
+ s/c$/o/
+ s/.*/\t& \\/
+ $s/ \\$//
+'
+
+cat <<make
+
+all: \$(objs)
+
+make
+
+find lib -name '*.c' | sort | sed -E 's/(.*)c$/\1o: \1c/'
+
+cat <<make
+
+clean:
+ find lib -name '*.o' -delete
+
+ls:
+ @echo "alias ls='ls --color=auto -I \"*.o\" -I \"compile_commands.json\"'" >&2
+make
diff --git a/vendor/librune/include/gbrk.h b/vendor/librune/include/gbrk.h
new file mode 100644
index 0000000..5eef882
--- /dev/null
+++ b/vendor/librune/include/gbrk.h
@@ -0,0 +1,10 @@
+#ifndef RUNE_GBRK_H
+#define RUNE_GBRK_H
+
+#define _RUNE_NEEDS_U8VIEW 1
+#include "internal/types.h" /* IWYU pragma: export */
+
+size_t u8glen(const char8_t *, size_t);
+const char8_t *u8gnext(struct u8view *, const char8_t **, size_t *);
+
+#endif /* !RUNE_GBRK_H */
diff --git a/vendor/librune/include/internal/common.h b/vendor/librune/include/internal/common.h
new file mode 100644
index 0000000..7107528
--- /dev/null
+++ b/vendor/librune/include/internal/common.h
@@ -0,0 +1,39 @@
+#ifndef RUNE_INTERNAL_COMMON_H
+#define RUNE_INTERNAL_COMMON_H
+
+#if __STDC_VERSION__ >= 202311L
+# define RUNE_IS_23 1
+#endif
+
+#if !RUNE_IS_23
+# include <stddef.h> /* IWYU pragma: export */
+# define nullptr NULL
+#endif
+
+#ifndef unreachable
+# if RUNE_IS_23
+# include <stddef.h> /* IWYU pragma: export */
+# elif defined(__GNUC__) || defined(__clang__)
+# define unreachable() __builtin_unreachable()
+# else
+# define unreachable() \
+ do \
+ *(int *)0 = 0; \
+ while (0)
+# endif
+#endif
+
+#define U1(x) (((x)&0x80) == 0x00)
+#define U2(x) (((x)&0xE0) == 0xC0)
+#define U3(x) (((x)&0xF0) == 0xE0)
+#define U4(x) (((x)&0xF8) == 0xF0)
+#define UC(x) (((x)&0xC0) == 0x80)
+
+/* Maximum value of a 1–4-byte long UTF-8 sequence */
+#include "rune.h"
+#define _1B_MAX RUNE_C(0x00007F)
+#define _2B_MAX RUNE_C(0x0007FF)
+#define _3B_MAX RUNE_C(0x00FFFF)
+#define _4B_MAX RUNE_C(0x10FFFF)
+
+#endif /* !RUNE_INTERNAL_COMMON_H */
diff --git a/vendor/librune/include/internal/gbrk_lookup.h b/vendor/librune/include/internal/gbrk_lookup.h
new file mode 100644
index 0000000..39dfa8e
--- /dev/null
+++ b/vendor/librune/include/internal/gbrk_lookup.h
@@ -0,0 +1,1569 @@
+/* This file is autogenerated by gen/gbrk; DO NOT EDIT. */
+
+/* TODO: Change tables to constexpr from const when Clangd gets better */
+
+#ifndef RUNE_INTERNAL_GBRK_LOOKUP_H
+#define RUNE_INTERNAL_GBRK_LOOKUP_H
+
+/* clang-format off */
+
+#include "types.h"
+
+typedef enum {
+ GBP_OTHER = 0,
+
+ GBP_CTRL = 1 << 0, /* Control */
+ GBP_EXT = 1 << 1, /* Extend */
+ GBP_PIC = 1 << 2, /* Extended_Pictographic */
+ GBP_PREP = 1 << 3, /* Prepend */
+ GBP_RI = 1 << 4, /* Regional_Indicator */
+ GBP_SM = 1 << 5, /* SpacingMark */
+ GBP_ZWJ = 1 << 6, /* ZWJ */
+
+ GBP_HNGL_L = 1 << 7, /* Hangul L */
+ GBP_HNGL_LV = 1 << 8, /* Hangul LV */
+ GBP_HNGL_LVT = 1 << 9, /* Hangul LVT */
+ GBP_HNGL_T = 1 << 10, /* Hangul T */
+ GBP_HNGL_V = 1 << 11, /* Hangul V */
+
+ GBP_INDC_CNSNT = 1 << 12, /* Indic Consonant */
+ GBP_INDC_EXT = 1 << 13, /* Indic Extend */
+ GBP_INDC_LNK = 1 << 14, /* Indic Linker */
+} gbrk_prop;
+
+static const struct {
+ rune lo, hi;
+ gbrk_prop prop;
+} gbrk_prop_tbl[] = {
+ {0x00000, 0x00009, GBP_CTRL},
+ {0x0000B, 0x0000C, GBP_CTRL},
+ {0x0000E, 0x0001F, GBP_CTRL},
+ {0x0007F, 0x0009F, GBP_CTRL},
+ {0x000A9, 0x000A9, GBP_PIC},
+ {0x000AD, 0x000AD, GBP_CTRL},
+ {0x000AE, 0x000AE, GBP_PIC},
+ {0x00300, 0x0034E, GBP_INDC_EXT | GBP_EXT},
+ {0x0034F, 0x0034F, GBP_EXT},
+ {0x00350, 0x0036F, GBP_INDC_EXT | GBP_EXT},
+ {0x00483, 0x00487, GBP_INDC_EXT | GBP_EXT},
+ {0x00488, 0x00489, GBP_EXT},
+ {0x00591, 0x005BD, GBP_INDC_EXT | GBP_EXT},
+ {0x005BF, 0x005BF, GBP_INDC_EXT | GBP_EXT},
+ {0x005C1, 0x005C2, GBP_INDC_EXT | GBP_EXT},
+ {0x005C4, 0x005C5, GBP_INDC_EXT | GBP_EXT},
+ {0x005C7, 0x005C7, GBP_INDC_EXT | GBP_EXT},
+ {0x00600, 0x00605, GBP_PREP},
+ {0x00610, 0x0061A, GBP_INDC_EXT | GBP_EXT},
+ {0x0061C, 0x0061C, GBP_CTRL},
+ {0x0064B, 0x0065F, GBP_INDC_EXT | GBP_EXT},
+ {0x00670, 0x00670, GBP_INDC_EXT | GBP_EXT},
+ {0x006D6, 0x006DC, GBP_INDC_EXT | GBP_EXT},
+ {0x006DD, 0x006DD, GBP_PREP},
+ {0x006DF, 0x006E4, GBP_INDC_EXT | GBP_EXT},
+ {0x006E7, 0x006E8, GBP_INDC_EXT | GBP_EXT},
+ {0x006EA, 0x006ED, GBP_INDC_EXT | GBP_EXT},
+ {0x0070F, 0x0070F, GBP_PREP},
+ {0x00711, 0x00711, GBP_INDC_EXT | GBP_EXT},
+ {0x00730, 0x0074A, GBP_INDC_EXT | GBP_EXT},
+ {0x007A6, 0x007B0, GBP_EXT},
+ {0x007EB, 0x007F3, GBP_INDC_EXT | GBP_EXT},
+ {0x007FD, 0x007FD, GBP_INDC_EXT | GBP_EXT},
+ {0x00816, 0x00819, GBP_INDC_EXT | GBP_EXT},
+ {0x0081B, 0x00823, GBP_INDC_EXT | GBP_EXT},
+ {0x00825, 0x00827, GBP_INDC_EXT | GBP_EXT},
+ {0x00829, 0x0082D, GBP_INDC_EXT | GBP_EXT},
+ {0x00859, 0x0085B, GBP_INDC_EXT | GBP_EXT},
+ {0x00890, 0x00891, GBP_PREP},
+ {0x00898, 0x0089F, GBP_INDC_EXT | GBP_EXT},
+ {0x008CA, 0x008E1, GBP_INDC_EXT | GBP_EXT},
+ {0x008E2, 0x008E2, GBP_PREP},
+ {0x008E3, 0x008FF, GBP_INDC_EXT | GBP_EXT},
+ {0x00900, 0x00902, GBP_EXT},
+ {0x00903, 0x00903, GBP_SM},
+ {0x00915, 0x00939, GBP_INDC_CNSNT},
+ {0x0093A, 0x0093A, GBP_EXT},
+ {0x0093B, 0x0093B, GBP_SM},
+ {0x0093C, 0x0093C, GBP_INDC_EXT | GBP_EXT},
+ {0x0093E, 0x00940, GBP_SM},
+ {0x00941, 0x00948, GBP_EXT},
+ {0x00949, 0x0094C, GBP_SM},
+ {0x0094D, 0x0094D, GBP_INDC_LNK | GBP_EXT},
+ {0x0094E, 0x0094F, GBP_SM},
+ {0x00951, 0x00954, GBP_INDC_EXT | GBP_EXT},
+ {0x00955, 0x00957, GBP_EXT},
+ {0x00958, 0x0095F, GBP_INDC_CNSNT},
+ {0x00962, 0x00963, GBP_EXT},
+ {0x00978, 0x0097F, GBP_INDC_CNSNT},
+ {0x00981, 0x00981, GBP_EXT},
+ {0x00982, 0x00983, GBP_SM},
+ {0x00995, 0x009A8, GBP_INDC_CNSNT},
+ {0x009AA, 0x009B0, GBP_INDC_CNSNT},
+ {0x009B2, 0x009B2, GBP_INDC_CNSNT},
+ {0x009B6, 0x009B9, GBP_INDC_CNSNT},
+ {0x009BC, 0x009BC, GBP_INDC_EXT | GBP_EXT},
+ {0x009BE, 0x009BE, GBP_EXT},
+ {0x009BF, 0x009C0, GBP_SM},
+ {0x009C1, 0x009C4, GBP_EXT},
+ {0x009C7, 0x009C8, GBP_SM},
+ {0x009CB, 0x009CC, GBP_SM},
+ {0x009CD, 0x009CD, GBP_INDC_LNK | GBP_EXT},
+ {0x009D7, 0x009D7, GBP_EXT},
+ {0x009DC, 0x009DD, GBP_INDC_CNSNT},
+ {0x009DF, 0x009DF, GBP_INDC_CNSNT},
+ {0x009E2, 0x009E3, GBP_EXT},
+ {0x009F0, 0x009F1, GBP_INDC_CNSNT},
+ {0x009FE, 0x009FE, GBP_INDC_EXT | GBP_EXT},
+ {0x00A01, 0x00A02, GBP_EXT},
+ {0x00A03, 0x00A03, GBP_SM},
+ {0x00A3C, 0x00A3C, GBP_INDC_EXT | GBP_EXT},
+ {0x00A3E, 0x00A40, GBP_SM},
+ {0x00A41, 0x00A42, GBP_EXT},
+ {0x00A47, 0x00A48, GBP_EXT},
+ {0x00A4B, 0x00A4D, GBP_EXT},
+ {0x00A51, 0x00A51, GBP_EXT},
+ {0x00A70, 0x00A71, GBP_EXT},
+ {0x00A75, 0x00A75, GBP_EXT},
+ {0x00A81, 0x00A82, GBP_EXT},
+ {0x00A83, 0x00A83, GBP_SM},
+ {0x00A95, 0x00AA8, GBP_INDC_CNSNT},
+ {0x00AAA, 0x00AB0, GBP_INDC_CNSNT},
+ {0x00AB2, 0x00AB3, GBP_INDC_CNSNT},
+ {0x00AB5, 0x00AB9, GBP_INDC_CNSNT},
+ {0x00ABC, 0x00ABC, GBP_INDC_EXT | GBP_EXT},
+ {0x00ABE, 0x00AC0, GBP_SM},
+ {0x00AC1, 0x00AC5, GBP_EXT},
+ {0x00AC7, 0x00AC8, GBP_EXT},
+ {0x00AC9, 0x00AC9, GBP_SM},
+ {0x00ACB, 0x00ACC, GBP_SM},
+ {0x00ACD, 0x00ACD, GBP_INDC_LNK | GBP_EXT},
+ {0x00AE2, 0x00AE3, GBP_EXT},
+ {0x00AF9, 0x00AF9, GBP_INDC_CNSNT},
+ {0x00AFA, 0x00AFF, GBP_EXT},
+ {0x00B01, 0x00B01, GBP_EXT},
+ {0x00B02, 0x00B03, GBP_SM},
+ {0x00B15, 0x00B28, GBP_INDC_CNSNT},
+ {0x00B2A, 0x00B30, GBP_INDC_CNSNT},
+ {0x00B32, 0x00B33, GBP_INDC_CNSNT},
+ {0x00B35, 0x00B39, GBP_INDC_CNSNT},
+ {0x00B3C, 0x00B3C, GBP_INDC_EXT | GBP_EXT},
+ {0x00B3E, 0x00B3F, GBP_EXT},
+ {0x00B40, 0x00B40, GBP_SM},
+ {0x00B41, 0x00B44, GBP_EXT},
+ {0x00B47, 0x00B48, GBP_SM},
+ {0x00B4B, 0x00B4C, GBP_SM},
+ {0x00B4D, 0x00B4D, GBP_INDC_LNK | GBP_EXT},
+ {0x00B55, 0x00B57, GBP_EXT},
+ {0x00B5C, 0x00B5D, GBP_INDC_CNSNT},
+ {0x00B5F, 0x00B5F, GBP_INDC_CNSNT},
+ {0x00B62, 0x00B63, GBP_EXT},
+ {0x00B71, 0x00B71, GBP_INDC_CNSNT},
+ {0x00B82, 0x00B82, GBP_EXT},
+ {0x00BBE, 0x00BBE, GBP_EXT},
+ {0x00BBF, 0x00BBF, GBP_SM},
+ {0x00BC0, 0x00BC0, GBP_EXT},
+ {0x00BC1, 0x00BC2, GBP_SM},
+ {0x00BC6, 0x00BC8, GBP_SM},
+ {0x00BCA, 0x00BCC, GBP_SM},
+ {0x00BCD, 0x00BCD, GBP_EXT},
+ {0x00BD7, 0x00BD7, GBP_EXT},
+ {0x00C00, 0x00C00, GBP_EXT},
+ {0x00C01, 0x00C03, GBP_SM},
+ {0x00C04, 0x00C04, GBP_EXT},
+ {0x00C15, 0x00C28, GBP_INDC_CNSNT},
+ {0x00C2A, 0x00C39, GBP_INDC_CNSNT},
+ {0x00C3C, 0x00C3C, GBP_INDC_EXT | GBP_EXT},
+ {0x00C3E, 0x00C40, GBP_EXT},
+ {0x00C41, 0x00C44, GBP_SM},
+ {0x00C46, 0x00C48, GBP_EXT},
+ {0x00C4A, 0x00C4C, GBP_EXT},
+ {0x00C4D, 0x00C4D, GBP_INDC_LNK | GBP_EXT},
+ {0x00C55, 0x00C56, GBP_INDC_EXT | GBP_EXT},
+ {0x00C58, 0x00C5A, GBP_INDC_CNSNT},
+ {0x00C62, 0x00C63, GBP_EXT},
+ {0x00C81, 0x00C81, GBP_EXT},
+ {0x00C82, 0x00C83, GBP_SM},
+ {0x00CBC, 0x00CBC, GBP_INDC_EXT | GBP_EXT},
+ {0x00CBE, 0x00CBE, GBP_SM},
+ {0x00CBF, 0x00CBF, GBP_EXT},
+ {0x00CC0, 0x00CC1, GBP_SM},
+ {0x00CC2, 0x00CC2, GBP_EXT},
+ {0x00CC3, 0x00CC4, GBP_SM},
+ {0x00CC6, 0x00CC6, GBP_EXT},
+ {0x00CC7, 0x00CC8, GBP_SM},
+ {0x00CCA, 0x00CCB, GBP_SM},
+ {0x00CCC, 0x00CCD, GBP_EXT},
+ {0x00CD5, 0x00CD6, GBP_EXT},
+ {0x00CE2, 0x00CE3, GBP_EXT},
+ {0x00CF3, 0x00CF3, GBP_SM},
+ {0x00D00, 0x00D01, GBP_EXT},
+ {0x00D02, 0x00D03, GBP_SM},
+ {0x00D15, 0x00D3A, GBP_INDC_CNSNT},
+ {0x00D3B, 0x00D3C, GBP_INDC_EXT | GBP_EXT},
+ {0x00D3E, 0x00D3E, GBP_EXT},
+ {0x00D3F, 0x00D40, GBP_SM},
+ {0x00D41, 0x00D44, GBP_EXT},
+ {0x00D46, 0x00D48, GBP_SM},
+ {0x00D4A, 0x00D4C, GBP_SM},
+ {0x00D4D, 0x00D4D, GBP_INDC_LNK | GBP_EXT},
+ {0x00D4E, 0x00D4E, GBP_PREP},
+ {0x00D57, 0x00D57, GBP_EXT},
+ {0x00D62, 0x00D63, GBP_EXT},
+ {0x00D81, 0x00D81, GBP_EXT},
+ {0x00D82, 0x00D83, GBP_SM},
+ {0x00DCA, 0x00DCA, GBP_EXT},
+ {0x00DCF, 0x00DCF, GBP_EXT},
+ {0x00DD0, 0x00DD1, GBP_SM},
+ {0x00DD2, 0x00DD4, GBP_EXT},
+ {0x00DD6, 0x00DD6, GBP_EXT},
+ {0x00DD8, 0x00DDE, GBP_SM},
+ {0x00DDF, 0x00DDF, GBP_EXT},
+ {0x00DF2, 0x00DF3, GBP_SM},
+ {0x00E31, 0x00E31, GBP_EXT},
+ {0x00E33, 0x00E33, GBP_SM},
+ {0x00E34, 0x00E37, GBP_EXT},
+ {0x00E38, 0x00E3A, GBP_INDC_EXT | GBP_EXT},
+ {0x00E47, 0x00E47, GBP_EXT},
+ {0x00E48, 0x00E4B, GBP_INDC_EXT | GBP_EXT},
+ {0x00E4C, 0x00E4E, GBP_EXT},
+ {0x00EB1, 0x00EB1, GBP_EXT},
+ {0x00EB3, 0x00EB3, GBP_SM},
+ {0x00EB4, 0x00EB7, GBP_EXT},
+ {0x00EB8, 0x00EBA, GBP_INDC_EXT | GBP_EXT},
+ {0x00EBB, 0x00EBC, GBP_EXT},
+ {0x00EC8, 0x00ECB, GBP_INDC_EXT | GBP_EXT},
+ {0x00ECC, 0x00ECE, GBP_EXT},
+ {0x00F18, 0x00F19, GBP_INDC_EXT | GBP_EXT},
+ {0x00F35, 0x00F35, GBP_INDC_EXT | GBP_EXT},
+ {0x00F37, 0x00F37, GBP_INDC_EXT | GBP_EXT},
+ {0x00F39, 0x00F39, GBP_INDC_EXT | GBP_EXT},
+ {0x00F3E, 0x00F3F, GBP_SM},
+ {0x00F71, 0x00F72, GBP_INDC_EXT | GBP_EXT},
+ {0x00F73, 0x00F73, GBP_EXT},
+ {0x00F74, 0x00F74, GBP_INDC_EXT | GBP_EXT},
+ {0x00F75, 0x00F79, GBP_EXT},
+ {0x00F7A, 0x00F7D, GBP_INDC_EXT | GBP_EXT},
+ {0x00F7E, 0x00F7E, GBP_EXT},
+ {0x00F7F, 0x00F7F, GBP_SM},
+ {0x00F80, 0x00F80, GBP_INDC_EXT | GBP_EXT},
+ {0x00F81, 0x00F81, GBP_EXT},
+ {0x00F82, 0x00F84, GBP_INDC_EXT | GBP_EXT},
+ {0x00F86, 0x00F87, GBP_INDC_EXT | GBP_EXT},
+ {0x00F8D, 0x00F97, GBP_EXT},
+ {0x00F99, 0x00FBC, GBP_EXT},
+ {0x00FC6, 0x00FC6, GBP_INDC_EXT | GBP_EXT},
+ {0x0102D, 0x01030, GBP_EXT},
+ {0x01031, 0x01031, GBP_SM},
+ {0x01032, 0x01036, GBP_EXT},
+ {0x01037, 0x01037, GBP_INDC_EXT | GBP_EXT},
+ {0x01039, 0x0103A, GBP_INDC_EXT | GBP_EXT},
+ {0x0103B, 0x0103C, GBP_SM},
+ {0x0103D, 0x0103E, GBP_EXT},
+ {0x01056, 0x01057, GBP_SM},
+ {0x01058, 0x01059, GBP_EXT},
+ {0x0105E, 0x01060, GBP_EXT},
+ {0x01071, 0x01074, GBP_EXT},
+ {0x01082, 0x01082, GBP_EXT},
+ {0x01084, 0x01084, GBP_SM},
+ {0x01085, 0x01086, GBP_EXT},
+ {0x0108D, 0x0108D, GBP_INDC_EXT | GBP_EXT},
+ {0x0109D, 0x0109D, GBP_EXT},
+ {0x01100, 0x0115F, GBP_HNGL_L},
+ {0x01160, 0x011A7, GBP_HNGL_V},
+ {0x011A8, 0x011FF, GBP_HNGL_T},
+ {0x0135D, 0x0135F, GBP_INDC_EXT | GBP_EXT},
+ {0x01712, 0x01713, GBP_EXT},
+ {0x01714, 0x01714, GBP_INDC_EXT | GBP_EXT},
+ {0x01715, 0x01715, GBP_SM},
+ {0x01732, 0x01733, GBP_EXT},
+ {0x01734, 0x01734, GBP_SM},
+ {0x01752, 0x01753, GBP_EXT},
+ {0x01772, 0x01773, GBP_EXT},
+ {0x017B4, 0x017B5, GBP_EXT},
+ {0x017B6, 0x017B6, GBP_SM},
+ {0x017B7, 0x017BD, GBP_EXT},
+ {0x017BE, 0x017C5, GBP_SM},
+ {0x017C6, 0x017C6, GBP_EXT},
+ {0x017C7, 0x017C8, GBP_SM},
+ {0x017C9, 0x017D1, GBP_EXT},
+ {0x017D2, 0x017D2, GBP_INDC_EXT | GBP_EXT},
+ {0x017D3, 0x017D3, GBP_EXT},
+ {0x017DD, 0x017DD, GBP_INDC_EXT | GBP_EXT},
+ {0x0180B, 0x0180D, GBP_EXT},
+ {0x0180E, 0x0180E, GBP_CTRL},
+ {0x0180F, 0x0180F, GBP_EXT},
+ {0x01885, 0x01886, GBP_EXT},
+ {0x018A9, 0x018A9, GBP_INDC_EXT | GBP_EXT},
+ {0x01920, 0x01922, GBP_EXT},
+ {0x01923, 0x01926, GBP_SM},
+ {0x01927, 0x01928, GBP_EXT},
+ {0x01929, 0x0192B, GBP_SM},
+ {0x01930, 0x01931, GBP_SM},
+ {0x01932, 0x01932, GBP_EXT},
+ {0x01933, 0x01938, GBP_SM},
+ {0x01939, 0x0193B, GBP_INDC_EXT | GBP_EXT},
+ {0x01A17, 0x01A18, GBP_INDC_EXT | GBP_EXT},
+ {0x01A19, 0x01A1A, GBP_SM},
+ {0x01A1B, 0x01A1B, GBP_EXT},
+ {0x01A55, 0x01A55, GBP_SM},
+ {0x01A56, 0x01A56, GBP_EXT},
+ {0x01A57, 0x01A57, GBP_SM},
+ {0x01A58, 0x01A5E, GBP_EXT},
+ {0x01A60, 0x01A60, GBP_INDC_EXT | GBP_EXT},
+ {0x01A62, 0x01A62, GBP_EXT},
+ {0x01A65, 0x01A6C, GBP_EXT},
+ {0x01A6D, 0x01A72, GBP_SM},
+ {0x01A73, 0x01A74, GBP_EXT},
+ {0x01A75, 0x01A7C, GBP_INDC_EXT | GBP_EXT},
+ {0x01A7F, 0x01A7F, GBP_INDC_EXT | GBP_EXT},
+ {0x01AB0, 0x01ABD, GBP_INDC_EXT | GBP_EXT},
+ {0x01ABE, 0x01ABE, GBP_EXT},
+ {0x01ABF, 0x01ACE, GBP_INDC_EXT | GBP_EXT},
+ {0x01B00, 0x01B03, GBP_EXT},
+ {0x01B04, 0x01B04, GBP_SM},
+ {0x01B34, 0x01B34, GBP_INDC_EXT | GBP_EXT},
+ {0x01B35, 0x01B3A, GBP_EXT},
+ {0x01B3B, 0x01B3B, GBP_SM},
+ {0x01B3C, 0x01B3C, GBP_EXT},
+ {0x01B3D, 0x01B41, GBP_SM},
+ {0x01B42, 0x01B42, GBP_EXT},
+ {0x01B43, 0x01B44, GBP_SM},
+ {0x01B6B, 0x01B73, GBP_INDC_EXT | GBP_EXT},
+ {0x01B80, 0x01B81, GBP_EXT},
+ {0x01B82, 0x01B82, GBP_SM},
+ {0x01BA1, 0x01BA1, GBP_SM},
+ {0x01BA2, 0x01BA5, GBP_EXT},
+ {0x01BA6, 0x01BA7, GBP_SM},
+ {0x01BA8, 0x01BA9, GBP_EXT},
+ {0x01BAA, 0x01BAA, GBP_SM},
+ {0x01BAB, 0x01BAB, GBP_INDC_EXT | GBP_EXT},
+ {0x01BAC, 0x01BAD, GBP_EXT},
+ {0x01BE6, 0x01BE6, GBP_INDC_EXT | GBP_EXT},
+ {0x01BE7, 0x01BE7, GBP_SM},
+ {0x01BE8, 0x01BE9, GBP_EXT},
+ {0x01BEA, 0x01BEC, GBP_SM},
+ {0x01BED, 0x01BED, GBP_EXT},
+ {0x01BEE, 0x01BEE, GBP_SM},
+ {0x01BEF, 0x01BF1, GBP_EXT},
+ {0x01BF2, 0x01BF3, GBP_SM},
+ {0x01C24, 0x01C2B, GBP_SM},
+ {0x01C2C, 0x01C33, GBP_EXT},
+ {0x01C34, 0x01C35, GBP_SM},
+ {0x01C36, 0x01C36, GBP_EXT},
+ {0x01C37, 0x01C37, GBP_INDC_EXT | GBP_EXT},
+ {0x01CD0, 0x01CD2, GBP_INDC_EXT | GBP_EXT},
+ {0x01CD4, 0x01CE0, GBP_INDC_EXT | GBP_EXT},
+ {0x01CE1, 0x01CE1, GBP_SM},
+ {0x01CE2, 0x01CE8, GBP_INDC_EXT | GBP_EXT},
+ {0x01CED, 0x01CED, GBP_INDC_EXT | GBP_EXT},
+ {0x01CF4, 0x01CF4, GBP_INDC_EXT | GBP_EXT},
+ {0x01CF7, 0x01CF7, GBP_SM},
+ {0x01CF8, 0x01CF9, GBP_INDC_EXT | GBP_EXT},
+ {0x01DC0, 0x01DFF, GBP_INDC_EXT | GBP_EXT},
+ {0x0200B, 0x0200B, GBP_CTRL},
+ {0x0200C, 0x0200C, GBP_EXT},
+ {0x0200D, 0x0200D, GBP_INDC_EXT | GBP_ZWJ},
+ {0x0200E, 0x0200F, GBP_CTRL},
+ {0x02028, 0x0202E, GBP_CTRL},
+ {0x0203C, 0x0203C, GBP_PIC},
+ {0x02049, 0x02049, GBP_PIC},
+ {0x02060, 0x0206F, GBP_CTRL},
+ {0x020D0, 0x020DC, GBP_INDC_EXT | GBP_EXT},
+ {0x020DD, 0x020E0, GBP_EXT},
+ {0x020E1, 0x020E1, GBP_INDC_EXT | GBP_EXT},
+ {0x020E2, 0x020E4, GBP_EXT},
+ {0x020E5, 0x020F0, GBP_INDC_EXT | GBP_EXT},
+ {0x02122, 0x02122, GBP_PIC},
+ {0x02139, 0x02139, GBP_PIC},
+ {0x02194, 0x02199, GBP_PIC},
+ {0x021A9, 0x021AA, GBP_PIC},
+ {0x0231A, 0x0231B, GBP_PIC},
+ {0x02328, 0x02328, GBP_PIC},
+ {0x02388, 0x02388, GBP_PIC},
+ {0x023CF, 0x023CF, GBP_PIC},
+ {0x023E9, 0x023F3, GBP_PIC},
+ {0x023F8, 0x023FA, GBP_PIC},
+ {0x024C2, 0x024C2, GBP_PIC},
+ {0x025AA, 0x025AB, GBP_PIC},
+ {0x025B6, 0x025B6, GBP_PIC},
+ {0x025C0, 0x025C0, GBP_PIC},
+ {0x025FB, 0x025FE, GBP_PIC},
+ {0x02600, 0x02605, GBP_PIC},
+ {0x02607, 0x02612, GBP_PIC},
+ {0x02614, 0x02685, GBP_PIC},
+ {0x02690, 0x02705, GBP_PIC},
+ {0x02708, 0x02712, GBP_PIC},
+ {0x02714, 0x02714, GBP_PIC},
+ {0x02716, 0x02716, GBP_PIC},
+ {0x0271D, 0x0271D, GBP_PIC},
+ {0x02721, 0x02721, GBP_PIC},
+ {0x02728, 0x02728, GBP_PIC},
+ {0x02733, 0x02734, GBP_PIC},
+ {0x02744, 0x02744, GBP_PIC},
+ {0x02747, 0x02747, GBP_PIC},
+ {0x0274C, 0x0274C, GBP_PIC},
+ {0x0274E, 0x0274E, GBP_PIC},
+ {0x02753, 0x02755, GBP_PIC},
+ {0x02757, 0x02757, GBP_PIC},
+ {0x02763, 0x02767, GBP_PIC},
+ {0x02795, 0x02797, GBP_PIC},
+ {0x027A1, 0x027A1, GBP_PIC},
+ {0x027B0, 0x027B0, GBP_PIC},
+ {0x027BF, 0x027BF, GBP_PIC},
+ {0x02934, 0x02935, GBP_PIC},
+ {0x02B05, 0x02B07, GBP_PIC},
+ {0x02B1B, 0x02B1C, GBP_PIC},
+ {0x02B50, 0x02B50, GBP_PIC},
+ {0x02B55, 0x02B55, GBP_PIC},
+ {0x02CEF, 0x02CF1, GBP_INDC_EXT | GBP_EXT},
+ {0x02D7F, 0x02D7F, GBP_INDC_EXT | GBP_EXT},
+ {0x02DE0, 0x02DFF, GBP_INDC_EXT | GBP_EXT},
+ {0x0302A, 0x0302F, GBP_INDC_EXT | GBP_EXT},
+ {0x03030, 0x03030, GBP_PIC},
+ {0x0303D, 0x0303D, GBP_PIC},
+ {0x03099, 0x0309A, GBP_INDC_EXT | GBP_EXT},
+ {0x03297, 0x03297, GBP_PIC},
+ {0x03299, 0x03299, GBP_PIC},
+ {0x0A66F, 0x0A66F, GBP_INDC_EXT | GBP_EXT},
+ {0x0A670, 0x0A672, GBP_EXT},
+ {0x0A674, 0x0A67D, GBP_INDC_EXT | GBP_EXT},
+ {0x0A69E, 0x0A69F, GBP_INDC_EXT | GBP_EXT},
+ {0x0A6F0, 0x0A6F1, GBP_INDC_EXT | GBP_EXT},
+ {0x0A802, 0x0A802, GBP_EXT},
+ {0x0A806, 0x0A806, GBP_EXT},
+ {0x0A80B, 0x0A80B, GBP_EXT},
+ {0x0A823, 0x0A824, GBP_SM},
+ {0x0A825, 0x0A826, GBP_EXT},
+ {0x0A827, 0x0A827, GBP_SM},
+ {0x0A82C, 0x0A82C, GBP_INDC_EXT | GBP_EXT},
+ {0x0A880, 0x0A881, GBP_SM},
+ {0x0A8B4, 0x0A8C3, GBP_SM},
+ {0x0A8C4, 0x0A8C5, GBP_EXT},
+ {0x0A8E0, 0x0A8F1, GBP_INDC_EXT | GBP_EXT},
+ {0x0A8FF, 0x0A8FF, GBP_EXT},
+ {0x0A926, 0x0A92A, GBP_EXT},
+ {0x0A92B, 0x0A92D, GBP_INDC_EXT | GBP_EXT},
+ {0x0A947, 0x0A951, GBP_EXT},
+ {0x0A952, 0x0A953, GBP_SM},
+ {0x0A960, 0x0A97C, GBP_HNGL_L},
+ {0x0A980, 0x0A982, GBP_EXT},
+ {0x0A983, 0x0A983, GBP_SM},
+ {0x0A9B3, 0x0A9B3, GBP_INDC_EXT | GBP_EXT},
+ {0x0A9B4, 0x0A9B5, GBP_SM},
+ {0x0A9B6, 0x0A9B9, GBP_EXT},
+ {0x0A9BA, 0x0A9BB, GBP_SM},
+ {0x0A9BC, 0x0A9BD, GBP_EXT},
+ {0x0A9BE, 0x0A9C0, GBP_SM},
+ {0x0A9E5, 0x0A9E5, GBP_EXT},
+ {0x0AA29, 0x0AA2E, GBP_EXT},
+ {0x0AA2F, 0x0AA30, GBP_SM},
+ {0x0AA31, 0x0AA32, GBP_EXT},
+ {0x0AA33, 0x0AA34, GBP_SM},
+ {0x0AA35, 0x0AA36, GBP_EXT},
+ {0x0AA43, 0x0AA43, GBP_EXT},
+ {0x0AA4C, 0x0AA4C, GBP_EXT},
+ {0x0AA4D, 0x0AA4D, GBP_SM},
+ {0x0AA7C, 0x0AA7C, GBP_EXT},
+ {0x0AAB0, 0x0AAB0, GBP_INDC_EXT | GBP_EXT},
+ {0x0AAB2, 0x0AAB4, GBP_INDC_EXT | GBP_EXT},
+ {0x0AAB7, 0x0AAB8, GBP_INDC_EXT | GBP_EXT},
+ {0x0AABE, 0x0AABF, GBP_INDC_EXT | GBP_EXT},
+ {0x0AAC1, 0x0AAC1, GBP_INDC_EXT | GBP_EXT},
+ {0x0AAEB, 0x0AAEB, GBP_SM},
+ {0x0AAEC, 0x0AAED, GBP_EXT},
+ {0x0AAEE, 0x0AAEF, GBP_SM},
+ {0x0AAF5, 0x0AAF5, GBP_SM},
+ {0x0AAF6, 0x0AAF6, GBP_INDC_EXT | GBP_EXT},
+ {0x0ABE3, 0x0ABE4, GBP_SM},
+ {0x0ABE5, 0x0ABE5, GBP_EXT},
+ {0x0ABE6, 0x0ABE7, GBP_SM},
+ {0x0ABE8, 0x0ABE8, GBP_EXT},
+ {0x0ABE9, 0x0ABEA, GBP_SM},
+ {0x0ABEC, 0x0ABEC, GBP_SM},
+ {0x0ABED, 0x0ABED, GBP_INDC_EXT | GBP_EXT},
+ {0x0AC00, 0x0AC00, GBP_HNGL_LV},
+ {0x0AC01, 0x0AC1B, GBP_HNGL_LVT},
+ {0x0AC1C, 0x0AC1C, GBP_HNGL_LV},
+ {0x0AC1D, 0x0AC37, GBP_HNGL_LVT},
+ {0x0AC38, 0x0AC38, GBP_HNGL_LV},
+ {0x0AC39, 0x0AC53, GBP_HNGL_LVT},
+ {0x0AC54, 0x0AC54, GBP_HNGL_LV},
+ {0x0AC55, 0x0AC6F, GBP_HNGL_LVT},
+ {0x0AC70, 0x0AC70, GBP_HNGL_LV},
+ {0x0AC71, 0x0AC8B, GBP_HNGL_LVT},
+ {0x0AC8C, 0x0AC8C, GBP_HNGL_LV},
+ {0x0AC8D, 0x0ACA7, GBP_HNGL_LVT},
+ {0x0ACA8, 0x0ACA8, GBP_HNGL_LV},
+ {0x0ACA9, 0x0ACC3, GBP_HNGL_LVT},
+ {0x0ACC4, 0x0ACC4, GBP_HNGL_LV},
+ {0x0ACC5, 0x0ACDF, GBP_HNGL_LVT},
+ {0x0ACE0, 0x0ACE0, GBP_HNGL_LV},
+ {0x0ACE1, 0x0ACFB, GBP_HNGL_LVT},
+ {0x0ACFC, 0x0ACFC, GBP_HNGL_LV},
+ {0x0ACFD, 0x0AD17, GBP_HNGL_LVT},
+ {0x0AD18, 0x0AD18, GBP_HNGL_LV},
+ {0x0AD19, 0x0AD33, GBP_HNGL_LVT},
+ {0x0AD34, 0x0AD34, GBP_HNGL_LV},
+ {0x0AD35, 0x0AD4F, GBP_HNGL_LVT},
+ {0x0AD50, 0x0AD50, GBP_HNGL_LV},
+ {0x0AD51, 0x0AD6B, GBP_HNGL_LVT},
+ {0x0AD6C, 0x0AD6C, GBP_HNGL_LV},
+ {0x0AD6D, 0x0AD87, GBP_HNGL_LVT},
+ {0x0AD88, 0x0AD88, GBP_HNGL_LV},
+ {0x0AD89, 0x0ADA3, GBP_HNGL_LVT},
+ {0x0ADA4, 0x0ADA4, GBP_HNGL_LV},
+ {0x0ADA5, 0x0ADBF, GBP_HNGL_LVT},
+ {0x0ADC0, 0x0ADC0, GBP_HNGL_LV},
+ {0x0ADC1, 0x0ADDB, GBP_HNGL_LVT},
+ {0x0ADDC, 0x0ADDC, GBP_HNGL_LV},
+ {0x0ADDD, 0x0ADF7, GBP_HNGL_LVT},
+ {0x0ADF8, 0x0ADF8, GBP_HNGL_LV},
+ {0x0ADF9, 0x0AE13, GBP_HNGL_LVT},
+ {0x0AE14, 0x0AE14, GBP_HNGL_LV},
+ {0x0AE15, 0x0AE2F, GBP_HNGL_LVT},
+ {0x0AE30, 0x0AE30, GBP_HNGL_LV},
+ {0x0AE31, 0x0AE4B, GBP_HNGL_LVT},
+ {0x0AE4C, 0x0AE4C, GBP_HNGL_LV},
+ {0x0AE4D, 0x0AE67, GBP_HNGL_LVT},
+ {0x0AE68, 0x0AE68, GBP_HNGL_LV},
+ {0x0AE69, 0x0AE83, GBP_HNGL_LVT},
+ {0x0AE84, 0x0AE84, GBP_HNGL_LV},
+ {0x0AE85, 0x0AE9F, GBP_HNGL_LVT},
+ {0x0AEA0, 0x0AEA0, GBP_HNGL_LV},
+ {0x0AEA1, 0x0AEBB, GBP_HNGL_LVT},
+ {0x0AEBC, 0x0AEBC, GBP_HNGL_LV},
+ {0x0AEBD, 0x0AED7, GBP_HNGL_LVT},
+ {0x0AED8, 0x0AED8, GBP_HNGL_LV},
+ {0x0AED9, 0x0AEF3, GBP_HNGL_LVT},
+ {0x0AEF4, 0x0AEF4, GBP_HNGL_LV},
+ {0x0AEF5, 0x0AF0F, GBP_HNGL_LVT},
+ {0x0AF10, 0x0AF10, GBP_HNGL_LV},
+ {0x0AF11, 0x0AF2B, GBP_HNGL_LVT},
+ {0x0AF2C, 0x0AF2C, GBP_HNGL_LV},
+ {0x0AF2D, 0x0AF47, GBP_HNGL_LVT},
+ {0x0AF48, 0x0AF48, GBP_HNGL_LV},
+ {0x0AF49, 0x0AF63, GBP_HNGL_LVT},
+ {0x0AF64, 0x0AF64, GBP_HNGL_LV},
+ {0x0AF65, 0x0AF7F, GBP_HNGL_LVT},
+ {0x0AF80, 0x0AF80, GBP_HNGL_LV},
+ {0x0AF81, 0x0AF9B, GBP_HNGL_LVT},
+ {0x0AF9C, 0x0AF9C, GBP_HNGL_LV},
+ {0x0AF9D, 0x0AFB7, GBP_HNGL_LVT},
+ {0x0AFB8, 0x0AFB8, GBP_HNGL_LV},
+ {0x0AFB9, 0x0AFD3, GBP_HNGL_LVT},
+ {0x0AFD4, 0x0AFD4, GBP_HNGL_LV},
+ {0x0AFD5, 0x0AFEF, GBP_HNGL_LVT},
+ {0x0AFF0, 0x0AFF0, GBP_HNGL_LV},
+ {0x0AFF1, 0x0B00B, GBP_HNGL_LVT},
+ {0x0B00C, 0x0B00C, GBP_HNGL_LV},
+ {0x0B00D, 0x0B027, GBP_HNGL_LVT},
+ {0x0B028, 0x0B028, GBP_HNGL_LV},
+ {0x0B029, 0x0B043, GBP_HNGL_LVT},
+ {0x0B044, 0x0B044, GBP_HNGL_LV},
+ {0x0B045, 0x0B05F, GBP_HNGL_LVT},
+ {0x0B060, 0x0B060, GBP_HNGL_LV},
+ {0x0B061, 0x0B07B, GBP_HNGL_LVT},
+ {0x0B07C, 0x0B07C, GBP_HNGL_LV},
+ {0x0B07D, 0x0B097, GBP_HNGL_LVT},
+ {0x0B098, 0x0B098, GBP_HNGL_LV},
+ {0x0B099, 0x0B0B3, GBP_HNGL_LVT},
+ {0x0B0B4, 0x0B0B4, GBP_HNGL_LV},
+ {0x0B0B5, 0x0B0CF, GBP_HNGL_LVT},
+ {0x0B0D0, 0x0B0D0, GBP_HNGL_LV},
+ {0x0B0D1, 0x0B0EB, GBP_HNGL_LVT},
+ {0x0B0EC, 0x0B0EC, GBP_HNGL_LV},
+ {0x0B0ED, 0x0B107, GBP_HNGL_LVT},
+ {0x0B108, 0x0B108, GBP_HNGL_LV},
+ {0x0B109, 0x0B123, GBP_HNGL_LVT},
+ {0x0B124, 0x0B124, GBP_HNGL_LV},
+ {0x0B125, 0x0B13F, GBP_HNGL_LVT},
+ {0x0B140, 0x0B140, GBP_HNGL_LV},
+ {0x0B141, 0x0B15B, GBP_HNGL_LVT},
+ {0x0B15C, 0x0B15C, GBP_HNGL_LV},
+ {0x0B15D, 0x0B177, GBP_HNGL_LVT},
+ {0x0B178, 0x0B178, GBP_HNGL_LV},
+ {0x0B179, 0x0B193, GBP_HNGL_LVT},
+ {0x0B194, 0x0B194, GBP_HNGL_LV},
+ {0x0B195, 0x0B1AF, GBP_HNGL_LVT},
+ {0x0B1B0, 0x0B1B0, GBP_HNGL_LV},
+ {0x0B1B1, 0x0B1CB, GBP_HNGL_LVT},
+ {0x0B1CC, 0x0B1CC, GBP_HNGL_LV},
+ {0x0B1CD, 0x0B1E7, GBP_HNGL_LVT},
+ {0x0B1E8, 0x0B1E8, GBP_HNGL_LV},
+ {0x0B1E9, 0x0B203, GBP_HNGL_LVT},
+ {0x0B204, 0x0B204, GBP_HNGL_LV},
+ {0x0B205, 0x0B21F, GBP_HNGL_LVT},
+ {0x0B220, 0x0B220, GBP_HNGL_LV},
+ {0x0B221, 0x0B23B, GBP_HNGL_LVT},
+ {0x0B23C, 0x0B23C, GBP_HNGL_LV},
+ {0x0B23D, 0x0B257, GBP_HNGL_LVT},
+ {0x0B258, 0x0B258, GBP_HNGL_LV},
+ {0x0B259, 0x0B273, GBP_HNGL_LVT},
+ {0x0B274, 0x0B274, GBP_HNGL_LV},
+ {0x0B275, 0x0B28F, GBP_HNGL_LVT},
+ {0x0B290, 0x0B290, GBP_HNGL_LV},
+ {0x0B291, 0x0B2AB, GBP_HNGL_LVT},
+ {0x0B2AC, 0x0B2AC, GBP_HNGL_LV},
+ {0x0B2AD, 0x0B2C7, GBP_HNGL_LVT},
+ {0x0B2C8, 0x0B2C8, GBP_HNGL_LV},
+ {0x0B2C9, 0x0B2E3, GBP_HNGL_LVT},
+ {0x0B2E4, 0x0B2E4, GBP_HNGL_LV},
+ {0x0B2E5, 0x0B2FF, GBP_HNGL_LVT},
+ {0x0B300, 0x0B300, GBP_HNGL_LV},
+ {0x0B301, 0x0B31B, GBP_HNGL_LVT},
+ {0x0B31C, 0x0B31C, GBP_HNGL_LV},
+ {0x0B31D, 0x0B337, GBP_HNGL_LVT},
+ {0x0B338, 0x0B338, GBP_HNGL_LV},
+ {0x0B339, 0x0B353, GBP_HNGL_LVT},
+ {0x0B354, 0x0B354, GBP_HNGL_LV},
+ {0x0B355, 0x0B36F, GBP_HNGL_LVT},
+ {0x0B370, 0x0B370, GBP_HNGL_LV},
+ {0x0B371, 0x0B38B, GBP_HNGL_LVT},
+ {0x0B38C, 0x0B38C, GBP_HNGL_LV},
+ {0x0B38D, 0x0B3A7, GBP_HNGL_LVT},
+ {0x0B3A8, 0x0B3A8, GBP_HNGL_LV},
+ {0x0B3A9, 0x0B3C3, GBP_HNGL_LVT},
+ {0x0B3C4, 0x0B3C4, GBP_HNGL_LV},
+ {0x0B3C5, 0x0B3DF, GBP_HNGL_LVT},
+ {0x0B3E0, 0x0B3E0, GBP_HNGL_LV},
+ {0x0B3E1, 0x0B3FB, GBP_HNGL_LVT},
+ {0x0B3FC, 0x0B3FC, GBP_HNGL_LV},
+ {0x0B3FD, 0x0B417, GBP_HNGL_LVT},
+ {0x0B418, 0x0B418, GBP_HNGL_LV},
+ {0x0B419, 0x0B433, GBP_HNGL_LVT},
+ {0x0B434, 0x0B434, GBP_HNGL_LV},
+ {0x0B435, 0x0B44F, GBP_HNGL_LVT},
+ {0x0B450, 0x0B450, GBP_HNGL_LV},
+ {0x0B451, 0x0B46B, GBP_HNGL_LVT},
+ {0x0B46C, 0x0B46C, GBP_HNGL_LV},
+ {0x0B46D, 0x0B487, GBP_HNGL_LVT},
+ {0x0B488, 0x0B488, GBP_HNGL_LV},
+ {0x0B489, 0x0B4A3, GBP_HNGL_LVT},
+ {0x0B4A4, 0x0B4A4, GBP_HNGL_LV},
+ {0x0B4A5, 0x0B4BF, GBP_HNGL_LVT},
+ {0x0B4C0, 0x0B4C0, GBP_HNGL_LV},
+ {0x0B4C1, 0x0B4DB, GBP_HNGL_LVT},
+ {0x0B4DC, 0x0B4DC, GBP_HNGL_LV},
+ {0x0B4DD, 0x0B4F7, GBP_HNGL_LVT},
+ {0x0B4F8, 0x0B4F8, GBP_HNGL_LV},
+ {0x0B4F9, 0x0B513, GBP_HNGL_LVT},
+ {0x0B514, 0x0B514, GBP_HNGL_LV},
+ {0x0B515, 0x0B52F, GBP_HNGL_LVT},
+ {0x0B530, 0x0B530, GBP_HNGL_LV},
+ {0x0B531, 0x0B54B, GBP_HNGL_LVT},
+ {0x0B54C, 0x0B54C, GBP_HNGL_LV},
+ {0x0B54D, 0x0B567, GBP_HNGL_LVT},
+ {0x0B568, 0x0B568, GBP_HNGL_LV},
+ {0x0B569, 0x0B583, GBP_HNGL_LVT},
+ {0x0B584, 0x0B584, GBP_HNGL_LV},
+ {0x0B585, 0x0B59F, GBP_HNGL_LVT},
+ {0x0B5A0, 0x0B5A0, GBP_HNGL_LV},
+ {0x0B5A1, 0x0B5BB, GBP_HNGL_LVT},
+ {0x0B5BC, 0x0B5BC, GBP_HNGL_LV},
+ {0x0B5BD, 0x0B5D7, GBP_HNGL_LVT},
+ {0x0B5D8, 0x0B5D8, GBP_HNGL_LV},
+ {0x0B5D9, 0x0B5F3, GBP_HNGL_LVT},
+ {0x0B5F4, 0x0B5F4, GBP_HNGL_LV},
+ {0x0B5F5, 0x0B60F, GBP_HNGL_LVT},
+ {0x0B610, 0x0B610, GBP_HNGL_LV},
+ {0x0B611, 0x0B62B, GBP_HNGL_LVT},
+ {0x0B62C, 0x0B62C, GBP_HNGL_LV},
+ {0x0B62D, 0x0B647, GBP_HNGL_LVT},
+ {0x0B648, 0x0B648, GBP_HNGL_LV},
+ {0x0B649, 0x0B663, GBP_HNGL_LVT},
+ {0x0B664, 0x0B664, GBP_HNGL_LV},
+ {0x0B665, 0x0B67F, GBP_HNGL_LVT},
+ {0x0B680, 0x0B680, GBP_HNGL_LV},
+ {0x0B681, 0x0B69B, GBP_HNGL_LVT},
+ {0x0B69C, 0x0B69C, GBP_HNGL_LV},
+ {0x0B69D, 0x0B6B7, GBP_HNGL_LVT},
+ {0x0B6B8, 0x0B6B8, GBP_HNGL_LV},
+ {0x0B6B9, 0x0B6D3, GBP_HNGL_LVT},
+ {0x0B6D4, 0x0B6D4, GBP_HNGL_LV},
+ {0x0B6D5, 0x0B6EF, GBP_HNGL_LVT},
+ {0x0B6F0, 0x0B6F0, GBP_HNGL_LV},
+ {0x0B6F1, 0x0B70B, GBP_HNGL_LVT},
+ {0x0B70C, 0x0B70C, GBP_HNGL_LV},
+ {0x0B70D, 0x0B727, GBP_HNGL_LVT},
+ {0x0B728, 0x0B728, GBP_HNGL_LV},
+ {0x0B729, 0x0B743, GBP_HNGL_LVT},
+ {0x0B744, 0x0B744, GBP_HNGL_LV},
+ {0x0B745, 0x0B75F, GBP_HNGL_LVT},
+ {0x0B760, 0x0B760, GBP_HNGL_LV},
+ {0x0B761, 0x0B77B, GBP_HNGL_LVT},
+ {0x0B77C, 0x0B77C, GBP_HNGL_LV},
+ {0x0B77D, 0x0B797, GBP_HNGL_LVT},
+ {0x0B798, 0x0B798, GBP_HNGL_LV},
+ {0x0B799, 0x0B7B3, GBP_HNGL_LVT},
+ {0x0B7B4, 0x0B7B4, GBP_HNGL_LV},
+ {0x0B7B5, 0x0B7CF, GBP_HNGL_LVT},
+ {0x0B7D0, 0x0B7D0, GBP_HNGL_LV},
+ {0x0B7D1, 0x0B7EB, GBP_HNGL_LVT},
+ {0x0B7EC, 0x0B7EC, GBP_HNGL_LV},
+ {0x0B7ED, 0x0B807, GBP_HNGL_LVT},
+ {0x0B808, 0x0B808, GBP_HNGL_LV},
+ {0x0B809, 0x0B823, GBP_HNGL_LVT},
+ {0x0B824, 0x0B824, GBP_HNGL_LV},
+ {0x0B825, 0x0B83F, GBP_HNGL_LVT},
+ {0x0B840, 0x0B840, GBP_HNGL_LV},
+ {0x0B841, 0x0B85B, GBP_HNGL_LVT},
+ {0x0B85C, 0x0B85C, GBP_HNGL_LV},
+ {0x0B85D, 0x0B877, GBP_HNGL_LVT},
+ {0x0B878, 0x0B878, GBP_HNGL_LV},
+ {0x0B879, 0x0B893, GBP_HNGL_LVT},
+ {0x0B894, 0x0B894, GBP_HNGL_LV},
+ {0x0B895, 0x0B8AF, GBP_HNGL_LVT},
+ {0x0B8B0, 0x0B8B0, GBP_HNGL_LV},
+ {0x0B8B1, 0x0B8CB, GBP_HNGL_LVT},
+ {0x0B8CC, 0x0B8CC, GBP_HNGL_LV},
+ {0x0B8CD, 0x0B8E7, GBP_HNGL_LVT},
+ {0x0B8E8, 0x0B8E8, GBP_HNGL_LV},
+ {0x0B8E9, 0x0B903, GBP_HNGL_LVT},
+ {0x0B904, 0x0B904, GBP_HNGL_LV},
+ {0x0B905, 0x0B91F, GBP_HNGL_LVT},
+ {0x0B920, 0x0B920, GBP_HNGL_LV},
+ {0x0B921, 0x0B93B, GBP_HNGL_LVT},
+ {0x0B93C, 0x0B93C, GBP_HNGL_LV},
+ {0x0B93D, 0x0B957, GBP_HNGL_LVT},
+ {0x0B958, 0x0B958, GBP_HNGL_LV},
+ {0x0B959, 0x0B973, GBP_HNGL_LVT},
+ {0x0B974, 0x0B974, GBP_HNGL_LV},
+ {0x0B975, 0x0B98F, GBP_HNGL_LVT},
+ {0x0B990, 0x0B990, GBP_HNGL_LV},
+ {0x0B991, 0x0B9AB, GBP_HNGL_LVT},
+ {0x0B9AC, 0x0B9AC, GBP_HNGL_LV},
+ {0x0B9AD, 0x0B9C7, GBP_HNGL_LVT},
+ {0x0B9C8, 0x0B9C8, GBP_HNGL_LV},
+ {0x0B9C9, 0x0B9E3, GBP_HNGL_LVT},
+ {0x0B9E4, 0x0B9E4, GBP_HNGL_LV},
+ {0x0B9E5, 0x0B9FF, GBP_HNGL_LVT},
+ {0x0BA00, 0x0BA00, GBP_HNGL_LV},
+ {0x0BA01, 0x0BA1B, GBP_HNGL_LVT},
+ {0x0BA1C, 0x0BA1C, GBP_HNGL_LV},
+ {0x0BA1D, 0x0BA37, GBP_HNGL_LVT},
+ {0x0BA38, 0x0BA38, GBP_HNGL_LV},
+ {0x0BA39, 0x0BA53, GBP_HNGL_LVT},
+ {0x0BA54, 0x0BA54, GBP_HNGL_LV},
+ {0x0BA55, 0x0BA6F, GBP_HNGL_LVT},
+ {0x0BA70, 0x0BA70, GBP_HNGL_LV},
+ {0x0BA71, 0x0BA8B, GBP_HNGL_LVT},
+ {0x0BA8C, 0x0BA8C, GBP_HNGL_LV},
+ {0x0BA8D, 0x0BAA7, GBP_HNGL_LVT},
+ {0x0BAA8, 0x0BAA8, GBP_HNGL_LV},
+ {0x0BAA9, 0x0BAC3, GBP_HNGL_LVT},
+ {0x0BAC4, 0x0BAC4, GBP_HNGL_LV},
+ {0x0BAC5, 0x0BADF, GBP_HNGL_LVT},
+ {0x0BAE0, 0x0BAE0, GBP_HNGL_LV},
+ {0x0BAE1, 0x0BAFB, GBP_HNGL_LVT},
+ {0x0BAFC, 0x0BAFC, GBP_HNGL_LV},
+ {0x0BAFD, 0x0BB17, GBP_HNGL_LVT},
+ {0x0BB18, 0x0BB18, GBP_HNGL_LV},
+ {0x0BB19, 0x0BB33, GBP_HNGL_LVT},
+ {0x0BB34, 0x0BB34, GBP_HNGL_LV},
+ {0x0BB35, 0x0BB4F, GBP_HNGL_LVT},
+ {0x0BB50, 0x0BB50, GBP_HNGL_LV},
+ {0x0BB51, 0x0BB6B, GBP_HNGL_LVT},
+ {0x0BB6C, 0x0BB6C, GBP_HNGL_LV},
+ {0x0BB6D, 0x0BB87, GBP_HNGL_LVT},
+ {0x0BB88, 0x0BB88, GBP_HNGL_LV},
+ {0x0BB89, 0x0BBA3, GBP_HNGL_LVT},
+ {0x0BBA4, 0x0BBA4, GBP_HNGL_LV},
+ {0x0BBA5, 0x0BBBF, GBP_HNGL_LVT},
+ {0x0BBC0, 0x0BBC0, GBP_HNGL_LV},
+ {0x0BBC1, 0x0BBDB, GBP_HNGL_LVT},
+ {0x0BBDC, 0x0BBDC, GBP_HNGL_LV},
+ {0x0BBDD, 0x0BBF7, GBP_HNGL_LVT},
+ {0x0BBF8, 0x0BBF8, GBP_HNGL_LV},
+ {0x0BBF9, 0x0BC13, GBP_HNGL_LVT},
+ {0x0BC14, 0x0BC14, GBP_HNGL_LV},
+ {0x0BC15, 0x0BC2F, GBP_HNGL_LVT},
+ {0x0BC30, 0x0BC30, GBP_HNGL_LV},
+ {0x0BC31, 0x0BC4B, GBP_HNGL_LVT},
+ {0x0BC4C, 0x0BC4C, GBP_HNGL_LV},
+ {0x0BC4D, 0x0BC67, GBP_HNGL_LVT},
+ {0x0BC68, 0x0BC68, GBP_HNGL_LV},
+ {0x0BC69, 0x0BC83, GBP_HNGL_LVT},
+ {0x0BC84, 0x0BC84, GBP_HNGL_LV},
+ {0x0BC85, 0x0BC9F, GBP_HNGL_LVT},
+ {0x0BCA0, 0x0BCA0, GBP_HNGL_LV},
+ {0x0BCA1, 0x0BCBB, GBP_HNGL_LVT},
+ {0x0BCBC, 0x0BCBC, GBP_HNGL_LV},
+ {0x0BCBD, 0x0BCD7, GBP_HNGL_LVT},
+ {0x0BCD8, 0x0BCD8, GBP_HNGL_LV},
+ {0x0BCD9, 0x0BCF3, GBP_HNGL_LVT},
+ {0x0BCF4, 0x0BCF4, GBP_HNGL_LV},
+ {0x0BCF5, 0x0BD0F, GBP_HNGL_LVT},
+ {0x0BD10, 0x0BD10, GBP_HNGL_LV},
+ {0x0BD11, 0x0BD2B, GBP_HNGL_LVT},
+ {0x0BD2C, 0x0BD2C, GBP_HNGL_LV},
+ {0x0BD2D, 0x0BD47, GBP_HNGL_LVT},
+ {0x0BD48, 0x0BD48, GBP_HNGL_LV},
+ {0x0BD49, 0x0BD63, GBP_HNGL_LVT},
+ {0x0BD64, 0x0BD64, GBP_HNGL_LV},
+ {0x0BD65, 0x0BD7F, GBP_HNGL_LVT},
+ {0x0BD80, 0x0BD80, GBP_HNGL_LV},
+ {0x0BD81, 0x0BD9B, GBP_HNGL_LVT},
+ {0x0BD9C, 0x0BD9C, GBP_HNGL_LV},
+ {0x0BD9D, 0x0BDB7, GBP_HNGL_LVT},
+ {0x0BDB8, 0x0BDB8, GBP_HNGL_LV},
+ {0x0BDB9, 0x0BDD3, GBP_HNGL_LVT},
+ {0x0BDD4, 0x0BDD4, GBP_HNGL_LV},
+ {0x0BDD5, 0x0BDEF, GBP_HNGL_LVT},
+ {0x0BDF0, 0x0BDF0, GBP_HNGL_LV},
+ {0x0BDF1, 0x0BE0B, GBP_HNGL_LVT},
+ {0x0BE0C, 0x0BE0C, GBP_HNGL_LV},
+ {0x0BE0D, 0x0BE27, GBP_HNGL_LVT},
+ {0x0BE28, 0x0BE28, GBP_HNGL_LV},
+ {0x0BE29, 0x0BE43, GBP_HNGL_LVT},
+ {0x0BE44, 0x0BE44, GBP_HNGL_LV},
+ {0x0BE45, 0x0BE5F, GBP_HNGL_LVT},
+ {0x0BE60, 0x0BE60, GBP_HNGL_LV},
+ {0x0BE61, 0x0BE7B, GBP_HNGL_LVT},
+ {0x0BE7C, 0x0BE7C, GBP_HNGL_LV},
+ {0x0BE7D, 0x0BE97, GBP_HNGL_LVT},
+ {0x0BE98, 0x0BE98, GBP_HNGL_LV},
+ {0x0BE99, 0x0BEB3, GBP_HNGL_LVT},
+ {0x0BEB4, 0x0BEB4, GBP_HNGL_LV},
+ {0x0BEB5, 0x0BECF, GBP_HNGL_LVT},
+ {0x0BED0, 0x0BED0, GBP_HNGL_LV},
+ {0x0BED1, 0x0BEEB, GBP_HNGL_LVT},
+ {0x0BEEC, 0x0BEEC, GBP_HNGL_LV},
+ {0x0BEED, 0x0BF07, GBP_HNGL_LVT},
+ {0x0BF08, 0x0BF08, GBP_HNGL_LV},
+ {0x0BF09, 0x0BF23, GBP_HNGL_LVT},
+ {0x0BF24, 0x0BF24, GBP_HNGL_LV},
+ {0x0BF25, 0x0BF3F, GBP_HNGL_LVT},
+ {0x0BF40, 0x0BF40, GBP_HNGL_LV},
+ {0x0BF41, 0x0BF5B, GBP_HNGL_LVT},
+ {0x0BF5C, 0x0BF5C, GBP_HNGL_LV},
+ {0x0BF5D, 0x0BF77, GBP_HNGL_LVT},
+ {0x0BF78, 0x0BF78, GBP_HNGL_LV},
+ {0x0BF79, 0x0BF93, GBP_HNGL_LVT},
+ {0x0BF94, 0x0BF94, GBP_HNGL_LV},
+ {0x0BF95, 0x0BFAF, GBP_HNGL_LVT},
+ {0x0BFB0, 0x0BFB0, GBP_HNGL_LV},
+ {0x0BFB1, 0x0BFCB, GBP_HNGL_LVT},
+ {0x0BFCC, 0x0BFCC, GBP_HNGL_LV},
+ {0x0BFCD, 0x0BFE7, GBP_HNGL_LVT},
+ {0x0BFE8, 0x0BFE8, GBP_HNGL_LV},
+ {0x0BFE9, 0x0C003, GBP_HNGL_LVT},
+ {0x0C004, 0x0C004, GBP_HNGL_LV},
+ {0x0C005, 0x0C01F, GBP_HNGL_LVT},
+ {0x0C020, 0x0C020, GBP_HNGL_LV},
+ {0x0C021, 0x0C03B, GBP_HNGL_LVT},
+ {0x0C03C, 0x0C03C, GBP_HNGL_LV},
+ {0x0C03D, 0x0C057, GBP_HNGL_LVT},
+ {0x0C058, 0x0C058, GBP_HNGL_LV},
+ {0x0C059, 0x0C073, GBP_HNGL_LVT},
+ {0x0C074, 0x0C074, GBP_HNGL_LV},
+ {0x0C075, 0x0C08F, GBP_HNGL_LVT},
+ {0x0C090, 0x0C090, GBP_HNGL_LV},
+ {0x0C091, 0x0C0AB, GBP_HNGL_LVT},
+ {0x0C0AC, 0x0C0AC, GBP_HNGL_LV},
+ {0x0C0AD, 0x0C0C7, GBP_HNGL_LVT},
+ {0x0C0C8, 0x0C0C8, GBP_HNGL_LV},
+ {0x0C0C9, 0x0C0E3, GBP_HNGL_LVT},
+ {0x0C0E4, 0x0C0E4, GBP_HNGL_LV},
+ {0x0C0E5, 0x0C0FF, GBP_HNGL_LVT},
+ {0x0C100, 0x0C100, GBP_HNGL_LV},
+ {0x0C101, 0x0C11B, GBP_HNGL_LVT},
+ {0x0C11C, 0x0C11C, GBP_HNGL_LV},
+ {0x0C11D, 0x0C137, GBP_HNGL_LVT},
+ {0x0C138, 0x0C138, GBP_HNGL_LV},
+ {0x0C139, 0x0C153, GBP_HNGL_LVT},
+ {0x0C154, 0x0C154, GBP_HNGL_LV},
+ {0x0C155, 0x0C16F, GBP_HNGL_LVT},
+ {0x0C170, 0x0C170, GBP_HNGL_LV},
+ {0x0C171, 0x0C18B, GBP_HNGL_LVT},
+ {0x0C18C, 0x0C18C, GBP_HNGL_LV},
+ {0x0C18D, 0x0C1A7, GBP_HNGL_LVT},
+ {0x0C1A8, 0x0C1A8, GBP_HNGL_LV},
+ {0x0C1A9, 0x0C1C3, GBP_HNGL_LVT},
+ {0x0C1C4, 0x0C1C4, GBP_HNGL_LV},
+ {0x0C1C5, 0x0C1DF, GBP_HNGL_LVT},
+ {0x0C1E0, 0x0C1E0, GBP_HNGL_LV},
+ {0x0C1E1, 0x0C1FB, GBP_HNGL_LVT},
+ {0x0C1FC, 0x0C1FC, GBP_HNGL_LV},
+ {0x0C1FD, 0x0C217, GBP_HNGL_LVT},
+ {0x0C218, 0x0C218, GBP_HNGL_LV},
+ {0x0C219, 0x0C233, GBP_HNGL_LVT},
+ {0x0C234, 0x0C234, GBP_HNGL_LV},
+ {0x0C235, 0x0C24F, GBP_HNGL_LVT},
+ {0x0C250, 0x0C250, GBP_HNGL_LV},
+ {0x0C251, 0x0C26B, GBP_HNGL_LVT},
+ {0x0C26C, 0x0C26C, GBP_HNGL_LV},
+ {0x0C26D, 0x0C287, GBP_HNGL_LVT},
+ {0x0C288, 0x0C288, GBP_HNGL_LV},
+ {0x0C289, 0x0C2A3, GBP_HNGL_LVT},
+ {0x0C2A4, 0x0C2A4, GBP_HNGL_LV},
+ {0x0C2A5, 0x0C2BF, GBP_HNGL_LVT},
+ {0x0C2C0, 0x0C2C0, GBP_HNGL_LV},
+ {0x0C2C1, 0x0C2DB, GBP_HNGL_LVT},
+ {0x0C2DC, 0x0C2DC, GBP_HNGL_LV},
+ {0x0C2DD, 0x0C2F7, GBP_HNGL_LVT},
+ {0x0C2F8, 0x0C2F8, GBP_HNGL_LV},
+ {0x0C2F9, 0x0C313, GBP_HNGL_LVT},
+ {0x0C314, 0x0C314, GBP_HNGL_LV},
+ {0x0C315, 0x0C32F, GBP_HNGL_LVT},
+ {0x0C330, 0x0C330, GBP_HNGL_LV},
+ {0x0C331, 0x0C34B, GBP_HNGL_LVT},
+ {0x0C34C, 0x0C34C, GBP_HNGL_LV},
+ {0x0C34D, 0x0C367, GBP_HNGL_LVT},
+ {0x0C368, 0x0C368, GBP_HNGL_LV},
+ {0x0C369, 0x0C383, GBP_HNGL_LVT},
+ {0x0C384, 0x0C384, GBP_HNGL_LV},
+ {0x0C385, 0x0C39F, GBP_HNGL_LVT},
+ {0x0C3A0, 0x0C3A0, GBP_HNGL_LV},
+ {0x0C3A1, 0x0C3BB, GBP_HNGL_LVT},
+ {0x0C3BC, 0x0C3BC, GBP_HNGL_LV},
+ {0x0C3BD, 0x0C3D7, GBP_HNGL_LVT},
+ {0x0C3D8, 0x0C3D8, GBP_HNGL_LV},
+ {0x0C3D9, 0x0C3F3, GBP_HNGL_LVT},
+ {0x0C3F4, 0x0C3F4, GBP_HNGL_LV},
+ {0x0C3F5, 0x0C40F, GBP_HNGL_LVT},
+ {0x0C410, 0x0C410, GBP_HNGL_LV},
+ {0x0C411, 0x0C42B, GBP_HNGL_LVT},
+ {0x0C42C, 0x0C42C, GBP_HNGL_LV},
+ {0x0C42D, 0x0C447, GBP_HNGL_LVT},
+ {0x0C448, 0x0C448, GBP_HNGL_LV},
+ {0x0C449, 0x0C463, GBP_HNGL_LVT},
+ {0x0C464, 0x0C464, GBP_HNGL_LV},
+ {0x0C465, 0x0C47F, GBP_HNGL_LVT},
+ {0x0C480, 0x0C480, GBP_HNGL_LV},
+ {0x0C481, 0x0C49B, GBP_HNGL_LVT},
+ {0x0C49C, 0x0C49C, GBP_HNGL_LV},
+ {0x0C49D, 0x0C4B7, GBP_HNGL_LVT},
+ {0x0C4B8, 0x0C4B8, GBP_HNGL_LV},
+ {0x0C4B9, 0x0C4D3, GBP_HNGL_LVT},
+ {0x0C4D4, 0x0C4D4, GBP_HNGL_LV},
+ {0x0C4D5, 0x0C4EF, GBP_HNGL_LVT},
+ {0x0C4F0, 0x0C4F0, GBP_HNGL_LV},
+ {0x0C4F1, 0x0C50B, GBP_HNGL_LVT},
+ {0x0C50C, 0x0C50C, GBP_HNGL_LV},
+ {0x0C50D, 0x0C527, GBP_HNGL_LVT},
+ {0x0C528, 0x0C528, GBP_HNGL_LV},
+ {0x0C529, 0x0C543, GBP_HNGL_LVT},
+ {0x0C544, 0x0C544, GBP_HNGL_LV},
+ {0x0C545, 0x0C55F, GBP_HNGL_LVT},
+ {0x0C560, 0x0C560, GBP_HNGL_LV},
+ {0x0C561, 0x0C57B, GBP_HNGL_LVT},
+ {0x0C57C, 0x0C57C, GBP_HNGL_LV},
+ {0x0C57D, 0x0C597, GBP_HNGL_LVT},
+ {0x0C598, 0x0C598, GBP_HNGL_LV},
+ {0x0C599, 0x0C5B3, GBP_HNGL_LVT},
+ {0x0C5B4, 0x0C5B4, GBP_HNGL_LV},
+ {0x0C5B5, 0x0C5CF, GBP_HNGL_LVT},
+ {0x0C5D0, 0x0C5D0, GBP_HNGL_LV},
+ {0x0C5D1, 0x0C5EB, GBP_HNGL_LVT},
+ {0x0C5EC, 0x0C5EC, GBP_HNGL_LV},
+ {0x0C5ED, 0x0C607, GBP_HNGL_LVT},
+ {0x0C608, 0x0C608, GBP_HNGL_LV},
+ {0x0C609, 0x0C623, GBP_HNGL_LVT},
+ {0x0C624, 0x0C624, GBP_HNGL_LV},
+ {0x0C625, 0x0C63F, GBP_HNGL_LVT},
+ {0x0C640, 0x0C640, GBP_HNGL_LV},
+ {0x0C641, 0x0C65B, GBP_HNGL_LVT},
+ {0x0C65C, 0x0C65C, GBP_HNGL_LV},
+ {0x0C65D, 0x0C677, GBP_HNGL_LVT},
+ {0x0C678, 0x0C678, GBP_HNGL_LV},
+ {0x0C679, 0x0C693, GBP_HNGL_LVT},
+ {0x0C694, 0x0C694, GBP_HNGL_LV},
+ {0x0C695, 0x0C6AF, GBP_HNGL_LVT},
+ {0x0C6B0, 0x0C6B0, GBP_HNGL_LV},
+ {0x0C6B1, 0x0C6CB, GBP_HNGL_LVT},
+ {0x0C6CC, 0x0C6CC, GBP_HNGL_LV},
+ {0x0C6CD, 0x0C6E7, GBP_HNGL_LVT},
+ {0x0C6E8, 0x0C6E8, GBP_HNGL_LV},
+ {0x0C6E9, 0x0C703, GBP_HNGL_LVT},
+ {0x0C704, 0x0C704, GBP_HNGL_LV},
+ {0x0C705, 0x0C71F, GBP_HNGL_LVT},
+ {0x0C720, 0x0C720, GBP_HNGL_LV},
+ {0x0C721, 0x0C73B, GBP_HNGL_LVT},
+ {0x0C73C, 0x0C73C, GBP_HNGL_LV},
+ {0x0C73D, 0x0C757, GBP_HNGL_LVT},
+ {0x0C758, 0x0C758, GBP_HNGL_LV},
+ {0x0C759, 0x0C773, GBP_HNGL_LVT},
+ {0x0C774, 0x0C774, GBP_HNGL_LV},
+ {0x0C775, 0x0C78F, GBP_HNGL_LVT},
+ {0x0C790, 0x0C790, GBP_HNGL_LV},
+ {0x0C791, 0x0C7AB, GBP_HNGL_LVT},
+ {0x0C7AC, 0x0C7AC, GBP_HNGL_LV},
+ {0x0C7AD, 0x0C7C7, GBP_HNGL_LVT},
+ {0x0C7C8, 0x0C7C8, GBP_HNGL_LV},
+ {0x0C7C9, 0x0C7E3, GBP_HNGL_LVT},
+ {0x0C7E4, 0x0C7E4, GBP_HNGL_LV},
+ {0x0C7E5, 0x0C7FF, GBP_HNGL_LVT},
+ {0x0C800, 0x0C800, GBP_HNGL_LV},
+ {0x0C801, 0x0C81B, GBP_HNGL_LVT},
+ {0x0C81C, 0x0C81C, GBP_HNGL_LV},
+ {0x0C81D, 0x0C837, GBP_HNGL_LVT},
+ {0x0C838, 0x0C838, GBP_HNGL_LV},
+ {0x0C839, 0x0C853, GBP_HNGL_LVT},
+ {0x0C854, 0x0C854, GBP_HNGL_LV},
+ {0x0C855, 0x0C86F, GBP_HNGL_LVT},
+ {0x0C870, 0x0C870, GBP_HNGL_LV},
+ {0x0C871, 0x0C88B, GBP_HNGL_LVT},
+ {0x0C88C, 0x0C88C, GBP_HNGL_LV},
+ {0x0C88D, 0x0C8A7, GBP_HNGL_LVT},
+ {0x0C8A8, 0x0C8A8, GBP_HNGL_LV},
+ {0x0C8A9, 0x0C8C3, GBP_HNGL_LVT},
+ {0x0C8C4, 0x0C8C4, GBP_HNGL_LV},
+ {0x0C8C5, 0x0C8DF, GBP_HNGL_LVT},
+ {0x0C8E0, 0x0C8E0, GBP_HNGL_LV},
+ {0x0C8E1, 0x0C8FB, GBP_HNGL_LVT},
+ {0x0C8FC, 0x0C8FC, GBP_HNGL_LV},
+ {0x0C8FD, 0x0C917, GBP_HNGL_LVT},
+ {0x0C918, 0x0C918, GBP_HNGL_LV},
+ {0x0C919, 0x0C933, GBP_HNGL_LVT},
+ {0x0C934, 0x0C934, GBP_HNGL_LV},
+ {0x0C935, 0x0C94F, GBP_HNGL_LVT},
+ {0x0C950, 0x0C950, GBP_HNGL_LV},
+ {0x0C951, 0x0C96B, GBP_HNGL_LVT},
+ {0x0C96C, 0x0C96C, GBP_HNGL_LV},
+ {0x0C96D, 0x0C987, GBP_HNGL_LVT},
+ {0x0C988, 0x0C988, GBP_HNGL_LV},
+ {0x0C989, 0x0C9A3, GBP_HNGL_LVT},
+ {0x0C9A4, 0x0C9A4, GBP_HNGL_LV},
+ {0x0C9A5, 0x0C9BF, GBP_HNGL_LVT},
+ {0x0C9C0, 0x0C9C0, GBP_HNGL_LV},
+ {0x0C9C1, 0x0C9DB, GBP_HNGL_LVT},
+ {0x0C9DC, 0x0C9DC, GBP_HNGL_LV},
+ {0x0C9DD, 0x0C9F7, GBP_HNGL_LVT},
+ {0x0C9F8, 0x0C9F8, GBP_HNGL_LV},
+ {0x0C9F9, 0x0CA13, GBP_HNGL_LVT},
+ {0x0CA14, 0x0CA14, GBP_HNGL_LV},
+ {0x0CA15, 0x0CA2F, GBP_HNGL_LVT},
+ {0x0CA30, 0x0CA30, GBP_HNGL_LV},
+ {0x0CA31, 0x0CA4B, GBP_HNGL_LVT},
+ {0x0CA4C, 0x0CA4C, GBP_HNGL_LV},
+ {0x0CA4D, 0x0CA67, GBP_HNGL_LVT},
+ {0x0CA68, 0x0CA68, GBP_HNGL_LV},
+ {0x0CA69, 0x0CA83, GBP_HNGL_LVT},
+ {0x0CA84, 0x0CA84, GBP_HNGL_LV},
+ {0x0CA85, 0x0CA9F, GBP_HNGL_LVT},
+ {0x0CAA0, 0x0CAA0, GBP_HNGL_LV},
+ {0x0CAA1, 0x0CABB, GBP_HNGL_LVT},
+ {0x0CABC, 0x0CABC, GBP_HNGL_LV},
+ {0x0CABD, 0x0CAD7, GBP_HNGL_LVT},
+ {0x0CAD8, 0x0CAD8, GBP_HNGL_LV},
+ {0x0CAD9, 0x0CAF3, GBP_HNGL_LVT},
+ {0x0CAF4, 0x0CAF4, GBP_HNGL_LV},
+ {0x0CAF5, 0x0CB0F, GBP_HNGL_LVT},
+ {0x0CB10, 0x0CB10, GBP_HNGL_LV},
+ {0x0CB11, 0x0CB2B, GBP_HNGL_LVT},
+ {0x0CB2C, 0x0CB2C, GBP_HNGL_LV},
+ {0x0CB2D, 0x0CB47, GBP_HNGL_LVT},
+ {0x0CB48, 0x0CB48, GBP_HNGL_LV},
+ {0x0CB49, 0x0CB63, GBP_HNGL_LVT},
+ {0x0CB64, 0x0CB64, GBP_HNGL_LV},
+ {0x0CB65, 0x0CB7F, GBP_HNGL_LVT},
+ {0x0CB80, 0x0CB80, GBP_HNGL_LV},
+ {0x0CB81, 0x0CB9B, GBP_HNGL_LVT},
+ {0x0CB9C, 0x0CB9C, GBP_HNGL_LV},
+ {0x0CB9D, 0x0CBB7, GBP_HNGL_LVT},
+ {0x0CBB8, 0x0CBB8, GBP_HNGL_LV},
+ {0x0CBB9, 0x0CBD3, GBP_HNGL_LVT},
+ {0x0CBD4, 0x0CBD4, GBP_HNGL_LV},
+ {0x0CBD5, 0x0CBEF, GBP_HNGL_LVT},
+ {0x0CBF0, 0x0CBF0, GBP_HNGL_LV},
+ {0x0CBF1, 0x0CC0B, GBP_HNGL_LVT},
+ {0x0CC0C, 0x0CC0C, GBP_HNGL_LV},
+ {0x0CC0D, 0x0CC27, GBP_HNGL_LVT},
+ {0x0CC28, 0x0CC28, GBP_HNGL_LV},
+ {0x0CC29, 0x0CC43, GBP_HNGL_LVT},
+ {0x0CC44, 0x0CC44, GBP_HNGL_LV},
+ {0x0CC45, 0x0CC5F, GBP_HNGL_LVT},
+ {0x0CC60, 0x0CC60, GBP_HNGL_LV},
+ {0x0CC61, 0x0CC7B, GBP_HNGL_LVT},
+ {0x0CC7C, 0x0CC7C, GBP_HNGL_LV},
+ {0x0CC7D, 0x0CC97, GBP_HNGL_LVT},
+ {0x0CC98, 0x0CC98, GBP_HNGL_LV},
+ {0x0CC99, 0x0CCB3, GBP_HNGL_LVT},
+ {0x0CCB4, 0x0CCB4, GBP_HNGL_LV},
+ {0x0CCB5, 0x0CCCF, GBP_HNGL_LVT},
+ {0x0CCD0, 0x0CCD0, GBP_HNGL_LV},
+ {0x0CCD1, 0x0CCEB, GBP_HNGL_LVT},
+ {0x0CCEC, 0x0CCEC, GBP_HNGL_LV},
+ {0x0CCED, 0x0CD07, GBP_HNGL_LVT},
+ {0x0CD08, 0x0CD08, GBP_HNGL_LV},
+ {0x0CD09, 0x0CD23, GBP_HNGL_LVT},
+ {0x0CD24, 0x0CD24, GBP_HNGL_LV},
+ {0x0CD25, 0x0CD3F, GBP_HNGL_LVT},
+ {0x0CD40, 0x0CD40, GBP_HNGL_LV},
+ {0x0CD41, 0x0CD5B, GBP_HNGL_LVT},
+ {0x0CD5C, 0x0CD5C, GBP_HNGL_LV},
+ {0x0CD5D, 0x0CD77, GBP_HNGL_LVT},
+ {0x0CD78, 0x0CD78, GBP_HNGL_LV},
+ {0x0CD79, 0x0CD93, GBP_HNGL_LVT},
+ {0x0CD94, 0x0CD94, GBP_HNGL_LV},
+ {0x0CD95, 0x0CDAF, GBP_HNGL_LVT},
+ {0x0CDB0, 0x0CDB0, GBP_HNGL_LV},
+ {0x0CDB1, 0x0CDCB, GBP_HNGL_LVT},
+ {0x0CDCC, 0x0CDCC, GBP_HNGL_LV},
+ {0x0CDCD, 0x0CDE7, GBP_HNGL_LVT},
+ {0x0CDE8, 0x0CDE8, GBP_HNGL_LV},
+ {0x0CDE9, 0x0CE03, GBP_HNGL_LVT},
+ {0x0CE04, 0x0CE04, GBP_HNGL_LV},
+ {0x0CE05, 0x0CE1F, GBP_HNGL_LVT},
+ {0x0CE20, 0x0CE20, GBP_HNGL_LV},
+ {0x0CE21, 0x0CE3B, GBP_HNGL_LVT},
+ {0x0CE3C, 0x0CE3C, GBP_HNGL_LV},
+ {0x0CE3D, 0x0CE57, GBP_HNGL_LVT},
+ {0x0CE58, 0x0CE58, GBP_HNGL_LV},
+ {0x0CE59, 0x0CE73, GBP_HNGL_LVT},
+ {0x0CE74, 0x0CE74, GBP_HNGL_LV},
+ {0x0CE75, 0x0CE8F, GBP_HNGL_LVT},
+ {0x0CE90, 0x0CE90, GBP_HNGL_LV},
+ {0x0CE91, 0x0CEAB, GBP_HNGL_LVT},
+ {0x0CEAC, 0x0CEAC, GBP_HNGL_LV},
+ {0x0CEAD, 0x0CEC7, GBP_HNGL_LVT},
+ {0x0CEC8, 0x0CEC8, GBP_HNGL_LV},
+ {0x0CEC9, 0x0CEE3, GBP_HNGL_LVT},
+ {0x0CEE4, 0x0CEE4, GBP_HNGL_LV},
+ {0x0CEE5, 0x0CEFF, GBP_HNGL_LVT},
+ {0x0CF00, 0x0CF00, GBP_HNGL_LV},
+ {0x0CF01, 0x0CF1B, GBP_HNGL_LVT},
+ {0x0CF1C, 0x0CF1C, GBP_HNGL_LV},
+ {0x0CF1D, 0x0CF37, GBP_HNGL_LVT},
+ {0x0CF38, 0x0CF38, GBP_HNGL_LV},
+ {0x0CF39, 0x0CF53, GBP_HNGL_LVT},
+ {0x0CF54, 0x0CF54, GBP_HNGL_LV},
+ {0x0CF55, 0x0CF6F, GBP_HNGL_LVT},
+ {0x0CF70, 0x0CF70, GBP_HNGL_LV},
+ {0x0CF71, 0x0CF8B, GBP_HNGL_LVT},
+ {0x0CF8C, 0x0CF8C, GBP_HNGL_LV},
+ {0x0CF8D, 0x0CFA7, GBP_HNGL_LVT},
+ {0x0CFA8, 0x0CFA8, GBP_HNGL_LV},
+ {0x0CFA9, 0x0CFC3, GBP_HNGL_LVT},
+ {0x0CFC4, 0x0CFC4, GBP_HNGL_LV},
+ {0x0CFC5, 0x0CFDF, GBP_HNGL_LVT},
+ {0x0CFE0, 0x0CFE0, GBP_HNGL_LV},
+ {0x0CFE1, 0x0CFFB, GBP_HNGL_LVT},
+ {0x0CFFC, 0x0CFFC, GBP_HNGL_LV},
+ {0x0CFFD, 0x0D017, GBP_HNGL_LVT},
+ {0x0D018, 0x0D018, GBP_HNGL_LV},
+ {0x0D019, 0x0D033, GBP_HNGL_LVT},
+ {0x0D034, 0x0D034, GBP_HNGL_LV},
+ {0x0D035, 0x0D04F, GBP_HNGL_LVT},
+ {0x0D050, 0x0D050, GBP_HNGL_LV},
+ {0x0D051, 0x0D06B, GBP_HNGL_LVT},
+ {0x0D06C, 0x0D06C, GBP_HNGL_LV},
+ {0x0D06D, 0x0D087, GBP_HNGL_LVT},
+ {0x0D088, 0x0D088, GBP_HNGL_LV},
+ {0x0D089, 0x0D0A3, GBP_HNGL_LVT},
+ {0x0D0A4, 0x0D0A4, GBP_HNGL_LV},
+ {0x0D0A5, 0x0D0BF, GBP_HNGL_LVT},
+ {0x0D0C0, 0x0D0C0, GBP_HNGL_LV},
+ {0x0D0C1, 0x0D0DB, GBP_HNGL_LVT},
+ {0x0D0DC, 0x0D0DC, GBP_HNGL_LV},
+ {0x0D0DD, 0x0D0F7, GBP_HNGL_LVT},
+ {0x0D0F8, 0x0D0F8, GBP_HNGL_LV},
+ {0x0D0F9, 0x0D113, GBP_HNGL_LVT},
+ {0x0D114, 0x0D114, GBP_HNGL_LV},
+ {0x0D115, 0x0D12F, GBP_HNGL_LVT},
+ {0x0D130, 0x0D130, GBP_HNGL_LV},
+ {0x0D131, 0x0D14B, GBP_HNGL_LVT},
+ {0x0D14C, 0x0D14C, GBP_HNGL_LV},
+ {0x0D14D, 0x0D167, GBP_HNGL_LVT},
+ {0x0D168, 0x0D168, GBP_HNGL_LV},
+ {0x0D169, 0x0D183, GBP_HNGL_LVT},
+ {0x0D184, 0x0D184, GBP_HNGL_LV},
+ {0x0D185, 0x0D19F, GBP_HNGL_LVT},
+ {0x0D1A0, 0x0D1A0, GBP_HNGL_LV},
+ {0x0D1A1, 0x0D1BB, GBP_HNGL_LVT},
+ {0x0D1BC, 0x0D1BC, GBP_HNGL_LV},
+ {0x0D1BD, 0x0D1D7, GBP_HNGL_LVT},
+ {0x0D1D8, 0x0D1D8, GBP_HNGL_LV},
+ {0x0D1D9, 0x0D1F3, GBP_HNGL_LVT},
+ {0x0D1F4, 0x0D1F4, GBP_HNGL_LV},
+ {0x0D1F5, 0x0D20F, GBP_HNGL_LVT},
+ {0x0D210, 0x0D210, GBP_HNGL_LV},
+ {0x0D211, 0x0D22B, GBP_HNGL_LVT},
+ {0x0D22C, 0x0D22C, GBP_HNGL_LV},
+ {0x0D22D, 0x0D247, GBP_HNGL_LVT},
+ {0x0D248, 0x0D248, GBP_HNGL_LV},
+ {0x0D249, 0x0D263, GBP_HNGL_LVT},
+ {0x0D264, 0x0D264, GBP_HNGL_LV},
+ {0x0D265, 0x0D27F, GBP_HNGL_LVT},
+ {0x0D280, 0x0D280, GBP_HNGL_LV},
+ {0x0D281, 0x0D29B, GBP_HNGL_LVT},
+ {0x0D29C, 0x0D29C, GBP_HNGL_LV},
+ {0x0D29D, 0x0D2B7, GBP_HNGL_LVT},
+ {0x0D2B8, 0x0D2B8, GBP_HNGL_LV},
+ {0x0D2B9, 0x0D2D3, GBP_HNGL_LVT},
+ {0x0D2D4, 0x0D2D4, GBP_HNGL_LV},
+ {0x0D2D5, 0x0D2EF, GBP_HNGL_LVT},
+ {0x0D2F0, 0x0D2F0, GBP_HNGL_LV},
+ {0x0D2F1, 0x0D30B, GBP_HNGL_LVT},
+ {0x0D30C, 0x0D30C, GBP_HNGL_LV},
+ {0x0D30D, 0x0D327, GBP_HNGL_LVT},
+ {0x0D328, 0x0D328, GBP_HNGL_LV},
+ {0x0D329, 0x0D343, GBP_HNGL_LVT},
+ {0x0D344, 0x0D344, GBP_HNGL_LV},
+ {0x0D345, 0x0D35F, GBP_HNGL_LVT},
+ {0x0D360, 0x0D360, GBP_HNGL_LV},
+ {0x0D361, 0x0D37B, GBP_HNGL_LVT},
+ {0x0D37C, 0x0D37C, GBP_HNGL_LV},
+ {0x0D37D, 0x0D397, GBP_HNGL_LVT},
+ {0x0D398, 0x0D398, GBP_HNGL_LV},
+ {0x0D399, 0x0D3B3, GBP_HNGL_LVT},
+ {0x0D3B4, 0x0D3B4, GBP_HNGL_LV},
+ {0x0D3B5, 0x0D3CF, GBP_HNGL_LVT},
+ {0x0D3D0, 0x0D3D0, GBP_HNGL_LV},
+ {0x0D3D1, 0x0D3EB, GBP_HNGL_LVT},
+ {0x0D3EC, 0x0D3EC, GBP_HNGL_LV},
+ {0x0D3ED, 0x0D407, GBP_HNGL_LVT},
+ {0x0D408, 0x0D408, GBP_HNGL_LV},
+ {0x0D409, 0x0D423, GBP_HNGL_LVT},
+ {0x0D424, 0x0D424, GBP_HNGL_LV},
+ {0x0D425, 0x0D43F, GBP_HNGL_LVT},
+ {0x0D440, 0x0D440, GBP_HNGL_LV},
+ {0x0D441, 0x0D45B, GBP_HNGL_LVT},
+ {0x0D45C, 0x0D45C, GBP_HNGL_LV},
+ {0x0D45D, 0x0D477, GBP_HNGL_LVT},
+ {0x0D478, 0x0D478, GBP_HNGL_LV},
+ {0x0D479, 0x0D493, GBP_HNGL_LVT},
+ {0x0D494, 0x0D494, GBP_HNGL_LV},
+ {0x0D495, 0x0D4AF, GBP_HNGL_LVT},
+ {0x0D4B0, 0x0D4B0, GBP_HNGL_LV},
+ {0x0D4B1, 0x0D4CB, GBP_HNGL_LVT},
+ {0x0D4CC, 0x0D4CC, GBP_HNGL_LV},
+ {0x0D4CD, 0x0D4E7, GBP_HNGL_LVT},
+ {0x0D4E8, 0x0D4E8, GBP_HNGL_LV},
+ {0x0D4E9, 0x0D503, GBP_HNGL_LVT},
+ {0x0D504, 0x0D504, GBP_HNGL_LV},
+ {0x0D505, 0x0D51F, GBP_HNGL_LVT},
+ {0x0D520, 0x0D520, GBP_HNGL_LV},
+ {0x0D521, 0x0D53B, GBP_HNGL_LVT},
+ {0x0D53C, 0x0D53C, GBP_HNGL_LV},
+ {0x0D53D, 0x0D557, GBP_HNGL_LVT},
+ {0x0D558, 0x0D558, GBP_HNGL_LV},
+ {0x0D559, 0x0D573, GBP_HNGL_LVT},
+ {0x0D574, 0x0D574, GBP_HNGL_LV},
+ {0x0D575, 0x0D58F, GBP_HNGL_LVT},
+ {0x0D590, 0x0D590, GBP_HNGL_LV},
+ {0x0D591, 0x0D5AB, GBP_HNGL_LVT},
+ {0x0D5AC, 0x0D5AC, GBP_HNGL_LV},
+ {0x0D5AD, 0x0D5C7, GBP_HNGL_LVT},
+ {0x0D5C8, 0x0D5C8, GBP_HNGL_LV},
+ {0x0D5C9, 0x0D5E3, GBP_HNGL_LVT},
+ {0x0D5E4, 0x0D5E4, GBP_HNGL_LV},
+ {0x0D5E5, 0x0D5FF, GBP_HNGL_LVT},
+ {0x0D600, 0x0D600, GBP_HNGL_LV},
+ {0x0D601, 0x0D61B, GBP_HNGL_LVT},
+ {0x0D61C, 0x0D61C, GBP_HNGL_LV},
+ {0x0D61D, 0x0D637, GBP_HNGL_LVT},
+ {0x0D638, 0x0D638, GBP_HNGL_LV},
+ {0x0D639, 0x0D653, GBP_HNGL_LVT},
+ {0x0D654, 0x0D654, GBP_HNGL_LV},
+ {0x0D655, 0x0D66F, GBP_HNGL_LVT},
+ {0x0D670, 0x0D670, GBP_HNGL_LV},
+ {0x0D671, 0x0D68B, GBP_HNGL_LVT},
+ {0x0D68C, 0x0D68C, GBP_HNGL_LV},
+ {0x0D68D, 0x0D6A7, GBP_HNGL_LVT},
+ {0x0D6A8, 0x0D6A8, GBP_HNGL_LV},
+ {0x0D6A9, 0x0D6C3, GBP_HNGL_LVT},
+ {0x0D6C4, 0x0D6C4, GBP_HNGL_LV},
+ {0x0D6C5, 0x0D6DF, GBP_HNGL_LVT},
+ {0x0D6E0, 0x0D6E0, GBP_HNGL_LV},
+ {0x0D6E1, 0x0D6FB, GBP_HNGL_LVT},
+ {0x0D6FC, 0x0D6FC, GBP_HNGL_LV},
+ {0x0D6FD, 0x0D717, GBP_HNGL_LVT},
+ {0x0D718, 0x0D718, GBP_HNGL_LV},
+ {0x0D719, 0x0D733, GBP_HNGL_LVT},
+ {0x0D734, 0x0D734, GBP_HNGL_LV},
+ {0x0D735, 0x0D74F, GBP_HNGL_LVT},
+ {0x0D750, 0x0D750, GBP_HNGL_LV},
+ {0x0D751, 0x0D76B, GBP_HNGL_LVT},
+ {0x0D76C, 0x0D76C, GBP_HNGL_LV},
+ {0x0D76D, 0x0D787, GBP_HNGL_LVT},
+ {0x0D788, 0x0D788, GBP_HNGL_LV},
+ {0x0D789, 0x0D7A3, GBP_HNGL_LVT},
+ {0x0D7B0, 0x0D7C6, GBP_HNGL_V},
+ {0x0D7CB, 0x0D7FB, GBP_HNGL_T},
+ {0x0FB1E, 0x0FB1E, GBP_INDC_EXT | GBP_EXT},
+ {0x0FE00, 0x0FE0F, GBP_EXT},
+ {0x0FE20, 0x0FE2F, GBP_INDC_EXT | GBP_EXT},
+ {0x0FEFF, 0x0FEFF, GBP_CTRL},
+ {0x0FF9E, 0x0FF9F, GBP_EXT},
+ {0x0FFF0, 0x0FFFB, GBP_CTRL},
+ {0x101FD, 0x101FD, GBP_INDC_EXT | GBP_EXT},
+ {0x102E0, 0x102E0, GBP_INDC_EXT | GBP_EXT},
+ {0x10376, 0x1037A, GBP_INDC_EXT | GBP_EXT},
+ {0x10A01, 0x10A03, GBP_EXT},
+ {0x10A05, 0x10A06, GBP_EXT},
+ {0x10A0C, 0x10A0C, GBP_EXT},
+ {0x10A0D, 0x10A0D, GBP_INDC_EXT | GBP_EXT},
+ {0x10A0E, 0x10A0E, GBP_EXT},
+ {0x10A0F, 0x10A0F, GBP_INDC_EXT | GBP_EXT},
+ {0x10A38, 0x10A3A, GBP_INDC_EXT | GBP_EXT},
+ {0x10A3F, 0x10A3F, GBP_INDC_EXT | GBP_EXT},
+ {0x10AE5, 0x10AE6, GBP_INDC_EXT | GBP_EXT},
+ {0x10D24, 0x10D27, GBP_INDC_EXT | GBP_EXT},
+ {0x10EAB, 0x10EAC, GBP_INDC_EXT | GBP_EXT},
+ {0x10EFD, 0x10EFF, GBP_INDC_EXT | GBP_EXT},
+ {0x10F46, 0x10F50, GBP_INDC_EXT | GBP_EXT},
+ {0x10F82, 0x10F85, GBP_INDC_EXT | GBP_EXT},
+ {0x11000, 0x11000, GBP_SM},
+ {0x11001, 0x11001, GBP_EXT},
+ {0x11002, 0x11002, GBP_SM},
+ {0x11038, 0x11046, GBP_EXT},
+ {0x11070, 0x11070, GBP_INDC_EXT | GBP_EXT},
+ {0x11073, 0x11074, GBP_EXT},
+ {0x1107F, 0x1107F, GBP_INDC_EXT | GBP_EXT},
+ {0x11080, 0x11081, GBP_EXT},
+ {0x11082, 0x11082, GBP_SM},
+ {0x110B0, 0x110B2, GBP_SM},
+ {0x110B3, 0x110B6, GBP_EXT},
+ {0x110B7, 0x110B8, GBP_SM},
+ {0x110B9, 0x110B9, GBP_EXT},
+ {0x110BA, 0x110BA, GBP_INDC_EXT | GBP_EXT},
+ {0x110BD, 0x110BD, GBP_PREP},
+ {0x110C2, 0x110C2, GBP_EXT},
+ {0x110CD, 0x110CD, GBP_PREP},
+ {0x11100, 0x11102, GBP_INDC_EXT | GBP_EXT},
+ {0x11127, 0x1112B, GBP_EXT},
+ {0x1112C, 0x1112C, GBP_SM},
+ {0x1112D, 0x11132, GBP_EXT},
+ {0x11133, 0x11134, GBP_INDC_EXT | GBP_EXT},
+ {0x11145, 0x11146, GBP_SM},
+ {0x11173, 0x11173, GBP_INDC_EXT | GBP_EXT},
+ {0x11180, 0x11181, GBP_EXT},
+ {0x11182, 0x11182, GBP_SM},
+ {0x111B3, 0x111B5, GBP_SM},
+ {0x111B6, 0x111BE, GBP_EXT},
+ {0x111BF, 0x111C0, GBP_SM},
+ {0x111C2, 0x111C3, GBP_PREP},
+ {0x111C9, 0x111C9, GBP_EXT},
+ {0x111CA, 0x111CA, GBP_INDC_EXT | GBP_EXT},
+ {0x111CB, 0x111CC, GBP_EXT},
+ {0x111CE, 0x111CE, GBP_SM},
+ {0x111CF, 0x111CF, GBP_EXT},
+ {0x1122C, 0x1122E, GBP_SM},
+ {0x1122F, 0x11231, GBP_EXT},
+ {0x11232, 0x11233, GBP_SM},
+ {0x11234, 0x11234, GBP_EXT},
+ {0x11235, 0x11235, GBP_SM},
+ {0x11236, 0x11236, GBP_INDC_EXT | GBP_EXT},
+ {0x11237, 0x11237, GBP_EXT},
+ {0x1123E, 0x1123E, GBP_EXT},
+ {0x11241, 0x11241, GBP_EXT},
+ {0x112DF, 0x112DF, GBP_EXT},
+ {0x112E0, 0x112E2, GBP_SM},
+ {0x112E3, 0x112E8, GBP_EXT},
+ {0x112E9, 0x112EA, GBP_INDC_EXT | GBP_EXT},
+ {0x11300, 0x11301, GBP_EXT},
+ {0x11302, 0x11303, GBP_SM},
+ {0x1133B, 0x1133C, GBP_INDC_EXT | GBP_EXT},
+ {0x1133E, 0x1133E, GBP_EXT},
+ {0x1133F, 0x1133F, GBP_SM},
+ {0x11340, 0x11340, GBP_EXT},
+ {0x11341, 0x11344, GBP_SM},
+ {0x11347, 0x11348, GBP_SM},
+ {0x1134B, 0x1134D, GBP_SM},
+ {0x11357, 0x11357, GBP_EXT},
+ {0x11362, 0x11363, GBP_SM},
+ {0x11366, 0x1136C, GBP_INDC_EXT | GBP_EXT},
+ {0x11370, 0x11374, GBP_INDC_EXT | GBP_EXT},
+ {0x11435, 0x11437, GBP_SM},
+ {0x11438, 0x1143F, GBP_EXT},
+ {0x11440, 0x11441, GBP_SM},
+ {0x11442, 0x11444, GBP_EXT},
+ {0x11445, 0x11445, GBP_SM},
+ {0x11446, 0x11446, GBP_INDC_EXT | GBP_EXT},
+ {0x1145E, 0x1145E, GBP_INDC_EXT | GBP_EXT},
+ {0x114B0, 0x114B0, GBP_EXT},
+ {0x114B1, 0x114B2, GBP_SM},
+ {0x114B3, 0x114B8, GBP_EXT},
+ {0x114B9, 0x114B9, GBP_SM},
+ {0x114BA, 0x114BA, GBP_EXT},
+ {0x114BB, 0x114BC, GBP_SM},
+ {0x114BD, 0x114BD, GBP_EXT},
+ {0x114BE, 0x114BE, GBP_SM},
+ {0x114BF, 0x114C0, GBP_EXT},
+ {0x114C1, 0x114C1, GBP_SM},
+ {0x114C2, 0x114C2, GBP_EXT},
+ {0x114C3, 0x114C3, GBP_INDC_EXT | GBP_EXT},
+ {0x115AF, 0x115AF, GBP_EXT},
+ {0x115B0, 0x115B1, GBP_SM},
+ {0x115B2, 0x115B5, GBP_EXT},
+ {0x115B8, 0x115BB, GBP_SM},
+ {0x115BC, 0x115BD, GBP_EXT},
+ {0x115BE, 0x115BE, GBP_SM},
+ {0x115BF, 0x115BF, GBP_EXT},
+ {0x115C0, 0x115C0, GBP_INDC_EXT | GBP_EXT},
+ {0x115DC, 0x115DD, GBP_EXT},
+ {0x11630, 0x11632, GBP_SM},
+ {0x11633, 0x1163A, GBP_EXT},
+ {0x1163B, 0x1163C, GBP_SM},
+ {0x1163D, 0x1163D, GBP_EXT},
+ {0x1163E, 0x1163E, GBP_SM},
+ {0x1163F, 0x11640, GBP_EXT},
+ {0x116AB, 0x116AB, GBP_EXT},
+ {0x116AC, 0x116AC, GBP_SM},
+ {0x116AD, 0x116AD, GBP_EXT},
+ {0x116AE, 0x116AF, GBP_SM},
+ {0x116B0, 0x116B5, GBP_EXT},
+ {0x116B6, 0x116B6, GBP_SM},
+ {0x116B7, 0x116B7, GBP_INDC_EXT | GBP_EXT},
+ {0x1171D, 0x1171F, GBP_EXT},
+ {0x11722, 0x11725, GBP_EXT},
+ {0x11726, 0x11726, GBP_SM},
+ {0x11727, 0x1172A, GBP_EXT},
+ {0x1172B, 0x1172B, GBP_INDC_EXT | GBP_EXT},
+ {0x1182C, 0x1182E, GBP_SM},
+ {0x1182F, 0x11837, GBP_EXT},
+ {0x11838, 0x11838, GBP_SM},
+ {0x11839, 0x11839, GBP_EXT},
+ {0x1183A, 0x1183A, GBP_INDC_EXT | GBP_EXT},
+ {0x11930, 0x11930, GBP_EXT},
+ {0x11931, 0x11935, GBP_SM},
+ {0x11937, 0x11938, GBP_SM},
+ {0x1193B, 0x1193C, GBP_EXT},
+ {0x1193D, 0x1193D, GBP_SM},
+ {0x1193E, 0x1193E, GBP_INDC_EXT | GBP_EXT},
+ {0x1193F, 0x1193F, GBP_PREP},
+ {0x11940, 0x11940, GBP_SM},
+ {0x11941, 0x11941, GBP_PREP},
+ {0x11942, 0x11942, GBP_SM},
+ {0x11943, 0x11943, GBP_INDC_EXT | GBP_EXT},
+ {0x119D1, 0x119D3, GBP_SM},
+ {0x119D4, 0x119D7, GBP_EXT},
+ {0x119DA, 0x119DB, GBP_EXT},
+ {0x119DC, 0x119DF, GBP_SM},
+ {0x119E0, 0x119E0, GBP_EXT},
+ {0x119E4, 0x119E4, GBP_SM},
+ {0x11A01, 0x11A0A, GBP_EXT},
+ {0x11A33, 0x11A33, GBP_EXT},
+ {0x11A34, 0x11A34, GBP_INDC_EXT | GBP_EXT},
+ {0x11A35, 0x11A38, GBP_EXT},
+ {0x11A39, 0x11A39, GBP_SM},
+ {0x11A3A, 0x11A3A, GBP_PREP},
+ {0x11A3B, 0x11A3E, GBP_EXT},
+ {0x11A47, 0x11A47, GBP_INDC_EXT | GBP_EXT},
+ {0x11A51, 0x11A56, GBP_EXT},
+ {0x11A57, 0x11A58, GBP_SM},
+ {0x11A59, 0x11A5B, GBP_EXT},
+ {0x11A84, 0x11A89, GBP_PREP},
+ {0x11A8A, 0x11A96, GBP_EXT},
+ {0x11A97, 0x11A97, GBP_SM},
+ {0x11A98, 0x11A98, GBP_EXT},
+ {0x11A99, 0x11A99, GBP_INDC_EXT | GBP_EXT},
+ {0x11C2F, 0x11C2F, GBP_SM},
+ {0x11C30, 0x11C36, GBP_EXT},
+ {0x11C38, 0x11C3D, GBP_EXT},
+ {0x11C3E, 0x11C3E, GBP_SM},
+ {0x11C3F, 0x11C3F, GBP_EXT},
+ {0x11C92, 0x11CA7, GBP_EXT},
+ {0x11CA9, 0x11CA9, GBP_SM},
+ {0x11CAA, 0x11CB0, GBP_EXT},
+ {0x11CB1, 0x11CB1, GBP_SM},
+ {0x11CB2, 0x11CB3, GBP_EXT},
+ {0x11CB4, 0x11CB4, GBP_SM},
+ {0x11CB5, 0x11CB6, GBP_EXT},
+ {0x11D31, 0x11D36, GBP_EXT},
+ {0x11D3A, 0x11D3A, GBP_EXT},
+ {0x11D3C, 0x11D3D, GBP_EXT},
+ {0x11D3F, 0x11D41, GBP_EXT},
+ {0x11D42, 0x11D42, GBP_INDC_EXT | GBP_EXT},
+ {0x11D43, 0x11D43, GBP_EXT},
+ {0x11D44, 0x11D45, GBP_INDC_EXT | GBP_EXT},
+ {0x11D46, 0x11D46, GBP_PREP},
+ {0x11D47, 0x11D47, GBP_EXT},
+ {0x11D8A, 0x11D8E, GBP_SM},
+ {0x11D90, 0x11D91, GBP_EXT},
+ {0x11D93, 0x11D94, GBP_SM},
+ {0x11D95, 0x11D95, GBP_EXT},
+ {0x11D96, 0x11D96, GBP_SM},
+ {0x11D97, 0x11D97, GBP_INDC_EXT | GBP_EXT},
+ {0x11EF3, 0x11EF4, GBP_EXT},
+ {0x11EF5, 0x11EF6, GBP_SM},
+ {0x11F00, 0x11F01, GBP_EXT},
+ {0x11F02, 0x11F02, GBP_PREP},
+ {0x11F03, 0x11F03, GBP_SM},
+ {0x11F34, 0x11F35, GBP_SM},
+ {0x11F36, 0x11F3A, GBP_EXT},
+ {0x11F3E, 0x11F3F, GBP_SM},
+ {0x11F40, 0x11F40, GBP_EXT},
+ {0x11F41, 0x11F41, GBP_SM},
+ {0x11F42, 0x11F42, GBP_INDC_EXT | GBP_EXT},
+ {0x13430, 0x1343F, GBP_CTRL},
+ {0x13440, 0x13440, GBP_EXT},
+ {0x13447, 0x13455, GBP_EXT},
+ {0x16AF0, 0x16AF4, GBP_INDC_EXT | GBP_EXT},
+ {0x16B30, 0x16B36, GBP_INDC_EXT | GBP_EXT},
+ {0x16F4F, 0x16F4F, GBP_EXT},
+ {0x16F51, 0x16F87, GBP_SM},
+ {0x16F8F, 0x16F92, GBP_EXT},
+ {0x16FE4, 0x16FE4, GBP_EXT},
+ {0x16FF0, 0x16FF1, GBP_SM},
+ {0x1BC9D, 0x1BC9D, GBP_EXT},
+ {0x1BC9E, 0x1BC9E, GBP_INDC_EXT | GBP_EXT},
+ {0x1BCA0, 0x1BCA3, GBP_CTRL},
+ {0x1CF00, 0x1CF2D, GBP_EXT},
+ {0x1CF30, 0x1CF46, GBP_EXT},
+ {0x1D165, 0x1D165, GBP_INDC_EXT | GBP_EXT},
+ {0x1D166, 0x1D166, GBP_SM},
+ {0x1D167, 0x1D169, GBP_INDC_EXT | GBP_EXT},
+ {0x1D16D, 0x1D16D, GBP_SM},
+ {0x1D16E, 0x1D172, GBP_INDC_EXT | GBP_EXT},
+ {0x1D173, 0x1D17A, GBP_CTRL},
+ {0x1D17B, 0x1D182, GBP_INDC_EXT | GBP_EXT},
+ {0x1D185, 0x1D18B, GBP_INDC_EXT | GBP_EXT},
+ {0x1D1AA, 0x1D1AD, GBP_INDC_EXT | GBP_EXT},
+ {0x1D242, 0x1D244, GBP_INDC_EXT | GBP_EXT},
+ {0x1DA00, 0x1DA36, GBP_EXT},
+ {0x1DA3B, 0x1DA6C, GBP_EXT},
+ {0x1DA75, 0x1DA75, GBP_EXT},
+ {0x1DA84, 0x1DA84, GBP_EXT},
+ {0x1DA9B, 0x1DA9F, GBP_EXT},
+ {0x1DAA1, 0x1DAAF, GBP_EXT},
+ {0x1E000, 0x1E006, GBP_INDC_EXT | GBP_EXT},
+ {0x1E008, 0x1E018, GBP_INDC_EXT | GBP_EXT},
+ {0x1E01B, 0x1E021, GBP_INDC_EXT | GBP_EXT},
+ {0x1E023, 0x1E024, GBP_INDC_EXT | GBP_EXT},
+ {0x1E026, 0x1E02A, GBP_INDC_EXT | GBP_EXT},
+ {0x1E08F, 0x1E08F, GBP_INDC_EXT | GBP_EXT},
+ {0x1E130, 0x1E136, GBP_INDC_EXT | GBP_EXT},
+ {0x1E2AE, 0x1E2AE, GBP_INDC_EXT | GBP_EXT},
+ {0x1E2EC, 0x1E2EF, GBP_INDC_EXT | GBP_EXT},
+ {0x1E4EC, 0x1E4EF, GBP_INDC_EXT | GBP_EXT},
+ {0x1E8D0, 0x1E8D6, GBP_INDC_EXT | GBP_EXT},
+ {0x1E944, 0x1E94A, GBP_INDC_EXT | GBP_EXT},
+ {0x1F000, 0x1F0FF, GBP_PIC},
+ {0x1F10D, 0x1F10F, GBP_PIC},
+ {0x1F12F, 0x1F12F, GBP_PIC},
+ {0x1F16C, 0x1F171, GBP_PIC},
+ {0x1F17E, 0x1F17F, GBP_PIC},
+ {0x1F18E, 0x1F18E, GBP_PIC},
+ {0x1F191, 0x1F19A, GBP_PIC},
+ {0x1F1AD, 0x1F1E5, GBP_PIC},
+ {0x1F1E6, 0x1F1FF, GBP_RI},
+ {0x1F201, 0x1F20F, GBP_PIC},
+ {0x1F21A, 0x1F21A, GBP_PIC},
+ {0x1F22F, 0x1F22F, GBP_PIC},
+ {0x1F232, 0x1F23A, GBP_PIC},
+ {0x1F23C, 0x1F23F, GBP_PIC},
+ {0x1F249, 0x1F3FA, GBP_PIC},
+ {0x1F3FB, 0x1F3FF, GBP_EXT},
+ {0x1F400, 0x1F53D, GBP_PIC},
+ {0x1F546, 0x1F64F, GBP_PIC},
+ {0x1F680, 0x1F6FF, GBP_PIC},
+ {0x1F774, 0x1F77F, GBP_PIC},
+ {0x1F7D5, 0x1F7FF, GBP_PIC},
+ {0x1F80C, 0x1F80F, GBP_PIC},
+ {0x1F848, 0x1F84F, GBP_PIC},
+ {0x1F85A, 0x1F85F, GBP_PIC},
+ {0x1F888, 0x1F88F, GBP_PIC},
+ {0x1F8AE, 0x1F8FF, GBP_PIC},
+ {0x1F90C, 0x1F93A, GBP_PIC},
+ {0x1F93C, 0x1F945, GBP_PIC},
+ {0x1F947, 0x1FAFF, GBP_PIC},
+ {0x1FC00, 0x1FFFD, GBP_PIC},
+ {0xE0000, 0xE001F, GBP_CTRL},
+ {0xE0020, 0xE007F, GBP_EXT},
+ {0xE0080, 0xE00FF, GBP_CTRL},
+ {0xE0100, 0xE01EF, GBP_EXT},
+ {0xE01F0, 0xE0FFF, GBP_CTRL},
+};
+
+#endif /* !RUNE_INTERNAL_GBRK_LOOKUP_H */
diff --git a/vendor/librune/include/internal/types.h b/vendor/librune/include/internal/types.h
new file mode 100644
index 0000000..b2fa34c
--- /dev/null
+++ b/vendor/librune/include/internal/types.h
@@ -0,0 +1,17 @@
+#ifndef RUNE_INTERNAL_TYPES_H
+#define RUNE_INTERNAL_TYPES_H
+
+#include <stddef.h> /* IWYU pragma: export */
+#include <stdint.h>
+
+typedef unsigned char char8_t;
+typedef uint_least32_t rune;
+
+#if _RUNE_NEEDS_U8VIEW
+struct u8view {
+ const char8_t *p;
+ size_t len;
+};
+#endif
+
+#endif /* !RUNE_INTERNAL_TYPES_H */
diff --git a/vendor/librune/include/rune.h b/vendor/librune/include/rune.h
new file mode 100644
index 0000000..31ed2e2
--- /dev/null
+++ b/vendor/librune/include/rune.h
@@ -0,0 +1,38 @@
+#ifndef RUNE_RUNE_H
+#define RUNE_RUNE_H
+
+#include <inttypes.h>
+
+#include "internal/types.h" /* IWYU pragma: export */
+
+#define _RUNE_PRIDEF(c) PRI##c##LEAST32
+#define _RUNE_SCNDEF(c) SCN##c##LEAST32
+
+#ifdef PRIbLEAST32
+# define PRIbRUNE _RUNE_PRIDEF(b)
+#endif
+#ifdef PRIBLEAST32
+# define PRIBRUNE _RUNE_PRIDEF(B)
+#endif
+#define PRIdRUNE _RUNE_PRIDEF(d)
+#define PRIiRUNE _RUNE_PRIDEF(i)
+#define PRIuRUNE _RUNE_PRIDEF(u)
+#define PRIoRUNE _RUNE_PRIDEF(o)
+#define PRIxRUNE _RUNE_PRIDEF(x)
+#define PRIXRUNE _RUNE_PRIDEF(X)
+
+#ifdef SCNbLEAST32
+# define SCNbRUNE _RUNE_SCNDEF(b)
+#endif
+#define SCNdRUNE _RUNE_SCNDEF(d)
+#define SCNiRUNE _RUNE_SCNDEF(i)
+#define SCNuRUNE _RUNE_SCNDEF(u)
+#define SCNoRUNE _RUNE_SCNDEF(o)
+#define SCNxRUNE _RUNE_SCNDEF(x)
+
+#define RUNE_C(x) UINT32_C(x)
+
+#define RUNE_ERROR ((rune)0xFFFD)
+#define RUNE_MAX ((rune)RUNE_C(0x10FFFF))
+
+#endif /* !RUNE_RUNE_H */
diff --git a/vendor/librune/include/utf8.h b/vendor/librune/include/utf8.h
new file mode 100644
index 0000000..0ebd745
--- /dev/null
+++ b/vendor/librune/include/utf8.h
@@ -0,0 +1,47 @@
+#ifndef RUNE_UTF8_H
+#define RUNE_UTF8_H
+
+#if __STDC_VERSION__ < 202311L
+# include <stdbool.h> /* IWYU pragma: export */
+# define _RUNE_UNSEQUENCED
+#else
+# define _RUNE_UNSEQUENCED [[unsequenced]]
+#endif
+
+#define _RUNE_NEEDS_U8VIEW 1
+#include "internal/types.h" /* IWYU pragma: export */
+
+#define U8_LEN_MAX (4)
+
+int rtou8(char8_t *, rune, size_t);
+int u8tor(rune *, const char8_t *);
+int u8tor_uc(rune *, const char8_t *);
+
+const char8_t *u8chk(const char8_t *, size_t);
+bool u8chkr(rune);
+
+_RUNE_UNSEQUENCED int u8wdth(rune);
+
+size_t u8len(const char8_t *, size_t);
+
+const char8_t *u8next(rune *, const char8_t **, size_t *);
+const char8_t *u8prev(rune *, const char8_t **, const char8_t *);
+
+const char8_t *u8chr(const char8_t *, rune, size_t);
+const char8_t *u8rchr(const char8_t *, rune, size_t);
+
+size_t u8set(const char8_t *, rune, size_t);
+
+/* clang-format off */
+size_t u8spn(const char8_t *, size_t, const rune *, size_t);
+size_t u8bspn(const char8_t *, size_t, const rune *, size_t);
+size_t u8cspn(const char8_t *, size_t, const rune *, size_t);
+size_t u8cbspn(const char8_t *, size_t, const rune *, size_t);
+
+#define U8SPN(S, N, P) u8spn((S), (N), (P), (sizeof(P) / sizeof(*(P))))
+#define U8BSPN(S, N, P) u8bspn((S), (N), (P), (sizeof(P) / sizeof(*(P))))
+#define U8CSPN(S, N, P) u8cspn((S), (N), (P), (sizeof(P) / sizeof(*(P))))
+#define U8CBSPN(S, N, P) u8cbspn((S), (N), (P), (sizeof(P) / sizeof(*(P))))
+/* clang-format on */
+
+#endif /* !RUNE_UTF8_H */
diff --git a/vendor/librune/lib/gbrk/u8glen.c b/vendor/librune/lib/gbrk/u8glen.c
new file mode 100644
index 0000000..13cac7e
--- /dev/null
+++ b/vendor/librune/lib/gbrk/u8glen.c
@@ -0,0 +1,13 @@
+#include "gbrk.h"
+
+size_t
+u8glen(const char8_t *s, size_t n)
+{
+ size_t m = 0;
+ struct u8view unused;
+
+ while (u8gnext(&unused, &s, &n))
+ m++;
+
+ return m;
+}
diff --git a/vendor/librune/lib/gbrk/u8gnext.c b/vendor/librune/lib/gbrk/u8gnext.c
new file mode 100644
index 0000000..875d5cb
--- /dev/null
+++ b/vendor/librune/lib/gbrk/u8gnext.c
@@ -0,0 +1,165 @@
+#include <sys/types.h>
+
+#include "gbrk.h"
+#include "utf8.h"
+
+#include "internal/common.h"
+#include "internal/gbrk_lookup.h"
+
+#define lengthof(a) (sizeof(a) / sizeof(*(a)))
+
+struct gbrk_state {
+ enum {
+ GB9C_NONE,
+ GB9C_CNSNT,
+ GB9C_LNK,
+ } gb9c;
+ bool gb11 : 1;
+ bool gb12 : 1;
+};
+
+static bool u8isgbrk(rune, rune, struct gbrk_state *);
+static gbrk_prop getprop(rune);
+
+const char8_t *
+u8gnext(struct u8view *g, const char8_t **s, size_t *n)
+{
+ int m;
+ rune ch1;
+ const char8_t *p;
+ struct gbrk_state gs = {0};
+
+ if (*n == 0)
+ return nullptr;
+
+ g->p = p = *s;
+ p += u8tor_uc(&ch1, p);
+
+ for (;;) {
+ rune ch2;
+
+ if ((size_t)(p - *s) >= *n)
+ ch2 = 0;
+ else
+ m = u8tor_uc(&ch2, p);
+ if (u8isgbrk(ch1, ch2, &gs)) {
+ *n -= g->len = p - *s;
+ return *s = p;
+ }
+
+ ch1 = ch2;
+ p += m;
+ }
+}
+
+bool
+u8isgbrk(rune a, rune b, struct gbrk_state *gs)
+{
+ gbrk_prop ap, bp;
+
+ /* GB1 & GB2 */
+ if (!a || !b)
+ goto do_break;
+
+ /* GB3 & ASCII fast-track */
+ if ((a | b) < 0x300) {
+ if (a == '\r' && b == '\n')
+ return false;
+ goto do_break;
+ }
+
+ /* GB4 */
+ if (a == '\r' || a == '\n' || ((ap = getprop(a)) & GBP_CTRL))
+ goto do_break;
+
+ /* GB5 */
+ if (b == '\r' || b == '\n' || ((bp = getprop(b)) & GBP_CTRL))
+ goto do_break;
+
+ /* Setting flags for GB9c */
+ if (ap & GBP_INDC_CNSNT)
+ gs->gb9c = GB9C_CNSNT;
+ else if ((ap & GBP_INDC_LNK) && gs->gb9c == GB9C_CNSNT)
+ gs->gb9c = GB9C_LNK;
+
+ /* GB6 */
+ if ((ap & GBP_HNGL_L)
+ && (bp & (GBP_HNGL_L | GBP_HNGL_V | GBP_HNGL_LV | GBP_HNGL_LVT)))
+ {
+ return false;
+ }
+
+ /* GB7 */
+ if ((ap & (GBP_HNGL_LV | GBP_HNGL_V)) && (bp & (GBP_HNGL_V | GBP_HNGL_T)))
+ return false;
+
+ /* GB8 */
+ if ((ap & (GBP_HNGL_LVT | GBP_HNGL_T)) && (bp & GBP_HNGL_T))
+ return false;
+
+ /* GB9 */
+ if (bp & (GBP_EXT | GBP_ZWJ)) {
+ if (ap & GBP_PIC)
+ gs->gb11 = true;
+ return false;
+ }
+
+ /* GB9a */
+ if (bp & GBP_SM)
+ return false;
+
+ /* GB9b */
+ if (ap & GBP_PREP)
+ return false;
+
+ /* GB9c */
+ if ((ap & (GBP_INDC_EXT | GBP_INDC_LNK)) && (bp & GBP_INDC_CNSNT)
+ && gs->gb9c == GB9C_LNK)
+ {
+ return false;
+ }
+
+ /* GB11 */
+ if (gs->gb11) {
+ if ((ap & GBP_EXT) && (bp & (GBP_EXT | GBP_ZWJ)))
+ return false;
+ if ((ap & GBP_ZWJ) && (bp & GBP_PIC))
+ return false;
+ }
+
+ /* GB12 & GB13 */
+ if (ap & GBP_RI) {
+ if (gs->gb12 || !(bp & GBP_RI))
+ goto do_break;
+ gs->gb12 = true;
+ return false;
+ }
+
+ /* GB999 */
+do_break:
+ gs->gb9c = GB9C_NONE;
+ gs->gb11 = gs->gb12 = false;
+ return true;
+}
+
+gbrk_prop
+getprop(rune ch)
+{
+ ssize_t lo, hi;
+
+ lo = 0;
+ hi = lengthof(gbrk_prop_tbl) - 1;
+
+ while (lo <= hi) {
+ ssize_t i = (lo + hi) / 2;
+
+ if (ch < gbrk_prop_tbl[i].lo)
+ hi = i - 1;
+ else if (ch > gbrk_prop_tbl[i].hi)
+ lo = i + 1;
+ else
+ return gbrk_prop_tbl[i].prop;
+ }
+
+ return GBP_OTHER;
+}
diff --git a/vendor/librune/lib/utf8/rtou8.c b/vendor/librune/lib/utf8/rtou8.c
new file mode 100644
index 0000000..1823f08
--- /dev/null
+++ b/vendor/librune/lib/utf8/rtou8.c
@@ -0,0 +1,36 @@
+#include "utf8.h"
+
+#include "internal/common.h"
+
+int
+rtou8(char8_t *s, rune ch, size_t n)
+{
+ if (ch <= _1B_MAX) {
+ if (n >= 1)
+ s[0] = ch;
+ return 1;
+ } else if (ch <= _2B_MAX) {
+ if (n >= 2) {
+ s[0] = (ch >> 6) | 0xC0;
+ s[1] = (ch & 0x3F) | 0x80;
+ }
+ return 2;
+ } else if (ch <= _3B_MAX) {
+ if (n >= 3) {
+ s[0] = (ch >> 12) | 0xE0;
+ s[1] = ((ch >> 6) & 0x3F) | 0x80;
+ s[2] = (ch & 0x3F) | 0x80;
+ }
+ return 3;
+ } else if (ch <= _4B_MAX) {
+ if (n >= 4) {
+ s[0] = (ch >> 18) | 0xF0;
+ s[1] = ((ch >> 12) & 0x3F) | 0x80;
+ s[2] = ((ch >> 6) & 0x3F) | 0x80;
+ s[3] = (ch & 0x3F) | 0x80;
+ }
+ return 4;
+ }
+
+ unreachable();
+}
diff --git a/vendor/librune/lib/utf8/u8bspn.c b/vendor/librune/lib/utf8/u8bspn.c
new file mode 100644
index 0000000..3ccd469
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8bspn.c
@@ -0,0 +1,22 @@
+#include "utf8.h"
+
+size_t
+u8bspn(const char8_t *s, size_t n, const rune *p, size_t m)
+{
+ rune ch;
+ size_t k = 0;
+
+ while (u8next(&ch, &s, &n)) {
+ for (size_t i = 0; i < m; i++) {
+ if (p[i] == ch) {
+ k += u8wdth(ch);
+ goto found;
+ }
+ }
+
+ break;
+found:;
+ }
+
+ return k;
+}
diff --git a/vendor/librune/lib/utf8/u8cbspn.c b/vendor/librune/lib/utf8/u8cbspn.c
new file mode 100644
index 0000000..b51c300
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8cbspn.c
@@ -0,0 +1,20 @@
+#include "utf8.h"
+
+size_t
+u8cbspn(const char8_t *s, size_t n, const rune *p, size_t m)
+{
+ rune ch;
+ size_t k = 0;
+
+ while (u8next(&ch, &s, &n)) {
+ for (size_t i = 0; i < m; i++) {
+ if (p[i] == ch)
+ goto found;
+ }
+
+ k += u8wdth(ch);
+ }
+
+found:
+ return k;
+}
diff --git a/vendor/librune/lib/utf8/u8chk.c b/vendor/librune/lib/utf8/u8chk.c
new file mode 100644
index 0000000..9a2cf03
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8chk.c
@@ -0,0 +1,19 @@
+#include "rune.h"
+#include "utf8.h"
+
+#include "internal/common.h"
+
+const char8_t *
+u8chk(const char8_t *s, size_t n)
+{
+ while (n) {
+ rune ch;
+ int m = u8tor(&ch, s);
+
+ if (ch == RUNE_ERROR)
+ return s;
+ n += m;
+ }
+
+ return nullptr;
+}
diff --git a/vendor/librune/lib/utf8/u8chkr.c b/vendor/librune/lib/utf8/u8chkr.c
new file mode 100644
index 0000000..4510f16
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8chkr.c
@@ -0,0 +1,9 @@
+#include "rune.h"
+#include "utf8.h"
+
+bool
+u8chkr(rune ch)
+{
+ return !((ch >= 0xD800 && ch <= 0xDFFF) || ch == 0xFFFE || ch == 0xFFFF
+ || ch > RUNE_MAX);
+}
diff --git a/vendor/librune/lib/utf8/u8chr.c b/vendor/librune/lib/utf8/u8chr.c
new file mode 100644
index 0000000..4ecbd10
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8chr.c
@@ -0,0 +1,97 @@
+#include <stdint.h>
+#include <string.h>
+
+#include "utf8.h"
+
+#include "internal/common.h"
+
+/* NOTE: The memmem*() functions were taken directly from the memmem()
+ implementation on OpenBSD. As a result, these functions are licensed under
+ OpenBSDs 2-Clause BSD License instead of this libraries 0-Clause BSD License.
+
+ The license for these functions is as follows:
+
+ Copyright © 2005–2020 Rich Felker, et al.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ “Software”), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+static const char8_t *
+memmem2(const char8_t *h, size_t k, const char8_t *n)
+{
+ uint16_t hw, nw;
+ hw = h[0] << 8 | h[1];
+ nw = n[0] << 8 | n[1];
+
+ for (h += 2, k -= 2; k; k--, hw = hw << 8 | *h++) {
+ if (hw == nw)
+ return h - 2;
+ }
+ return hw == nw ? h - 2 : nullptr;
+}
+
+static const char8_t *
+memmem3(const char8_t *h, size_t k, const char8_t *n)
+{
+ uint32_t hw, nw;
+ hw = h[0] << 24 | h[1] << 16 | h[2] << 8;
+ nw = n[0] << 24 | n[1] << 16 | n[2] << 8;
+
+ for (h += 3, k -= 3; k; k--, hw = (hw | *h++) << 8) {
+ if (hw == nw)
+ return h - 3;
+ }
+ return hw == nw ? h - 3 : nullptr;
+}
+
+static const char8_t *
+memmem4(const char8_t *h, size_t k, const char8_t *n)
+{
+ uint32_t hw, nw;
+ hw = h[0] << 24 | h[1] << 16 | h[2] << 8 | h[3];
+ nw = n[0] << 24 | n[1] << 16 | n[2] << 8 | n[3];
+
+ for (h += 4, k -= 4; k; k--, hw = hw << 8 | *h++) {
+ if (hw == nw)
+ return h - 4;
+ }
+ return hw == nw ? h - 4 : nullptr;
+}
+
+const char8_t *
+u8chr(const char8_t *s, rune ch, size_t n)
+{
+ char8_t buf[U8_LEN_MAX];
+ int m = rtou8(buf, ch, sizeof(buf));
+
+ if (n < (size_t)m)
+ return nullptr;
+ switch (m) {
+ case 1:
+ return memchr(s, ch, n);
+ case 2:
+ return memmem2(s, n, buf);
+ case 3:
+ return memmem3(s, n, buf);
+ case 4:
+ return memmem4(s, n, buf);
+ }
+
+ unreachable();
+}
diff --git a/vendor/librune/lib/utf8/u8cspn.c b/vendor/librune/lib/utf8/u8cspn.c
new file mode 100644
index 0000000..7d46a0b
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8cspn.c
@@ -0,0 +1,20 @@
+#include "utf8.h"
+
+size_t
+u8cspn(const char8_t *s, size_t n, const rune *p, size_t m)
+{
+ rune ch;
+ size_t k = 0;
+
+ while (u8next(&ch, &s, &n)) {
+ for (size_t i = 0; i < m; i++) {
+ if (p[i] == ch)
+ goto found;
+ }
+
+ k++;
+ }
+
+found:
+ return k;
+}
diff --git a/vendor/librune/lib/utf8/u8len.c b/vendor/librune/lib/utf8/u8len.c
new file mode 100644
index 0000000..fc66ee7
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8len.c
@@ -0,0 +1,13 @@
+#include "utf8.h"
+
+size_t
+u8len(const char8_t *s, size_t n)
+{
+ rune unused;
+ size_t m = 0;
+
+ while (u8next(&unused, &s, &n))
+ m++;
+
+ return m;
+}
diff --git a/vendor/librune/lib/utf8/u8next.c b/vendor/librune/lib/utf8/u8next.c
new file mode 100644
index 0000000..8edc084
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8next.c
@@ -0,0 +1,14 @@
+#include "utf8.h"
+
+#include "internal/common.h"
+
+const char8_t *
+u8next(rune *ch, const char8_t **s, size_t *n)
+{
+ int m;
+
+ if (*n == 0)
+ return nullptr;
+ *n -= m = u8tor_uc(ch, *s);
+ return *s += m;
+}
diff --git a/vendor/librune/lib/utf8/u8prev.c b/vendor/librune/lib/utf8/u8prev.c
new file mode 100644
index 0000000..fac0fc7
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8prev.c
@@ -0,0 +1,37 @@
+#include "rune.h"
+#include "utf8.h"
+
+#include "internal/common.h"
+
+const char8_t *
+u8prev(rune *ch, const char8_t **p, const char8_t *start)
+{
+ int off;
+ bool match = true;
+ const char8_t *s = *p;
+ ptrdiff_t d = s - start;
+
+ if (d <= 0) {
+ return nullptr;
+ } else if (U1(s[-1])) {
+ *ch = s[-1];
+ off = 1;
+ } else if (d > 1 && UC(s[-1]) && U2(s[-2])) {
+ *ch = ((s[-2] & 0x1F) << 6) | (s[-1] & 0x3F);
+ off = 2;
+ } else if (d > 2 && UC(s[-1]) && UC(s[-2]) && U3(s[-3])) {
+ *ch = ((s[-3] & 0x0F) << 12) | ((s[-2] & 0x3F) << 6) | (s[-1] & 0x3F);
+ off = 3;
+ } else if (d > 3 && UC(s[-1]) && UC(s[-2]) && UC(s[-3]) && U4(s[-4])) {
+ *ch = ((s[-4] & 0x07) << 18) | ((s[-3] & 0x3F) << 12)
+ | ((s[-2] & 0x3F) << 6) | (s[-1] & 0x3F);
+ off = 4;
+ } else
+ match = false;
+
+ if (match && u8chkr(*ch))
+ return *p -= off;
+
+ *ch = RUNE_ERROR;
+ return *p--;
+}
diff --git a/vendor/librune/lib/utf8/u8rchr.c b/vendor/librune/lib/utf8/u8rchr.c
new file mode 100644
index 0000000..15fff51
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8rchr.c
@@ -0,0 +1,87 @@
+#include <stdint.h>
+
+#include "utf8.h"
+
+#include "internal/common.h"
+
+static const char8_t *
+memrchr1(const char8_t *s, size_t k, const char8_t *n)
+{
+ for (const char8_t *p = s + k - 1; k-- > 0; p--) {
+ if (*p == *n)
+ return p;
+ }
+ return nullptr;
+}
+
+static const char8_t *
+memrchr2(const char8_t *h, size_t k, const char8_t *n)
+{
+ uint16_t hw, nw;
+ const char8_t *H = h + k - 1;
+ hw = H[-1] << 8 | H[-0];
+ nw = n[+0] << 8 | n[+1];
+
+ for (H -= 2, k -= 2; k; k--, hw = hw >> 8 | (*H-- << 8)) {
+ if (hw == nw)
+ return H + 1;
+ }
+
+ return hw == nw ? H + 1 : nullptr;
+}
+
+static const char8_t *
+memrchr3(const char8_t *h, size_t k, const char8_t *n)
+{
+ uint32_t hw, nw;
+ const char8_t *H = h + k - 1;
+ hw = H[-2] << 24 | H[-1] << 16 | H[-0] << 8;
+ nw = n[+0] << 24 | n[+1] << 16 | n[+2] << 8;
+
+ for (H -= 3, k -= 3; k;
+ k--, hw = (hw >> 8 | (*H-- << 24)) & UINT32_C(0xFFFFFF00))
+ {
+ if (hw == nw)
+ return H + 1;
+ }
+
+ return hw == nw ? H + 1 : nullptr;
+}
+
+static const char8_t *
+memrchr4(const char8_t *h, size_t k, const char8_t *n)
+{
+ uint32_t hw, nw;
+ const char8_t *H = h + k - 1;
+ hw = H[-3] << 24 | H[-2] << 16 | H[-1] << 8 | H[-0];
+ nw = n[+0] << 24 | n[+1] << 16 | n[+2] << 8 | n[+3];
+
+ for (H -= 4, k -= 4; k; k--, hw = hw >> 8 | (*H-- << 24)) {
+ if (hw == nw)
+ return H + 1;
+ }
+
+ return hw == nw ? H + 1 : nullptr;
+}
+
+const char8_t *
+u8rchr(const char8_t *s, rune ch, size_t n)
+{
+ char8_t buf[U8_LEN_MAX];
+ int m = rtou8(buf, ch, sizeof(buf));
+
+ if (n < (size_t)m)
+ return nullptr;
+ switch (m) {
+ case 1:
+ return memrchr1(s, n, buf);
+ case 2:
+ return memrchr2(s, n, buf);
+ case 3:
+ return memrchr3(s, n, buf);
+ case 4:
+ return memrchr4(s, n, buf);
+ }
+
+ unreachable();
+}
diff --git a/vendor/librune/lib/utf8/u8set.c b/vendor/librune/lib/utf8/u8set.c
new file mode 100644
index 0000000..0dfba2c
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8set.c
@@ -0,0 +1,24 @@
+#include <string.h>
+
+#include "utf8.h"
+
+#include "internal/common.h"
+
+size_t
+u8set(const char8_t *s, rune ch, size_t n)
+{
+ int m;
+ char8_t buf[U8_LEN_MAX];
+
+ if (n == 0)
+ return 0;
+ if (ch <= _1B_MAX) {
+ memset((char *)s, ch, n);
+ return n;
+ }
+ m = rtou8(buf, ch, sizeof(buf));
+ for (size_t i = 0; i < n; i += m)
+ memcpy((char *)s + i, buf, m);
+
+ return n - n % m;
+}
diff --git a/vendor/librune/lib/utf8/u8spn.c b/vendor/librune/lib/utf8/u8spn.c
new file mode 100644
index 0000000..beeb33f
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8spn.c
@@ -0,0 +1,22 @@
+#include "utf8.h"
+
+size_t
+u8spn(const char8_t *s, size_t n, const rune *p, size_t m)
+{
+ rune ch;
+ size_t k = 0;
+
+ while (u8next(&ch, &s, &n)) {
+ for (size_t i = 0; i < m; i++) {
+ if (p[i] == ch) {
+ k++;
+ goto found;
+ }
+ }
+
+ break;
+found:;
+ }
+
+ return k;
+}
diff --git a/vendor/librune/lib/utf8/u8tor.c b/vendor/librune/lib/utf8/u8tor.c
new file mode 100644
index 0000000..152a174
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8tor.c
@@ -0,0 +1,31 @@
+#include "rune.h"
+#include "utf8.h"
+
+#include "internal/common.h"
+
+int
+u8tor(rune *ch, const char8_t *s)
+{
+ int n = 0;
+
+ if (U1(s[0])) {
+ *ch = s[0];
+ n = 1;
+ } else if (U2(s[0]) && UC(s[1])) {
+ *ch = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F);
+ n = 2;
+ } else if (U3(s[0]) && UC(s[1]) && UC(s[2])) {
+ *ch = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F);
+ n = 3;
+ } else if (U4(s[0]) && UC(s[1]) && UC(s[2]) && UC(s[3])) {
+ *ch = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12)
+ | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F);
+ n = 4;
+ }
+
+ if (n && u8chkr(*ch))
+ return n;
+
+ *ch = RUNE_ERROR;
+ return 1;
+}
diff --git a/vendor/librune/lib/utf8/u8tor_uc.c b/vendor/librune/lib/utf8/u8tor_uc.c
new file mode 100644
index 0000000..ea57332
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8tor_uc.c
@@ -0,0 +1,24 @@
+#include "utf8.h"
+
+#include "internal/common.h"
+
+int
+u8tor_uc(rune *ch, const char8_t *s)
+{
+ if (U1(s[0])) {
+ *ch = s[0];
+ return 1;
+ } else if (U2(s[0])) {
+ *ch = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F);
+ return 2;
+ } else if (U3(s[0])) {
+ *ch = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F);
+ return 3;
+ } else if (U4(s[0])) {
+ *ch = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12)
+ | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F);
+ return 4;
+ }
+
+ unreachable();
+}
diff --git a/vendor/librune/lib/utf8/u8wdth.c b/vendor/librune/lib/utf8/u8wdth.c
new file mode 100644
index 0000000..0bc5785
--- /dev/null
+++ b/vendor/librune/lib/utf8/u8wdth.c
@@ -0,0 +1,13 @@
+#include "utf8.h"
+
+#include "internal/common.h"
+
+int
+u8wdth(rune ch)
+{
+ return ch <= _1B_MAX ? 1
+ : ch <= _2B_MAX ? 2
+ : ch <= _3B_MAX ? 3
+ : ch <= _4B_MAX ? 4
+ : 0;
+}
diff --git a/vendor/librune/make.c b/vendor/librune/make.c
new file mode 100644
index 0000000..6248f3b
--- /dev/null
+++ b/vendor/librune/make.c
@@ -0,0 +1,100 @@
+#include <errno.h>
+#include <glob.h>
+#include <libgen.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define CBS_PTHREAD
+#include "cbs.h"
+
+#define CC "cc"
+#ifdef __APPLE__
+# define CFLAGS \
+ "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe", "-Iinclude", \
+ "-fPIC", "-O3"
+#else
+# define CFLAGS \
+ "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe", "-Iinclude", \
+ "-fPIC", "-O3", "-march=native", "-mtune=native"
+#endif
+
+#define cmdprc(c) \
+ do { \
+ int ec; \
+ cmdput(c); \
+ if ((ec = cmdexec(c)) != EXIT_SUCCESS) \
+ diex("%s terminated with exit-code %d", *c._argv, ec); \
+ cmdclr(&c); \
+ } while (0)
+
+static void work(void *);
+static int globerr(const char *, int);
+
+int
+main(int argc, char **argv)
+{
+ cmd_t c = {0};
+ size_t n;
+ glob_t g;
+ tpool_t tp;
+
+ cbsinit(argc, argv);
+ rebuild();
+
+ if (chdir(dirname(*argv)) == -1)
+ die("chdir");
+
+ if (glob("lib/utf8/*.c", 0, globerr, &g)
+ || glob("lib/gbrk/*.c", GLOB_APPEND, globerr, &g))
+ {
+ die("glob");
+ }
+
+ if ((n = nproc()) == -1) {
+ if (errno)
+ die("nproc");
+ n = 8;
+ }
+
+ tpinit(&tp, n);
+ for (size_t i = 0; i < g.gl_pathc; i++)
+ tpenq(&tp, work, g.gl_pathv[i], NULL);
+ tpwait(&tp);
+ tpfree(&tp);
+
+ cmdadd(&c, "ar", "rcs", "librune.a");
+ for (size_t i = 0; i < g.gl_pathc; i++)
+ g.gl_pathv[i][strlen(g.gl_pathv[i]) - 1] = 'o';
+ cmdaddv(&c, g.gl_pathv, g.gl_pathc);
+ cmdprc(c);
+
+ globfree(&g);
+ return EXIT_SUCCESS;
+}
+
+void
+work(void *p)
+{
+ cmd_t c = {0};
+ char *dst, *src = p;
+ struct strv sv = {0};
+
+ if (!(dst = strdup(src)))
+ die("strdup");
+ dst[strlen(dst) - 1] = 'o';
+
+ env_or_default(&sv, "CC", CC);
+ cmdaddv(&c, sv.buf, sv.len);
+ cmdadd(&c, CFLAGS, "-o", dst, "-c", src);
+ cmdprc(c);
+
+ free(dst);
+}
+
+int
+globerr(const char *s, int e)
+{
+ errno = e;
+ die("glob: %s", s);
+}
diff --git a/vendor/librune/man/Lb-desc.tmac b/vendor/librune/man/Lb-desc.tmac
new file mode 100644
index 0000000..1ec8f8f
--- /dev/null
+++ b/vendor/librune/man/Lb-desc.tmac
@@ -0,0 +1 @@
+.ds doc-str-Lb-librune Unicode- and UTF-8 Library (librune, \-lrune)
diff --git a/vendor/librune/man/rtou8.3 b/vendor/librune/man/rtou8.3
new file mode 100644
index 0000000..a83d3e8
--- /dev/null
+++ b/vendor/librune/man/rtou8.3
@@ -0,0 +1 @@
+.so u8set.3
diff --git a/vendor/librune/man/u8glen.3 b/vendor/librune/man/u8glen.3
new file mode 100644
index 0000000..dfe0283
--- /dev/null
+++ b/vendor/librune/man/u8glen.3
@@ -0,0 +1,62 @@
+.Dd January 15 2024
+.Dt U8GLEN 3
+.Os
+.Sh NAME
+.Nm u8glen
+.Nd count Unicode graphemes
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In gbrk.h
+.Ft size_t
+.Fn u8glen "const char8_t *s" "size_t n"
+.Sh DESCRIPTION
+The
+.Fn u8glen
+function returns the number of UTF-8 encoded Unicode graphemes in the
+buffer
+.Fa s
+of length
+.Fa n
+bytes.
+.Pp
+This function assumes that
+.Fa s
+contains only valid UTF-8.
+.Sh RETURN VALUES
+The
+.Fn u8glen
+function returns the number of graphemes in the buffer
+.Fa s .
+.Sh EXAMPLES
+The following call to
+.Fn u8glen
+will return 6 while the call to
+.Fn u8len
+will return 7 as a result of user-preceived characters such as
+.Sq е́
+taking up multiple codepoints.
+.Bd -literal -offset indent
+char8_t s[] = u8\(dqПриве́т\(dq;
+size_t cplen, glen;
+
+cplen = u8len(s, sizeof(s) - 1);
+glen = u8glen(s, sizeof(s) - 1);
+.Ed
+.Sh SEE ALSO
+.Xr u8len 3 ,
+.Xr u8wdth 3 ,
+.Xr unicode 7 ,
+.Xr utf\-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Pp
+.Lk https://www.unicode.org/versions/Unicode15.1.0/ \
+"The Unicode\(rg Standard Version 15.1.0"
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
diff --git a/vendor/librune/man/u8gnext.3 b/vendor/librune/man/u8gnext.3
new file mode 100644
index 0000000..0053aa5
--- /dev/null
+++ b/vendor/librune/man/u8gnext.3
@@ -0,0 +1,72 @@
+.Dd January 18 2024
+.Dt U8GNEXT 3
+.Os
+.Sh NAME
+.Nm u8gnext ,
+.Nd iterate over Unicode codepoints
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In gbrk.h
+.Ft "const char8_t *"
+.Fn u8gnext "struct u8view *v" "const char8_t **s" "size_t *n"
+.Sh DESCRIPTION
+The
+.Fn u8gnext
+function stores a view of the first grapheme in the buffer
+.Fa s
+of length
+.Fa n
+in the structure pointed to by
+.Fa v .
+It then updates
+.Fa s
+to point to the next grapheme in the buffer and also updates
+.Fa n
+accordingly.
+.Pp
+The
+.Vt "struct u8view"
+type is described in the
+.Xr u8view 3
+manual.
+.Sh RETURN VALUES
+The
+.Fn u8gnext
+function returns the updated value of
+.Fa s
+or
+.Dv NULL
+at the end of iteration.
+.Sh EXAMPLES
+The following calls to
+.Fn u8gnext
+iterate over and print all the graphemes in
+.Va s .
+.Bd -literal -offset indent
+#define STRING u8"नमस्कार विश्व"
+
+struct u8view v;
+const char8_t *s = STRING;
+size_t n = sizeof(STRING) - 1;
+
+while (u8gnext(&v, &s, &n))
+ printf("‘%.*s’\en", (int)g.len, g.p);
+.Ed
+.Sh SEE ALSO
+.Xr u8next 3 ,
+.Xr u8view 3 ,
+.Xr unicode 7 ,
+.Xr utf\-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Pp
+.Lk https://www.unicode.org/versions/Unicode15.1.0/ \
+"The Unicode\(rg Standard Version 15.1.0"
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
diff --git a/vendor/librune/man/u8len.3 b/vendor/librune/man/u8len.3
new file mode 100644
index 0000000..4e58e14
--- /dev/null
+++ b/vendor/librune/man/u8len.3
@@ -0,0 +1,70 @@
+.Dd January 15 2024
+.Dt U8LEN 3
+.Os
+.Sh NAME
+.Nm u8len
+.Nd count Unicode codepoints
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In utf8.h
+.Ft size_t
+.Fn u8len "const char8_t *s" "size_t n"
+.Sh DESCRIPTION
+The
+.Fn u8len
+function returns the number of UTF-8 encoded Unicode codepoints in the
+buffer
+.Fa s
+of length
+.Fa n
+bytes.
+.Pp
+This function assumes that
+.Fa s
+contains only valid UTF-8.
+.Sh RETURN VALUES
+The
+.Fn u8len
+function returns the number of codepoints in the buffer
+.Fa s .
+.Sh EXAMPLES
+The following call to
+.Fn u8len
+will return 17 while the call to
+.Fn strlen
+will return 22 as a result of use of multibyte-characters in
+.Fa s .
+.Bd -literal -offset indent
+char8_t s[] = u8\(dq„Der Große Duden“\(dq;
+size_t blen, cplen;
+
+blen = strlen((char *)s);
+cplen = u8len(s, sizeof(s) - 1);
+.Ed
+.Sh SEE ALSO
+.Xr u8glen 3 ,
+.Xr u8wdth 3 ,
+.Xr unicode 7 ,
+.Xr utf\-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
+.Sh CAVEATS
+The return value of
+.Fn u8len
+does not necessarily represent the number of human-preceived characters
+in the given buffer;
+multiple codepoints may combine to form one human-preceived character
+that spans a single column.
+To count user-preceived codepoints
+.Pq also known as graphemes ,
+you may want to use the
+.Xr u8glen 3
+function.
diff --git a/vendor/librune/man/u8next.3 b/vendor/librune/man/u8next.3
new file mode 100644
index 0000000..93a4f5d
--- /dev/null
+++ b/vendor/librune/man/u8next.3
@@ -0,0 +1,111 @@
+.Dd January 18 2024
+.Dt U8NEXT 3
+.Os
+.Sh NAME
+.Nm u8next ,
+.Nm u8prev
+.Nd iterate over Unicode codepoints
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In utf8.h
+.Ft "const char8_t *"
+.Fn u8next "rune *ch" "const char8_t **s" "size_t *n"
+.Ft "const char8_t *"
+.Fn u8prev "rune *ch" "const char8_t **s" "const char8_t *start"
+.Sh DESCRIPTION
+The
+.Fn u8next
+function decodes the first rune in the UTF-8 encoded string pointed to by
+.Fa s
+of length
+.Fa n
+and stores the result in
+.Fa ch .
+It then updates
+.Fa s
+to point to the next codepoint in the buffer and updates the length
+.Fa n
+accordingly.
+.Pp
+The
+.Fn u8prev
+function takes a pointer
+.Fa start
+which points to the start of the string instead of a length,
+and updates
+.Fa s
+to point to the previous codepoint in the buffer.
+The rune
+.Fa ch
+is set to UTF-8 codepoint pointed to by
+.Fa s
+after iteration.
+.Pp
+Both of these functions assume the input is valid UTF-8.
+.Sh RETURN VALUES
+The
+.Fn u8next
+and
+.Fn u8prev
+functions return the updated value of
+.Fa s
+or
+.Dv NULL
+at the end of iteration.
+.Sh EXAMPLES
+The following calls to
+.Fn u8next
+iterate over and print all the codepoints in
+.Va s .
+.Bd -literal -offset indent
+#include <rune.h> /* For PRIXRUNE; see rune(3) */
+
+#define STRING u8"Ta’ Ħaġrat"
+
+rune ch;
+const char8_t *s = STRING;
+size_t n = sizeof(STRING) - 1;
+
+while (u8next(&ch, &s, &n)) {
+ int w = u8wdth(ch);
+ printf("U+%04" PRIXRUNE ": ‘%.*s’\en", ch, w, s - w);
+}
+.Ed
+.Pp
+The following example is the same as the previous,
+but it uses the
+.Fn u8prev
+function to iterate backwards.
+.Bd -literal -offset indent
+#include <rune.h> /* For PRIXRUNE; see rune(3) */
+
+#define STRING u8"Ta’ Ħaġrat"
+
+rune ch;
+const char8_t *s, *start;
+size_t n = sizeof(STRING) - 1;
+
+start = STRING;
+s = start + n;
+
+while (u8prev(&ch, &s, start)) {
+ int w = u8wdth(ch);
+ printf("U+%04" PRIXRUNE ": ‘%.*s’\en", ch, w, s);
+}
+.Ed
+.Sh SEE ALSO
+.Xr rune 3 ,
+.Xr u8gnext 3 ,
+.Xr u8tor 3 ,
+.Xr unicode 7 ,
+.Xr utf\-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
diff --git a/vendor/librune/man/u8prev.3 b/vendor/librune/man/u8prev.3
new file mode 100644
index 0000000..cf1364e
--- /dev/null
+++ b/vendor/librune/man/u8prev.3
@@ -0,0 +1 @@
+.so u8next
diff --git a/vendor/librune/man/u8set.3 b/vendor/librune/man/u8set.3
new file mode 100644
index 0000000..307f84e
--- /dev/null
+++ b/vendor/librune/man/u8set.3
@@ -0,0 +1,103 @@
+.Dd January 18 2024
+.Dt U8SET 3
+.Os
+.Sh NAME
+.Nm rtou8 ,
+.Nm u8set
+.Nd encode a rune to UTF-8
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In utf8.h
+.Ft int
+.Fn rtou8 "const char8_t *s" "rune ch" "size_t n"
+.Ft size_t
+.Fn u8set "const char8_t *s" "rune ch" "size_t n"
+.Sh DESCRIPTION
+The
+.Fn rtou8
+function writes the rune
+.Fa ch
+to the UTF-8 encoded buffer
+.Fa s
+of length
+.Fa n ,
+returning the number of bytes required to UTF-8 encode
+.Fa ch .
+.Pp
+The
+.Fn u8set
+function fills the buffer
+.Fa s
+of length
+.Fa n
+with the constant rune
+.Fa ch .
+It is similar to the
+.Fn rtou8
+function,
+but writes more than 1 rune if the given buffer has the capacity.
+Unlike
+.Fn rtou8 ,
+this function returns the number of bytes that were successfully written
+to
+.Fa s .
+If
+.Fa n
+is a multiple of
+.Fn u8wdth ch
+the return value will be equal to
+.Fa n ,
+however in the case that
+.Fa n
+is not a multiple then
+.Fa s
+is filled as much as possible,
+and a count shorter than
+.Fa n
+is returned.
+.Pp
+Both of these functions assume the input is valid UTF-8.
+.Sh RETURN VALUES
+The
+.Fn rtou8
+function returns the number of bytes required to write
+.Fa ch
+to the buffer
+.Fa s .
+.Pp
+The
+.Fn u8set
+function returns the number of bytes written to the buffer
+.Fa s .
+.Sh EXAMPLES
+The following calls to
+.Fn rtou8
+and
+.Fn u8set
+fill a buffer with box-drawing characters to create a top-row of a box.
+.Bd -literal -offset indent
+#define SCREEN_WIDTH 80
+
+int bdr_wdth = u8wdth(U'─'); /* box-drawing rune width */
+size_t bufsiz = SCREEN_WIDTH * bdr_wdth;
+char8_t *s = malloc(bufsiz);
+
+rtou8(s, U'┌', bdr_wdth);
+u8set(s + bdr_wdth, U'─', bufsiz - bdr_wdth * 2);
+rtou8(s + bufsiz - bdr_wdth, U'┐', bdr_wdth);
+.Ed
+.Sh SEE ALSO
+.Xr u8tor 3 ,
+.Xr u8tor_uc 3 ,
+.Xr unicode 7 ,
+.Xr utf\-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
diff --git a/vendor/librune/man/u8tor.3 b/vendor/librune/man/u8tor.3
new file mode 100644
index 0000000..147f7c1
--- /dev/null
+++ b/vendor/librune/man/u8tor.3
@@ -0,0 +1,90 @@
+.Dd January 18 2024
+.Dt U8TOR 3
+.Os
+.Sh NAME
+.Nm u8tor ,
+.Nm u8tor_uc
+.Nd decode UTF-8 into a rune
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In utf8.h
+.Ft int
+.Fn u8tor "rune *ch" "const char8_t *s"
+.Ft int
+.Fn u8tor_uc "rune *ch" "const char8_t *s"
+.Sh DESCRIPTION
+The
+.Fn u8tor
+and
+.Fn u8tor_uc
+functions decode the first rune in the UTF-8 buffer
+.Fa s ,
+storing the result in the rune pointed to by
+.Fa ch .
+Both functions return the number of bytes which compose the decoded
+UTF-8.
+.Pp
+The two functions are nearly identical,
+however
+.Fn u8tor_uc
+performs fewer range checks than
+.Fn u8tor
+allowing it to process data more efficiently.
+When provided with invalid UTF-8 however,
+.Fn u8tor_uc
+engages in undefined-behavior.
+The
+.Fn u8tor
+function on the other hand handles invalid UTF-8 by storing
+.Dv RUNE_ERROR
+in
+.Fa ch
+and returning 1.
+.Sh RETURN VALUES
+The
+.Fn u8tor
+and
+.Fn u8tor_uc
+functions return the number of bytes from
+.Fa s
+decoded into
+.Fa ch .
+.Pp
+The
+.Fn u8tor
+function returns 1 on invalid UTF-8.
+.Sh EXAMPLES
+The following call to
+.Fn u8tor
+attempts to decode the first UTF-8 codepoint in
+.Va buf .
+.Bd -literal -offset indent
+/* Implementation of read_codepoint() omitted */
+
+int w;
+rune ch;
+char8_t *buf = read_codepoint(stdin);
+
+w = u8tor(&ch, buf);
+if (ch == RUNE_ERROR) {
+ fputs("Got invalid UTF-8 codepoint", stderr);
+ exit(EXIT_FAILURE);
+}
+printf("Got rune ‘%.*s’\en", w, buf);
+.Ed
+.Sh SEE ALSO
+.Xr rtou8 3 ,
+.Xr u8chk 3 ,
+.Xr u8next 3 ,
+.Xr unicode 7 ,
+.Xr utf\-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
diff --git a/vendor/librune/man/u8tor_uc.3 b/vendor/librune/man/u8tor_uc.3
new file mode 100644
index 0000000..1527e52
--- /dev/null
+++ b/vendor/librune/man/u8tor_uc.3
@@ -0,0 +1 @@
+.so u8tor.3
diff --git a/vendor/librune/man/u8wdth.3 b/vendor/librune/man/u8wdth.3
new file mode 100644
index 0000000..60fcada
--- /dev/null
+++ b/vendor/librune/man/u8wdth.3
@@ -0,0 +1,69 @@
+.Dd January 16 2024
+.Dt U8WDTH 3
+.Os
+.Sh NAME
+.Nm u8wdth
+.Nd Unicode codepoint width
+.Sh LIBRARY
+.Lb librune
+.Sh SYNOPSIS
+.In utf8.h
+.Ft int
+.Fn u8wdth "rune ch"
+.Sh DESCRIPTION
+The
+.Fn u8wdth
+function returns the number of bytes that would be occupied by the
+Unicode-codepoint
+.Fa ch
+if it was encoded as UTF-8.
+If
+.Fa ch
+is greater than
+.Dv RUNE_MAX ,
+a width of 0 is returned.
+.Pp
+If the exact UTF-8 encoded size of a codepoint is not relevant and you
+simply wish to allocate a buffer capable of holding a given number of
+UTF-8 codepoints,
+the
+.Dv U8_LEN_MAX
+macro may be preferable.
+.Pp
+This function treats invalid codepoints smaller than
+.Dv RUNE_MAX
+such as UTF-16 surrogates as valid.
+.Sh RETURN VALUES
+The
+.Fn u8wdth
+function returns the number of bytes required to UTF-8 encode the
+codepoint
+.Fa ch .
+.Sh EXAMPLES
+The following example allocates a buffer which is exactly large enough to
+hold the given UTF-32 string once it is converted to UTF-8.
+.Bd -literal -offset indent
+#define lengthof(a) (sizeof(a) / sizeof(*(a)))
+
+size_t bufsiz = 0;
+char8_t *buf;
+char32_t s[] = U\(dqIJsselmeer\(dq; /* ‘IJ’ takes 2 bytes */
+
+for (size_t i = 0; i < lengthof(s) - 1; i++)
+ bufsiz += u8wdth(s[i]);
+buf = malloc(bufsiz);
+.Ed
+.Sh SEE ALSO
+.Xr u8glen 3 ,
+.Xr u8len 3 ,
+.Xr unicode 7 ,
+.Xr utf-8 7
+.Sh STANDARDS
+.Rs
+.%A F. Yergeau
+.%D November 2003
+.%R RFC 3629
+.%T UTF-8, a transformation format of ISO 10646
+.Re
+.Sh AUTHORS
+.An Thomas Voss Aq Mt mail@thomasvoss.com
diff --git a/vendor/librune/test/gbrk.c b/vendor/librune/test/gbrk.c
new file mode 100644
index 0000000..ad32fdd
--- /dev/null
+++ b/vendor/librune/test/gbrk.c
@@ -0,0 +1,85 @@
+#define _POSIX_C_SOURCE 200809L
+#include <err.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gbrk.h>
+#include <rune.h>
+#include <utf8.h>
+
+#define die(...) err(EXIT_FAILURE, __VA_ARGS__)
+
+static void test(char *);
+
+int
+main(int argc, char **argv)
+{
+ char *line = NULL;
+ size_t n;
+ ssize_t nr;
+ FILE *fp;
+
+ setlocale(LC_ALL, "");
+
+ if (argc != 2) {
+ fprintf(stderr, "%s: file\n", *argv);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!(fp = fopen(argv[1], "r")))
+ die("fopen");
+
+ while ((nr = getline(&line, &n, fp)) > 0) {
+ line[nr - 1] = 0;
+ test(line);
+ }
+
+ if (nr == -1 && ferror(fp))
+ die("getline");
+
+ fclose(fp);
+ free(line);
+ return EXIT_SUCCESS;
+}
+
+void
+test(char *raw)
+{
+ int n;
+ rune ch;
+ char8_t *p, *buf;
+ const char8_t *s;
+ size_t bufsiz = 4096;
+ struct grapheme graph;
+
+ if (!(buf = malloc(bufsiz)))
+ die("malloc");
+
+ p = buf;
+ while (sscanf(raw, "%" SCNxRUNE "%n", &ch, &n)) {
+ rune sep;
+ p += rtou8(p, ch, bufsiz - (p - buf));
+ raw += n;
+ raw += u8tor(&sep, (char8_t *)raw);
+ if (!sep)
+ break;
+ }
+ *p = 0;
+
+ s = buf;
+ while (u8gnext(&graph, &s, &bufsiz) && *graph.p) {
+ rune ch;
+ const char8_t *p;
+
+ while (u8next(&ch, &graph.p, &graph.len) && ch) {
+ printf("%04" PRIXRUNE "%s", ch, graph.len > 0 ? "×" : "");
+ p = graph.p;
+ }
+ if (bufsiz && *p)
+ fputs("÷", stdout);
+ }
+
+ putchar('\n');
+ free(buf);
+}
diff --git a/vendor/librune/test/tests b/vendor/librune/test/tests
new file mode 100755
index 0000000..e728773
--- /dev/null
+++ b/vendor/librune/test/tests
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+report()
+{
+ case $1 in
+ 0) printf 'All tests passed\n' >&2 ;;
+ 1) printf '1 test failed\n' >&2 ;;
+ *) printf '%d tests failed\n' $1 >&2
+ esac
+}
+
+readonly src=../data/GraphemeBreakTest.txt
+
+set -e
+cd "${0%/*}"
+find ../lib -name '*.c' -exec cc -I../include -o gbrk gbrk.c {} +
+trap 'rm -f gbrk' EXIT
+
+n=$(
+ ./gbrk $src \
+ | diff -y --suppress-common-lines $src - \
+ | tee failures \
+ | wc -l
+)
+test $n -eq 0 && rm failures
+
+if test -t 2
+then
+ case $n in
+ 0) printf '\033[0;32m' ;;
+ *) printf '\033[0;31m'
+ esac
+
+ report $n
+ printf '\033[0m' >&2
+else
+ report $n
+fi