texlive[44160] trunk: context/beta/cont-tmf.zip Apr 27 01:08

commits+karl at tug.org commits+karl at tug.org
Wed May 3 00:24:44 CEST 2017


Revision: 44160
          http://tug.org/svn/texlive?view=revision&revision=44160
Author:   karl
Date:     2017-05-03 00:24:44 +0200 (Wed, 03 May 2017)
Log Message:
-----------
context/beta/cont-tmf.zip Apr 27 01:08 

Modified Paths:
--------------
    trunk/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
    trunk/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
    trunk/Build/source/texk/texlive/linked_scripts/texlive/updmap.pl
    trunk/Master/bin/win32/mtxrun.lua
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdf
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdf
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdf
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdf
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdf
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf
    trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdf
    trunk/Master/texmf-dist/doc/man/man1/context.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
    trunk/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
    trunk/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
    trunk/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua
    trunk/Master/texmf-dist/scripts/context/lua/mtxrun.lua
    trunk/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
    trunk/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
    trunk/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
    trunk/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii
    trunk/Master/texmf-dist/tex/context/base/mkii/context.mkii
    trunk/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/char-def.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
    trunk/Master/texmf-dist/tex/context/base/mkiv/context.mkiv
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.mkvi
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-mat.mkvi
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv
    trunk/Master/texmf-dist/tex/context/base/mkiv/l-table.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/math-act.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/node-typ.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/status-files.pdf
    trunk/Master/texmf-dist/tex/context/base/mkiv/status-lua.pdf
    trunk/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua
    trunk/Master/texmf-dist/tex/context/interface/mkiv/i-context.pdf
    trunk/Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdf
    trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.lua
    trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv
    trunk/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua
    trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.mkiv
    trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-emoji.mkiv

Modified: trunk/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1670,7 +1670,7 @@
 
 package.loaded["l-table"] = package.loaded["l-table"] or true
 
--- original size: 39587, stripped down to: 23144
+-- original size: 39608, stripped down to: 23165
 
 if not modules then modules={} end modules ['l-table']={
   version=1.001,
@@ -2003,7 +2003,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -2121,7 +2121,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -2204,7 +2204,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -20430,7 +20430,7 @@
 
 -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
 -- skipped libraries : -
--- original bytes    : 841875
+-- original bytes    : 841896
 -- stripped bytes    : 305446
 
 -- end library merge

Modified: trunk/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1,5 +1,5 @@
 #!/usr/bin/env perl
-# $Id: tlmgr.pl 44109 2017-04-28 23:12:11Z karl $
+# $Id: tlmgr.pl 44146 2017-05-01 22:53:26Z karl $
 #
 # Copyright 2008-2017 Norbert Preining
 # This file is licensed under the GNU General Public License version 2
@@ -6,8 +6,8 @@
 # or any later version.
 #
 
-my $svnrev = '$Revision: 44109 $';
-my $datrev = '$Date: 2017-04-29 01:12:11 +0200 (Sat, 29 Apr 2017) $';
+my $svnrev = '$Revision: 44146 $';
+my $datrev = '$Date: 2017-05-02 00:53:26 +0200 (Tue, 02 May 2017) $';
 my $tlmgrrevision;
 my $prg;
 if ($svnrev =~ m/: ([0-9]+) /) {
@@ -1145,6 +1145,7 @@
 
 
 # 
 PAPER
+# 
 # ARGV can look like:
 #   paper a4
 #   paper letter
@@ -1335,7 +1336,7 @@
   return ($ret | $F_NOPOSTACTION);
 }
 
-# 
 DUMP TLPDB
+# 
 DUMP-TLPDB
 #
 sub action_dumptlpdb {
   init_local_db();
@@ -4316,7 +4317,7 @@
 }
 
 
-# 
 ARCH
+# 
 PLATFORM (was ARCH)
 #
 sub action_platform {
   my $ret = $F_OK;
@@ -4817,6 +4818,7 @@
   return;
 }
 
+
 # 
 CHECK
 #
 sub init_tltree {
@@ -5350,7 +5352,9 @@
   return $ret;
 }
 
+
 # 
 POSTACTION
+# 
 # explictly run the various post actions, e.g.,
 # on a client system or overriding global settings.
 # 
@@ -5458,7 +5462,9 @@
   }
 }
 
-# 
 INIT USER TREE
+
+# 
 INIT-USERTREE
+# 
 # sets up the user tree for tlmgr in user mode
 sub action_init_usertree {
   # init_local_db but do not die if localtlpdb is not found!
@@ -5500,7 +5506,9 @@
   return ($F_OK);
 }
 
+
 # 
 CONF
+# 
 # tries to mimic texconfig conf but can also set values for both tlmgr
 # and texmf conf files.
 #
@@ -5550,7 +5558,7 @@
         if ($arg eq "texmf") {
           my $tmfa = 'TEXMFAUXTREES';
           my $tv = $cf->value($tmfa);
-          if ($val eq "show") {
+          if (!$val || $val eq "show") {
             if (defined($tv)) {
               $tv =~ s/^\s*{//;
               $tv =~ s/}\s*$//;
@@ -5562,7 +5570,7 @@
               }
               return($F_OK);
             } else {
-              print "No auxiliary texmf trees defined.\n";
+              print "$prg: no auxiliary texmf trees defined.\n";
               return($F_OK);
             }
           } elsif ($val eq "add") {
@@ -5576,7 +5584,7 @@
                 my $already = 0;
                 for my $f (@foo) {
                   if ($f eq $str) {
-                    print "Already registered auxtree: $str\n";
+                    tlwarn("$prg: already registered auxtree: $str\n");
                     return ($F_WARNING);
                   } else {
                     push @new, $f;
@@ -5588,7 +5596,7 @@
                 $cf->value($tmfa, '{' . $str . ',}');
               }
             } else {
-              warning("argument missing for auxtrees add\n");
+              tlwarn("$prg: missing argument for auxtrees add\n");
               return($F_ERROR);
             }
           } elsif ($val eq "remove") {
@@ -5614,23 +5622,24 @@
                     $cf->delete_key($tmfa);
                   }
                 } else {
-                  print ("Not defined as auxiliary texmf tree: $str\n");
+                  tlwarn("$prg: not defined as auxiliary texmf tree: $str\n");
                   return($F_WARNING);
                 }
               } else {
-                print "No auxiliary texmf trees defined, nothing removed\n";
+                tlwarn("$prg: no auxiliary texmf trees defined, "
+                       . "so nothing removed\n");
                 return($F_WARNING);
               }
             } else {
-              warning("argument missing for auxtrees remove\n");
+              tlwarn("$prg: missing argument for auxtrees remove\n");
               return($F_ERROR);
             }
           } else {
-            warning("unknown operation on auxtrees: $val\n");
+            tlwarn("$prg: unknown auxtrees operation: $val\n");
             return($F_ERROR);
           }
         } else {
-          warning("auxtrees not suitable for $arg\n");
+          tlwarn("$prg: auxtrees not suitable for $arg\n");
           return($F_ERROR);
         }
       } elsif (!defined($val)) {
@@ -5662,7 +5671,7 @@
         }
       } else {
         if (defined($opts{'delete'})) {
-          warning("$arg --delete and value for key $key given, don't know what to do!\n");
+          tlwarn("$arg --delete and value for key $key given, don't know what to do!\n");
           $ret = $F_ERROR;
         } else {
           info("setting $arg $key to $val (in $fn)\n");
@@ -5729,14 +5738,13 @@
 }
 
 
-

-# Action key
+# 
 KEY
 #
-# general key management
-#
+# gpg key management:
 # tlmgr key list
 # tlmgr key add <filename>
 # tlmgr key remove <keyid>
+# 
 sub action_key {
   my $arg = shift @ARGV;
 
@@ -5813,6 +5821,209 @@
 }
 
 
+# 
 SHELL
+# interactive shell.
+# 
+sub action_shell {
+  my $protocol = 1;
+  sub do_prompt {
+    my $default_prompt = "tlmgr>";
+    my $prompt = "";
+    my @options;
+    my @guarantee;
+    my @savedargs = @_;
+    my $did_prompt = 0;
+    while (defined(my $arg = shift @_)) {
+      if ($arg =~ m/^-prompt$/) {
+        print shift @_, " ";
+        $did_prompt = 1;
+      } elsif ($arg =~ m/^-menu$/) {
+        my $options = shift @_;
+        @options = @$options;
+        print "\n";
+        my $c = 1;
+        for my $o (@options) {
+          print " $c) $o\n";
+          $c++;
+        }
+      } elsif ($arg =~ m/^-guarantee$/) {
+        my $guarantee = shift @_;
+        @guarantee = @$guarantee;
+      } elsif ($arg =~ m/^-/) {
+        print "ERROR unsupported prompt command, please report: $arg!\n";
+      } else {
+        print $arg, " ";
+        $did_prompt = 1;
+      }
+    }
+    print "default_prompt " if (!$did_prompt);
+    my $ans = <STDIN>;
+    if (!defined($ans)) {
+      # we got Ctrl-D, just break out
+      return;
+    }
+    chomp($ans);
+    if (@options) {
+      $ans--;
+      if ($ans >= 0 && $ans <= $#options) {
+        $ans = $options[$ans];
+        return($ans);
+      } else {
+        print "ERROR invalid answer\n";
+        return;
+      }
+    }
+    if (@guarantee) {
+      my $isok = 0;
+      for my $g (@guarantee) {
+        if ($ans eq $g) {
+          $isok = 1;
+          last;
+        }
+      }
+      if (!$isok) {
+        print("Please answer one of @guarantee!\n");
+        return(do_prompt(@savedargs));
+      }
+    }
+    return($ans);
+  }
+
+  print "protocol $protocol\n";
+  while (1) {
+    my $ans = do_prompt('tlmgr>');
+    return $F_OK if !defined($ans); # done if eof
+
+    my ($cmd, @args) = TeXLive::TLUtils::quotewords('\s+', 0, $ans);
+    next if (!defined($cmd));
+    if ($cmd eq "protocol") {
+      print "protocol $protocol\n";
+    } elsif ($cmd eq "help") {
+      print "Please see tlmgr help or http://tug.org/texlive/tlmgr.html.\n";
+    } elsif ($cmd eq "version") {
+      print give_version(), "\n";
+    } elsif ($cmd =~ m/^(quit|end|bye(bye)?)$/i) {
+      return $F_OK;
+    } elsif ($cmd eq "setup-location") {
+      my $dest = shift @args;
+      print "ERROR not implemented: $cmd\n";
+    } elsif ($cmd =~ m/^(set|get)$/) {
+      my @valid_keys = qw/repository debug-translation machine-readable no-execute-actions require-verification verify-downloads/;
+      my $key = shift @args;
+      my $val = shift @args;
+      if (!$key) {
+        $key = do_prompt('Choose...', -menu => \@valid_keys, '>');
+      }
+      if (!$key) {
+        print("ERROR missing argument for get\n");
+        next;
+      }
+      if ($cmd eq "get" && defined($val)) {
+        print("ERROR no argument allowed for get\n");
+        next;
+      }
+      if ($cmd eq "set" && !defined($val)) {
+        if ($key eq "repository") {
+          $val = do_prompt('Enter repository:');
+        } else {
+          $val = do_prompt('Enter 1 for on, 0 for off:', -guarantee => [0,1]);
+        }
+        # deal with Ctrl-D
+        if (!defined($val)) {
+          print("ERROR Missing value for set.\n");
+          next;
+        }
+      }
+
+      if ($key eq "repository") {
+        if ($cmd eq "set") {
+          $location = scalar($val);
+        } else {
+          if (defined($location)) {
+            print "repository = $location\n";
+          } else {
+            print "repository = <UNDEFINED>\n";
+          }
+        }
+        print "OK\n";
+      } elsif ($key =~ m/^(debug-translation|machine-readable|no-execute-actions|require-verification|verify-downloads)$/) {
+        if ($cmd eq "set") {
+          $opts{$key} = ($val eq "1" ? 1 : 0);
+          # special cases
+          $::debug_translation = $opts{"debug-translation"};
+          $::machinereadable = $opts{"machine-readable"};
+          $::no_execute_actions = $opts{'no-execute-actions'};
+        } else {
+          print "$key = ", ($opts{$key} ? 1 : 0), "\n";
+        }
+        print "OK\n";
+      } else {
+        print "ERROR unknown key $key\n";
+      }
+    } elsif ($cmd eq "load") {
+      my $what = shift @args;
+      if (!defined($what)) {
+        $what = do_prompt("Choose...", -menu => ['local', 'remote'], '>');
+      }
+      if ($what eq "local") {
+        init_local_db();
+        print "OK\n";
+      } elsif ($what eq "remote") {
+        init_tlmedia_or_die();
+        print "OK\n";
+      } else {
+        print "ERROR can only load 'local' or 'remote'\n";
+      }
+    } elsif ($cmd eq "save") {
+      $localtlpdb->save;
+      print "OK\n";
+    } elsif (defined($action_specification{$cmd})) {
+      # an action
+      if (!defined($action_specification{$cmd}{"function"})) {
+        print "ERROR action function not defined\n";
+        next;
+      }
+      # redo the option parsing
+      my %optarg;
+      if (defined($action_specification{$cmd}{'options'})) {
+        my %actopts = %{$action_specification{$cmd}{'options'}};
+        for my $k (keys %actopts) {
+          if ($actopts{$k} eq "1") {
+            $optarg{$k} = 1;
+          } else {
+            $optarg{"$k" . $actopts{$k}} = 1;
+          }
+        }
+      }
+      # save command line options for later restart, if necessary
+      @ARGV = @args;
+      my %savedopts = %opts;
+      %opts = ();
+      if (!GetOptions(\%opts, keys(%optarg))) {
+        print "ERROR unsupported arguments\n";
+        next;
+      }
+      my $ret = execute_action($cmd, @ARGV);
+      if ($ret & $F_ERROR) {
+        print "ERROR\n";
+      } elsif ($ret & $F_WARNING) {
+        print "OK\n";
+      } else {
+        print "OK\n";
+      }
+      # make sure that we restart after having called update --self!
+      if (($cmd eq 'update') && $opts{'self'}) {
+        print "tlmgr has been updated, restarting!\n";
+        exec("tlmgr", @::SAVEDARGV);
+      }
+      %opts = %savedopts;
+    } else {
+      print "ERROR unknown command\n";
+    }
+  }
+}
+
+
 

 # Subroutines galore.
 #
@@ -6589,208 +6800,6 @@
 }
 
 
-###########
-# tlmgr shell code
-sub action_shell {
-  my $protocol = 1;
-  sub do_prompt {
-    my $default_prompt = "tlmgr>";
-    my $prompt = "";
-    my @options;
-    my @guarantee;
-    my @savedargs = @_;
-    my $did_prompt = 0;
-    while (defined(my $arg = shift @_)) {
-      if ($arg =~ m/^-prompt$/) {
-        print shift @_, " ";
-        $did_prompt = 1;
-      } elsif ($arg =~ m/^-menu$/) {
-        my $options = shift @_;
-        @options = @$options;
-        print "\n";
-        my $c = 1;
-        for my $o (@options) {
-          print " $c) $o\n";
-          $c++;
-        }
-      } elsif ($arg =~ m/^-guarantee$/) {
-        my $guarantee = shift @_;
-        @guarantee = @$guarantee;
-      } elsif ($arg =~ m/^-/) {
-        print "ERROR unsupported prompt command, please report: $arg!\n";
-      } else {
-        print $arg, " ";
-        $did_prompt = 1;
-      }
-    }
-    print "default_prompt " if (!$did_prompt);
-    my $ans = <STDIN>;
-    if (!defined($ans)) {
-      # we got Ctrl-D, just break out
-      return;
-    }
-    chomp($ans);
-    if (@options) {
-      $ans--;
-      if ($ans >= 0 && $ans < $#options) {
-        $ans = $options[$ans];
-        return($ans);
-      } else {
-        print "ERROR invalid answer\n";
-        return;
-      }
-    }
-    if (@guarantee) {
-      my $isok = 0;
-      for my $g (@guarantee) {
-        if ($ans eq $g) {
-          $isok = 1;
-          last;
-        }
-      }
-      if (!$isok) {
-        print("Please answer one of @guarantee!\n");
-        return(do_prompt(@savedargs));
-      }
-    }
-    return($ans);
-  }
-
-  print "protocol $protocol\n";
-  while (1) {
-    # print $prompt;
-    # my $ans = <STDIN>;
-    my $ans = do_prompt('tlmgr>');
-    # chomp $ans;
-    next if (!defined($ans));
-    my ($cmd, @args) = TeXLive::TLUtils::quotewords('\s+', 0, $ans);
-    next if (!defined($cmd));
-    if ($cmd eq "protocol") {
-      print "protocol $protocol\n";
-    } elsif ($cmd eq "version") {
-      print give_version(), "\n";
-    } elsif ($cmd =~ m/^(quit|end|byebye)$/i) {
-      return $F_OK;
-    } elsif ($cmd eq "setup-location") {
-      my $dest = shift @args;
-      print "ERROR not implemented: $cmd\n";
-    } elsif ($cmd =~ m/^(set|get)$/) {
-      my @valid_keys = qw/repository debug-translation machine-readable no-execute-actions require-verification verify-downloads/;
-      my $key = shift @args;
-      my $val = shift @args;
-      if (!$key) {
-        $key = do_prompt('Choose...', -menu => \@valid_keys, '>');
-      }
-      if (!$key) {
-        print("ERROR missing argument for get\n");
-        next;
-      }
-      if ($cmd eq "get" && defined($val)) {
-        print("ERROR no argument allowed for get\n");
-        next;
-      }
-      if ($cmd eq "set" && !defined($val)) {
-        if ($key eq "repository") {
-          $val = do_prompt('Enter repository:');
-        } else {
-          $val = do_prompt('Enter 1 for on, 0 for off:', -guarantee => [0,1]);
-        }
-        # deal with Ctrl-D
-        if (!defined($val)) {
-          print('ERROR Missing value for set.\n');
-          next;
-        }
-      }
-
-      if ($key eq "repository") {
-        if ($cmd eq "set") {
-          $location = scalar($val);
-        } else {
-          if (defined($location)) {
-            print "repository = $location\n";
-          } else {
-            print "repository = <UNDEFINED>\n";
-          }
-        }
-        print "OK\n";
-      } elsif ($key =~ m/^(debug-translation|machine-readable|no-execute-actions|require-verification|verify-downloads)$/i) {
-        if ($cmd eq "set") {
-          $opts{$key} = ($val eq "1" ? 1 : 0); ### THIS DOES NOT WORK??? TODO TODO
-          # special cases
-          $::debug_translation = $opts{"debug-translation"};
-          $::machinereadable = $opts{"machine-readable"};
-          $::no_execute_actions = $opts{'no-execute-actions'};
-        } else {
-          print "$key = ", ($opts{$key} ? 1 : 0), "\n";
-        }
-        print "OK\n";
-      } else {
-        print "ERROR unknown key $key\n";
-      }
-    } elsif ($cmd eq "load") {
-      my $what = shift @args;
-      if (!defined($what)) {
-        $what = do_prompt("Choose...", -menu => ['local', 'remote'], '>');
-      }
-      if ($what eq "local") {
-        init_local_db();
-        print "OK\n";
-      } elsif ($what eq "remote") {
-        init_tlmedia_or_die();
-        print "OK\n";
-      } else {
-        print "ERROR can only load 'local' or 'remote'\n";
-      }
-    } elsif ($cmd eq "save") {
-      $localtlpdb->save;
-      print "OK\n";
-    } elsif (defined($action_specification{$cmd})) {
-      # an action
-      if (!defined($action_specification{$cmd}{"function"})) {
-        print "ERROR action function not defined\n";
-        next;
-      }
-      # redo the option parsing
-      my %optarg;
-      if (defined($action_specification{$cmd}{'options'})) {
-        my %actopts = %{$action_specification{$cmd}{'options'}};
-        for my $k (keys %actopts) {
-          if ($actopts{$k} eq "1") {
-            $optarg{$k} = 1;
-          } else {
-            $optarg{"$k" . $actopts{$k}} = 1;
-          }
-        }
-      }
-      # save command line options for later restart, if necessary
-      @ARGV = @args;
-      my %savedopts = %opts;
-      %opts = ();
-      if (!GetOptions(\%opts, keys(%optarg))) {
-        print "ERROR unsupported arguments\n";
-        next;
-      }
-      my $ret = execute_action($cmd, @ARGV);
-      if ($ret & $F_ERROR) {
-        print "ERROR\n";
-      } elsif ($ret & $F_WARNING) {
-        print "OK\n";
-      } else {
-        print "OK\n";
-      }
-      # make sure that we restart after having called update --self!
-      if (($cmd eq 'update') && $opts{'self'}) {
-        print "tlmgr has been updated, restarting!\n";
-        exec("tlmgr", @::SAVEDARGV);
-      }
-      %opts = %savedopts;
-    } else {
-      print "ERROR unknown command\n";
-    }
-  }
-}
-
-
 1;
 __END__
 


Modified: trunk/Build/source/texk/texlive/linked_scripts/texlive/updmap.pl
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/texlive/updmap.pl	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Build/source/texk/texlive/linked_scripts/texlive/updmap.pl	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1,5 +1,5 @@
 #!/usr/bin/env perl
-# $Id: updmap.pl 44080 2017-04-27 16:46:42Z karl $
+# $Id: updmap.pl 44149 2017-05-02 09:57:51Z preining $
 # updmap - maintain map files for outline fonts.
 # (Maintained in TeX Live:Master/texmf-dist/scripts/texlive.)
 # 
@@ -14,7 +14,7 @@
 # the original versions were licensed under the following agreement:
 # Anyone may freely use, modify, and/or distribute this file, without
 
-my $svnid = '$Id: updmap.pl 44080 2017-04-27 16:46:42Z karl $';
+my $svnid = '$Id: updmap.pl 44149 2017-05-02 09:57:51Z preining $';
 
 my $TEXMFROOT;
 BEGIN {
@@ -27,10 +27,10 @@
   unshift(@INC, "$TEXMFROOT/tlpkg");
 }
 
-my $lastchdate = '$Date: 2017-04-27 18:46:42 +0200 (Thu, 27 Apr 2017) $';
+my $lastchdate = '$Date: 2017-05-02 11:57:51 +0200 (Tue, 02 May 2017) $';
 $lastchdate =~ s/^\$Date:\s*//;
 $lastchdate =~ s/ \(.*$//;
-my $svnrev = '$Revision: 44080 $';
+my $svnrev = '$Revision: 44149 $';
 $svnrev =~ s/^\$Revision:\s*//;
 $svnrev =~ s/\s*\$$//;
 my $version = "r$svnrev ($lastchdate)";
@@ -1323,7 +1323,12 @@
   # all kind of warning messages
   if ($first_time_creation_in_usermode) {
     print_and_log("
-WARNING: you are switching to updmap's per-user mappings.
+*************************************************************
+*                                                           *
+* WARNING: you are switching to updmap's per-user mappings. *
+*            Please read the following explanations.        *
+*                                                           *
+*************************************************************
 
 You have run updmap-user (as opposed to updmap-sys) for the first time; this
 has created configuration files which are local to your personal account.

Modified: trunk/Master/bin/win32/mtxrun.lua
===================================================================
--- trunk/Master/bin/win32/mtxrun.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/bin/win32/mtxrun.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1670,7 +1670,7 @@
 
 package.loaded["l-table"] = package.loaded["l-table"] or true
 
--- original size: 39587, stripped down to: 23144
+-- original size: 39608, stripped down to: 23165
 
 if not modules then modules={} end modules ['l-table']={
   version=1.001,
@@ -2003,7 +2003,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -2121,7 +2121,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -2204,7 +2204,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -20430,7 +20430,7 @@
 
 -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
 -- skipped libraries : -
--- original bytes    : 841875
+-- original bytes    : 841896
 -- stripped bytes    : 305446
 
 -- end library merge

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/context.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-metatex.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -17,7 +17,7 @@
 local write_nl = texio.write_nl
 
 local otfversion  = 2.826
-local otlversion  = 3.028
+local otlversion  = 3.029
 
 local helpinfo = [[
 <?xml version="1.0"?>

Modified: trunk/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -52,7 +52,9 @@
 local are_equal = table.are_equal
 local tonumber, tostring, rawget = tonumber, tostring, rawget
 local lpegmatch = lpeg.match
+local P, C, S, R, Cs, Ct, Cg, Cf, Cc = lpeg.P, lpeg.C, lpeg.S, lpeg.R, lpeg.Cs, lpeg.Ct, lpeg.Cg, lpeg.Cf, lpeg.Cc
 local formatters = string.formatters
+local utfchar = utf.char
 
 local report = application.report
 
@@ -73,7 +75,7 @@
 local split_space_table = lpeg.tsplitat(" ")
 local split_space_two   = lpeg.splitat (" ")
 local split_range_two   = lpeg.splitat ("..")
-local split_colon_table = lpeg.tsplitat(lpeg.P(" ")^0 * lpeg.P(";") * lpeg.P(" ")^0)
+local split_colon_table = lpeg.tsplitat(P(" ")^0 * P(";") * P(" ")^0)
 
 local skipped = {
     [0x002C6] = true, -- MODIFIER LETTER CIRCUMFLEX ACCENT
@@ -541,10 +543,10 @@
             index[k] = nil
         end
     end
--- for k, v in next, data do
---     v.synonym  = nil
---     v.synonyms = nil
--- end
+ -- for k, v in next, data do
+ --     v.synonym  = nil
+ --     v.synonyms = nil
+ -- end
     for k, v in table.sortedhash(index) do
         local d = data[v]
         if d and d.description ~= upper(k) then
@@ -571,6 +573,91 @@
     end
 end
 
+do
+
+    local space       = P(" ")
+    local spaces      = space^0
+    local semicolon   = P(";")
+    local hash        = P("#")
+    local newline     = S("\n\r")
+
+    local unicode     = Cs(R("09","AF")^1)/function(n) return tonumber(n,16) end
+                      * spaces
+    local components  = Ct (unicode^1)
+
+ -- local rubish_a    = semicolon
+ --                   * spaces
+ --                   * P("Emoji_ZWJ_Sequence")
+ --                   * spaces
+ --                   * semicolon
+ --                   * spaces
+ -- local description = C((1 - (spaces * (hash+newline)))^1)
+ -- local rubish_b    = (1-newline)^0
+ --                   * newline^1
+ --
+ -- local pattern_1   = Ct ( (
+ --     Cf ( Ct("") *
+ --         Cg (Cc("components") * components)
+ --       * rubish_a
+ --       * Cg (Cc("description") * description )
+ --       * rubish_b
+ --     , rawset)
+ --     + P(1) )^1 )
+
+    local rubish_a    = semicolon
+                      * spaces
+                      * P("non-")^0 * P("fully-qualified")
+                      * spaces
+                      * hash
+                      * spaces
+    local textstring  = C((1 - space)^1)
+                      * spaces
+    local description = ((1 - (spaces * newline))^1) / string.lower
+    local rubish_b    = (1-newline)^0
+                      * newline^1
+
+    local pattern_2   = Ct ( (
+        Cf ( Ct("") *
+            Cg (Cc("components") * components)
+          * rubish_a
+          * Cg (Cc("textstring") * textstring)
+          * Cg (Cc("description") * description )
+          * rubish_b
+        , rawset)
+        + P(1) )^1 )
+
+    function scripts.unicode.emoji(filename)
+
+        local name = resolvers.findfile("emoji-test.txt") or ""
+        if name == "" then
+            return
+        end
+        local l = io.loaddata(name)
+        local t = lpegmatch(pattern_2,l)
+
+        local hash = { }
+
+        local replace = lpeg.replacer {
+            ["#"] = "hash",
+            ["*"] = "asterisk"
+        }
+
+        for i=1,#t do
+            local v = t[i]
+            local d = v.description
+            local k = lpegmatch(replace,d) or d
+            hash[k] = v.components
+        end
+        local new = table.serialize(hash,"return", { hexify = true })
+        local old = io.loaddata(resolvers.findfile("char-emj.lua"))
+        if old and old ~= "" then
+            new = gsub(old,"^(.-)return .*$","%1" .. new)
+        end
+        io.savedata(filename,new)
+    end
+
+end
+
 -- the action
 
 local filename = environment.files[1]
@@ -583,6 +670,7 @@
         scripts.unicode.update()
         scripts.unicode.extras()
         scripts.unicode.save("char-def-new.lua")
+        scripts.unicode.emoji("char-emj-new.lua")
     else
         report("nothing to do")
     end

Modified: trunk/Master/texmf-dist/scripts/context/lua/mtxrun.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/context/lua/mtxrun.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/scripts/context/lua/mtxrun.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1670,7 +1670,7 @@
 
 package.loaded["l-table"] = package.loaded["l-table"] or true
 
--- original size: 39587, stripped down to: 23144
+-- original size: 39608, stripped down to: 23165
 
 if not modules then modules={} end modules ['l-table']={
   version=1.001,
@@ -2003,7 +2003,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -2121,7 +2121,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -2204,7 +2204,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -20430,7 +20430,7 @@
 
 -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
 -- skipped libraries : -
--- original bytes    : 841875
+-- original bytes    : 841896
 -- stripped bytes    : 305446
 
 -- end library merge

Modified: trunk/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1670,7 +1670,7 @@
 
 package.loaded["l-table"] = package.loaded["l-table"] or true
 
--- original size: 39587, stripped down to: 23144
+-- original size: 39608, stripped down to: 23165
 
 if not modules then modules={} end modules ['l-table']={
   version=1.001,
@@ -2003,7 +2003,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -2121,7 +2121,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -2204,7 +2204,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -20430,7 +20430,7 @@
 
 -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
 -- skipped libraries : -
--- original bytes    : 841875
+-- original bytes    : 841896
 -- stripped bytes    : 305446
 
 -- end library merge

Modified: trunk/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
===================================================================
--- trunk/Master/texmf-dist/scripts/context/stubs/unix/mtxrun	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/scripts/context/stubs/unix/mtxrun	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1670,7 +1670,7 @@
 
 package.loaded["l-table"] = package.loaded["l-table"] or true
 
--- original size: 39587, stripped down to: 23144
+-- original size: 39608, stripped down to: 23165
 
 if not modules then modules={} end modules ['l-table']={
   version=1.001,
@@ -2003,7 +2003,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -2121,7 +2121,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -2204,7 +2204,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -20430,7 +20430,7 @@
 
 -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
 -- skipped libraries : -
--- original bytes    : 841875
+-- original bytes    : 841896
 -- stripped bytes    : 305446
 
 -- end library merge

Modified: trunk/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1670,7 +1670,7 @@
 
 package.loaded["l-table"] = package.loaded["l-table"] or true
 
--- original size: 39587, stripped down to: 23144
+-- original size: 39608, stripped down to: 23165
 
 if not modules then modules={} end modules ['l-table']={
   version=1.001,
@@ -2003,7 +2003,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -2121,7 +2121,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -2204,7 +2204,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -20430,7 +20430,7 @@
 
 -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
 -- skipped libraries : -
--- original bytes    : 841875
+-- original bytes    : 841896
 -- stripped bytes    : 305446
 
 -- end library merge

Modified: trunk/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii	2017-05-02 22:24:44 UTC (rev 44160)
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2017.04.20 21:31}
+\newcontextversion{2017.04.27 01:00}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new

Modified: trunk/Master/texmf-dist/tex/context/base/mkii/context.mkii
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkii/context.mkii	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkii/context.mkii	2017-05-02 22:24:44 UTC (rev 44160)
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2017.04.20 21:31}
+\edef\contextversion{2017.04.27 01:00}
 
 %D For those who want to use this:
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -527,8 +527,8 @@
     end
 end
 
-setmetatableindex(transparencies, extender)
-setmetatableindex(transparencies.data, reviver) -- register if used
+setmetatableindex(transparencies,extender)
+setmetatableindex(transparencies.data,reviver) -- register if used
 
 -- check if there is an identity
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/char-def.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/char-def.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/char-def.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -238949,4 +238949,4 @@
   synonyms={ "vs17" },
   unicodeslot=0xE0100,
  },
-}
\ No newline at end of file
+}

Added: trunk/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -0,0 +1,2633 @@
+if not modules then modules = { } end modules ['char-emj'] = {
+    version   = 1.001,
+    comment   = "companion to char-ini.mkiv",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files",
+    dataonly  = true,
+}
+
+-- This table is generated.
+
+return {
+ ["1st place medal"]={ 0x1F947 },
+ ["2nd place medal"]={ 0x1F948 },
+ ["3rd place medal"]={ 0x1F949 },
+ ["a button (blood type)"]={ 0x1F170 },
+ ["ab button (blood type)"]={ 0x1F18E },
+ ["admission tickets"]={ 0x1F39F },
+ ["adult"]={ 0x1F9D1 },
+ ["adult: dark skin tone"]={ 0x1F9D1, 0x1F3FF },
+ ["adult: light skin tone"]={ 0x1F9D1, 0x1F3FB },
+ ["adult: medium skin tone"]={ 0x1F9D1, 0x1F3FD },
+ ["adult: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE },
+ ["adult: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC },
+ ["aerial tramway"]={ 0x1F6A1 },
+ ["afghanistan"]={ 0x1F1E6, 0x1F1EB },
+ ["airplane"]={ 0x2708 },
+ ["airplane arrival"]={ 0x1F6EC },
+ ["airplane departure"]={ 0x1F6EB },
+ ["alarm clock"]={ 0x23F0 },
+ ["albania"]={ 0x1F1E6, 0x1F1F1 },
+ ["alembic"]={ 0x2697 },
+ ["algeria"]={ 0x1F1E9, 0x1F1FF },
+ ["alien"]={ 0x1F47D },
+ ["alien monster"]={ 0x1F47E },
+ ["ambulance"]={ 0x1F691 },
+ ["american football"]={ 0x1F3C8 },
+ ["american samoa"]={ 0x1F1E6, 0x1F1F8 },
+ ["amphora"]={ 0x1F3FA },
+ ["anchor"]={ 0x2693 },
+ ["andorra"]={ 0x1F1E6, 0x1F1E9 },
+ ["anger symbol"]={ 0x1F4A2 },
+ ["angola"]={ 0x1F1E6, 0x1F1F4 },
+ ["angry face"]={ 0x1F620 },
+ ["angry face with horns"]={ 0x1F47F },
+ ["anguilla"]={ 0x1F1E6, 0x1F1EE },
+ ["anguished face"]={ 0x1F627 },
+ ["ant"]={ 0x1F41C },
+ ["antarctica"]={ 0x1F1E6, 0x1F1F6 },
+ ["antenna bars"]={ 0x1F4F6 },
+ ["anticlockwise arrows button"]={ 0x1F504 },
+ ["antigua & barbuda"]={ 0x1F1E6, 0x1F1EC },
+ ["aquarius"]={ 0x2652 },
+ ["argentina"]={ 0x1F1E6, 0x1F1F7 },
+ ["aries"]={ 0x2648 },
+ ["armenia"]={ 0x1F1E6, 0x1F1F2 },
+ ["articulated lorry"]={ 0x1F69B },
+ ["artist palette"]={ 0x1F3A8 },
+ ["aruba"]={ 0x1F1E6, 0x1F1FC },
+ ["ascension island"]={ 0x1F1E6, 0x1F1E8 },
+ ["astonished face"]={ 0x1F632 },
+ ["atm sign"]={ 0x1F3E7 },
+ ["atom symbol"]={ 0x269B },
+ ["australia"]={ 0x1F1E6, 0x1F1FA },
+ ["austria"]={ 0x1F1E6, 0x1F1F9 },
+ ["automobile"]={ 0x1F697 },
+ ["avocado"]={ 0x1F951 },
+ ["azerbaijan"]={ 0x1F1E6, 0x1F1FF },
+ ["b button (blood type)"]={ 0x1F171 },
+ ["baby"]={ 0x1F476 },
+ ["baby angel"]={ 0x1F47C },
+ ["baby angel: dark skin tone"]={ 0x1F47C, 0x1F3FF },
+ ["baby angel: light skin tone"]={ 0x1F47C, 0x1F3FB },
+ ["baby angel: medium skin tone"]={ 0x1F47C, 0x1F3FD },
+ ["baby angel: medium-dark skin tone"]={ 0x1F47C, 0x1F3FE },
+ ["baby angel: medium-light skin tone"]={ 0x1F47C, 0x1F3FC },
+ ["baby bottle"]={ 0x1F37C },
+ ["baby chick"]={ 0x1F424 },
+ ["baby symbol"]={ 0x1F6BC },
+ ["baby: dark skin tone"]={ 0x1F476, 0x1F3FF },
+ ["baby: light skin tone"]={ 0x1F476, 0x1F3FB },
+ ["baby: medium skin tone"]={ 0x1F476, 0x1F3FD },
+ ["baby: medium-dark skin tone"]={ 0x1F476, 0x1F3FE },
+ ["baby: medium-light skin tone"]={ 0x1F476, 0x1F3FC },
+ ["back arrow"]={ 0x1F519 },
+ ["backhand index pointing down"]={ 0x1F447 },
+ ["backhand index pointing down: dark skin tone"]={ 0x1F447, 0x1F3FF },
+ ["backhand index pointing down: light skin tone"]={ 0x1F447, 0x1F3FB },
+ ["backhand index pointing down: medium skin tone"]={ 0x1F447, 0x1F3FD },
+ ["backhand index pointing down: medium-dark skin tone"]={ 0x1F447, 0x1F3FE },
+ ["backhand index pointing down: medium-light skin tone"]={ 0x1F447, 0x1F3FC },
+ ["backhand index pointing left"]={ 0x1F448 },
+ ["backhand index pointing left: dark skin tone"]={ 0x1F448, 0x1F3FF },
+ ["backhand index pointing left: light skin tone"]={ 0x1F448, 0x1F3FB },
+ ["backhand index pointing left: medium skin tone"]={ 0x1F448, 0x1F3FD },
+ ["backhand index pointing left: medium-dark skin tone"]={ 0x1F448, 0x1F3FE },
+ ["backhand index pointing left: medium-light skin tone"]={ 0x1F448, 0x1F3FC },
+ ["backhand index pointing right"]={ 0x1F449 },
+ ["backhand index pointing right: dark skin tone"]={ 0x1F449, 0x1F3FF },
+ ["backhand index pointing right: light skin tone"]={ 0x1F449, 0x1F3FB },
+ ["backhand index pointing right: medium skin tone"]={ 0x1F449, 0x1F3FD },
+ ["backhand index pointing right: medium-dark skin tone"]={ 0x1F449, 0x1F3FE },
+ ["backhand index pointing right: medium-light skin tone"]={ 0x1F449, 0x1F3FC },
+ ["backhand index pointing up"]={ 0x1F446 },
+ ["backhand index pointing up: dark skin tone"]={ 0x1F446, 0x1F3FF },
+ ["backhand index pointing up: light skin tone"]={ 0x1F446, 0x1F3FB },
+ ["backhand index pointing up: medium skin tone"]={ 0x1F446, 0x1F3FD },
+ ["backhand index pointing up: medium-dark skin tone"]={ 0x1F446, 0x1F3FE },
+ ["backhand index pointing up: medium-light skin tone"]={ 0x1F446, 0x1F3FC },
+ ["bacon"]={ 0x1F953 },
+ ["badminton"]={ 0x1F3F8 },
+ ["baggage claim"]={ 0x1F6C4 },
+ ["baguette bread"]={ 0x1F956 },
+ ["bahamas"]={ 0x1F1E7, 0x1F1F8 },
+ ["bahrain"]={ 0x1F1E7, 0x1F1ED },
+ ["balance scale"]={ 0x2696 },
+ ["balloon"]={ 0x1F388 },
+ ["ballot box with ballot"]={ 0x1F5F3 },
+ ["ballot box with check"]={ 0x2611 },
+ ["banana"]={ 0x1F34C },
+ ["bangladesh"]={ 0x1F1E7, 0x1F1E9 },
+ ["bank"]={ 0x1F3E6 },
+ ["bar chart"]={ 0x1F4CA },
+ ["barbados"]={ 0x1F1E7, 0x1F1E7 },
+ ["barber pole"]={ 0x1F488 },
+ ["baseball"]={ 0x26BE },
+ ["basketball"]={ 0x1F3C0 },
+ ["bat"]={ 0x1F987 },
+ ["bathtub"]={ 0x1F6C1 },
+ ["battery"]={ 0x1F50B },
+ ["beach with umbrella"]={ 0x1F3D6 },
+ ["bear face"]={ 0x1F43B },
+ ["bearded person"]={ 0x1F9D4 },
+ ["bearded person: dark skin tone"]={ 0x1F9D4, 0x1F3FF },
+ ["bearded person: light skin tone"]={ 0x1F9D4, 0x1F3FB },
+ ["bearded person: medium skin tone"]={ 0x1F9D4, 0x1F3FD },
+ ["bearded person: medium-dark skin tone"]={ 0x1F9D4, 0x1F3FE },
+ ["bearded person: medium-light skin tone"]={ 0x1F9D4, 0x1F3FC },
+ ["beating heart"]={ 0x1F493 },
+ ["bed"]={ 0x1F6CF },
+ ["beer mug"]={ 0x1F37A },
+ ["belarus"]={ 0x1F1E7, 0x1F1FE },
+ ["belgium"]={ 0x1F1E7, 0x1F1EA },
+ ["belize"]={ 0x1F1E7, 0x1F1FF },
+ ["bell"]={ 0x1F514 },
+ ["bell with slash"]={ 0x1F515 },
+ ["bellhop bell"]={ 0x1F6CE },
+ ["benin"]={ 0x1F1E7, 0x1F1EF },
+ ["bento box"]={ 0x1F371 },
+ ["bermuda"]={ 0x1F1E7, 0x1F1F2 },
+ ["bhutan"]={ 0x1F1E7, 0x1F1F9 },
+ ["bicycle"]={ 0x1F6B2 },
+ ["bikini"]={ 0x1F459 },
+ ["billed cap"]={ 0x1F9E2 },
+ ["biohazard"]={ 0x2623 },
+ ["bird"]={ 0x1F426 },
+ ["birthday cake"]={ 0x1F382 },
+ ["black circle"]={ 0x26AB },
+ ["black flag"]={ 0x1F3F4 },
+ ["black heart"]={ 0x1F5A4 },
+ ["black large square"]={ 0x2B1B },
+ ["black medium square"]={ 0x25FC },
+ ["black medium-small square"]={ 0x25FE },
+ ["black nib"]={ 0x2712 },
+ ["black small square"]={ 0x25AA },
+ ["black square button"]={ 0x1F532 },
+ ["blond-haired man"]={ 0x1F471, 0x200D, 0x2642 },
+ ["blond-haired man: dark skin tone"]={ 0x1F471, 0x1F3FF, 0x200D, 0x2642 },
+ ["blond-haired man: light skin tone"]={ 0x1F471, 0x1F3FB, 0x200D, 0x2642 },
+ ["blond-haired man: medium skin tone"]={ 0x1F471, 0x1F3FD, 0x200D, 0x2642 },
+ ["blond-haired man: medium-dark skin tone"]={ 0x1F471, 0x1F3FE, 0x200D, 0x2642 },
+ ["blond-haired man: medium-light skin tone"]={ 0x1F471, 0x1F3FC, 0x200D, 0x2642 },
+ ["blond-haired person"]={ 0x1F471 },
+ ["blond-haired person: dark skin tone"]={ 0x1F471, 0x1F3FF },
+ ["blond-haired person: light skin tone"]={ 0x1F471, 0x1F3FB },
+ ["blond-haired person: medium skin tone"]={ 0x1F471, 0x1F3FD },
+ ["blond-haired person: medium-dark skin tone"]={ 0x1F471, 0x1F3FE },
+ ["blond-haired person: medium-light skin tone"]={ 0x1F471, 0x1F3FC },
+ ["blond-haired woman"]={ 0x1F471, 0x200D, 0x2640 },
+ ["blond-haired woman: dark skin tone"]={ 0x1F471, 0x1F3FF, 0x200D, 0x2640 },
+ ["blond-haired woman: light skin tone"]={ 0x1F471, 0x1F3FB, 0x200D, 0x2640 },
+ ["blond-haired woman: medium skin tone"]={ 0x1F471, 0x1F3FD, 0x200D, 0x2640 },
+ ["blond-haired woman: medium-dark skin tone"]={ 0x1F471, 0x1F3FE, 0x200D, 0x2640 },
+ ["blond-haired woman: medium-light skin tone"]={ 0x1F471, 0x1F3FC, 0x200D, 0x2640 },
+ ["blossom"]={ 0x1F33C },
+ ["blowfish"]={ 0x1F421 },
+ ["blue book"]={ 0x1F4D8 },
+ ["blue circle"]={ 0x1F535 },
+ ["blue heart"]={ 0x1F499 },
+ ["boar"]={ 0x1F417 },
+ ["bolivia"]={ 0x1F1E7, 0x1F1F4 },
+ ["bomb"]={ 0x1F4A3 },
+ ["bookmark"]={ 0x1F516 },
+ ["bookmark tabs"]={ 0x1F4D1 },
+ ["books"]={ 0x1F4DA },
+ ["bosnia & herzegovina"]={ 0x1F1E7, 0x1F1E6 },
+ ["botswana"]={ 0x1F1E7, 0x1F1FC },
+ ["bottle with popping cork"]={ 0x1F37E },
+ ["bouquet"]={ 0x1F490 },
+ ["bouvet island"]={ 0x1F1E7, 0x1F1FB },
+ ["bow and arrow"]={ 0x1F3F9 },
+ ["bowl with spoon"]={ 0x1F963 },
+ ["bowling"]={ 0x1F3B3 },
+ ["boxing glove"]={ 0x1F94A },
+ ["boy"]={ 0x1F466 },
+ ["boy: dark skin tone"]={ 0x1F466, 0x1F3FF },
+ ["boy: light skin tone"]={ 0x1F466, 0x1F3FB },
+ ["boy: medium skin tone"]={ 0x1F466, 0x1F3FD },
+ ["boy: medium-dark skin tone"]={ 0x1F466, 0x1F3FE },
+ ["boy: medium-light skin tone"]={ 0x1F466, 0x1F3FC },
+ ["brain"]={ 0x1F9E0 },
+ ["brazil"]={ 0x1F1E7, 0x1F1F7 },
+ ["bread"]={ 0x1F35E },
+ ["breast-feeding"]={ 0x1F931 },
+ ["breast-feeding: dark skin tone"]={ 0x1F931, 0x1F3FF },
+ ["breast-feeding: light skin tone"]={ 0x1F931, 0x1F3FB },
+ ["breast-feeding: medium skin tone"]={ 0x1F931, 0x1F3FD },
+ ["breast-feeding: medium-dark skin tone"]={ 0x1F931, 0x1F3FE },
+ ["breast-feeding: medium-light skin tone"]={ 0x1F931, 0x1F3FC },
+ ["bride with veil"]={ 0x1F470 },
+ ["bride with veil: dark skin tone"]={ 0x1F470, 0x1F3FF },
+ ["bride with veil: light skin tone"]={ 0x1F470, 0x1F3FB },
+ ["bride with veil: medium skin tone"]={ 0x1F470, 0x1F3FD },
+ ["bride with veil: medium-dark skin tone"]={ 0x1F470, 0x1F3FE },
+ ["bride with veil: medium-light skin tone"]={ 0x1F470, 0x1F3FC },
+ ["bridge at night"]={ 0x1F309 },
+ ["briefcase"]={ 0x1F4BC },
+ ["bright button"]={ 0x1F506 },
+ ["british indian ocean territory"]={ 0x1F1EE, 0x1F1F4 },
+ ["british virgin islands"]={ 0x1F1FB, 0x1F1EC },
+ ["broccoli"]={ 0x1F966 },
+ ["broken heart"]={ 0x1F494 },
+ ["brunei"]={ 0x1F1E7, 0x1F1F3 },
+ ["bug"]={ 0x1F41B },
+ ["building construction"]={ 0x1F3D7 },
+ ["bulgaria"]={ 0x1F1E7, 0x1F1EC },
+ ["burkina faso"]={ 0x1F1E7, 0x1F1EB },
+ ["burrito"]={ 0x1F32F },
+ ["burundi"]={ 0x1F1E7, 0x1F1EE },
+ ["bus"]={ 0x1F68C },
+ ["bus stop"]={ 0x1F68F },
+ ["bust in silhouette"]={ 0x1F464 },
+ ["busts in silhouette"]={ 0x1F465 },
+ ["butterfly"]={ 0x1F98B },
+ ["cactus"]={ 0x1F335 },
+ ["calendar"]={ 0x1F4C5 },
+ ["call me hand"]={ 0x1F919 },
+ ["call me hand: dark skin tone"]={ 0x1F919, 0x1F3FF },
+ ["call me hand: light skin tone"]={ 0x1F919, 0x1F3FB },
+ ["call me hand: medium skin tone"]={ 0x1F919, 0x1F3FD },
+ ["call me hand: medium-dark skin tone"]={ 0x1F919, 0x1F3FE },
+ ["call me hand: medium-light skin tone"]={ 0x1F919, 0x1F3FC },
+ ["cambodia"]={ 0x1F1F0, 0x1F1ED },
+ ["camel"]={ 0x1F42A },
+ ["camera"]={ 0x1F4F7 },
+ ["camera with flash"]={ 0x1F4F8 },
+ ["cameroon"]={ 0x1F1E8, 0x1F1F2 },
+ ["camping"]={ 0x1F3D5 },
+ ["canada"]={ 0x1F1E8, 0x1F1E6 },
+ ["canary islands"]={ 0x1F1EE, 0x1F1E8 },
+ ["cancer"]={ 0x264B },
+ ["candle"]={ 0x1F56F },
+ ["candy"]={ 0x1F36C },
+ ["canned food"]={ 0x1F96B },
+ ["canoe"]={ 0x1F6F6 },
+ ["cape verde"]={ 0x1F1E8, 0x1F1FB },
+ ["capricorn"]={ 0x2651 },
+ ["card file box"]={ 0x1F5C3 },
+ ["card index"]={ 0x1F4C7 },
+ ["card index dividers"]={ 0x1F5C2 },
+ ["caribbean netherlands"]={ 0x1F1E7, 0x1F1F6 },
+ ["carousel horse"]={ 0x1F3A0 },
+ ["carp streamer"]={ 0x1F38F },
+ ["carrot"]={ 0x1F955 },
+ ["castle"]={ 0x1F3F0 },
+ ["cat"]={ 0x1F408 },
+ ["cat face"]={ 0x1F431 },
+ ["cat face with tears of joy"]={ 0x1F639 },
+ ["cat face with wry smile"]={ 0x1F63C },
+ ["cayman islands"]={ 0x1F1F0, 0x1F1FE },
+ ["central african republic"]={ 0x1F1E8, 0x1F1EB },
+ ["ceuta & melilla"]={ 0x1F1EA, 0x1F1E6 },
+ ["chad"]={ 0x1F1F9, 0x1F1E9 },
+ ["chains"]={ 0x26D3 },
+ ["chart decreasing"]={ 0x1F4C9 },
+ ["chart increasing"]={ 0x1F4C8 },
+ ["chart increasing with yen"]={ 0x1F4B9 },
+ ["cheese wedge"]={ 0x1F9C0 },
+ ["chequered flag"]={ 0x1F3C1 },
+ ["cherries"]={ 0x1F352 },
+ ["cherry blossom"]={ 0x1F338 },
+ ["chestnut"]={ 0x1F330 },
+ ["chicken"]={ 0x1F414 },
+ ["child"]={ 0x1F9D2 },
+ ["child: dark skin tone"]={ 0x1F9D2, 0x1F3FF },
+ ["child: light skin tone"]={ 0x1F9D2, 0x1F3FB },
+ ["child: medium skin tone"]={ 0x1F9D2, 0x1F3FD },
+ ["child: medium-dark skin tone"]={ 0x1F9D2, 0x1F3FE },
+ ["child: medium-light skin tone"]={ 0x1F9D2, 0x1F3FC },
+ ["children crossing"]={ 0x1F6B8 },
+ ["chile"]={ 0x1F1E8, 0x1F1F1 },
+ ["china"]={ 0x1F1E8, 0x1F1F3 },
+ ["chipmunk"]={ 0x1F43F },
+ ["chocolate bar"]={ 0x1F36B },
+ ["chopsticks"]={ 0x1F962 },
+ ["christmas island"]={ 0x1F1E8, 0x1F1FD },
+ ["christmas tree"]={ 0x1F384 },
+ ["church"]={ 0x26EA },
+ ["cigarette"]={ 0x1F6AC },
+ ["cinema"]={ 0x1F3A6 },
+ ["circled m"]={ 0x24C2 },
+ ["circus tent"]={ 0x1F3AA },
+ ["cityscape"]={ 0x1F3D9 },
+ ["cityscape at dusk"]={ 0x1F306 },
+ ["cl button"]={ 0x1F191 },
+ ["clamp"]={ 0x1F5DC },
+ ["clapper board"]={ 0x1F3AC },
+ ["clapping hands"]={ 0x1F44F },
+ ["clapping hands: dark skin tone"]={ 0x1F44F, 0x1F3FF },
+ ["clapping hands: light skin tone"]={ 0x1F44F, 0x1F3FB },
+ ["clapping hands: medium skin tone"]={ 0x1F44F, 0x1F3FD },
+ ["clapping hands: medium-dark skin tone"]={ 0x1F44F, 0x1F3FE },
+ ["clapping hands: medium-light skin tone"]={ 0x1F44F, 0x1F3FC },
+ ["classical building"]={ 0x1F3DB },
+ ["clinking beer mugs"]={ 0x1F37B },
+ ["clinking glasses"]={ 0x1F942 },
+ ["clipboard"]={ 0x1F4CB },
+ ["clipperton island"]={ 0x1F1E8, 0x1F1F5 },
+ ["clockwise vertical arrows"]={ 0x1F503 },
+ ["closed book"]={ 0x1F4D5 },
+ ["closed mailbox with lowered flag"]={ 0x1F4EA },
+ ["closed mailbox with raised flag"]={ 0x1F4EB },
+ ["closed umbrella"]={ 0x1F302 },
+ ["cloud"]={ 0x2601 },
+ ["cloud with lightning"]={ 0x1F329 },
+ ["cloud with lightning and rain"]={ 0x26C8 },
+ ["cloud with rain"]={ 0x1F327 },
+ ["cloud with snow"]={ 0x1F328 },
+ ["clown face"]={ 0x1F921 },
+ ["club suit"]={ 0x2663 },
+ ["clutch bag"]={ 0x1F45D },
+ ["coat"]={ 0x1F9E5 },
+ ["cocktail glass"]={ 0x1F378 },
+ ["coconut"]={ 0x1F965 },
+ ["cocos (keeling) islands"]={ 0x1F1E8, 0x1F1E8 },
+ ["coffin"]={ 0x26B0 },
+ ["collision"]={ 0x1F4A5 },
+ ["colombia"]={ 0x1F1E8, 0x1F1F4 },
+ ["comet"]={ 0x2604 },
+ ["comoros"]={ 0x1F1F0, 0x1F1F2 },
+ ["computer disk"]={ 0x1F4BD },
+ ["computer mouse"]={ 0x1F5B1 },
+ ["confetti ball"]={ 0x1F38A },
+ ["confounded face"]={ 0x1F616 },
+ ["confused face"]={ 0x1F615 },
+ ["congo - brazzaville"]={ 0x1F1E8, 0x1F1EC },
+ ["congo - kinshasa"]={ 0x1F1E8, 0x1F1E9 },
+ ["construction"]={ 0x1F6A7 },
+ ["construction worker"]={ 0x1F477 },
+ ["construction worker: dark skin tone"]={ 0x1F477, 0x1F3FF },
+ ["construction worker: light skin tone"]={ 0x1F477, 0x1F3FB },
+ ["construction worker: medium skin tone"]={ 0x1F477, 0x1F3FD },
+ ["construction worker: medium-dark skin tone"]={ 0x1F477, 0x1F3FE },
+ ["construction worker: medium-light skin tone"]={ 0x1F477, 0x1F3FC },
+ ["control knobs"]={ 0x1F39B },
+ ["convenience store"]={ 0x1F3EA },
+ ["cook islands"]={ 0x1F1E8, 0x1F1F0 },
+ ["cooked rice"]={ 0x1F35A },
+ ["cookie"]={ 0x1F36A },
+ ["cooking"]={ 0x1F373 },
+ ["cool button"]={ 0x1F192 },
+ ["copyright"]={ 0xA9 },
+ ["costa rica"]={ 0x1F1E8, 0x1F1F7 },
+ ["couch and lamp"]={ 0x1F6CB },
+ ["couple with heart"]={ 0x1F491 },
+ ["couple with heart: man, man"]={ 0x1F468, 0x200D, 0x2764, 0x200D, 0x1F468 },
+ ["couple with heart: woman, man"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F468 },
+ ["couple with heart: woman, woman"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F469 },
+ ["cow"]={ 0x1F404 },
+ ["cow face"]={ 0x1F42E },
+ ["cowboy hat face"]={ 0x1F920 },
+ ["crab"]={ 0x1F980 },
+ ["crayon"]={ 0x1F58D },
+ ["crazy face"]={ 0x1F92A },
+ ["credit card"]={ 0x1F4B3 },
+ ["crescent moon"]={ 0x1F319 },
+ ["cricket"]={ 0x1F3CF },
+ ["croatia"]={ 0x1F1ED, 0x1F1F7 },
+ ["crocodile"]={ 0x1F40A },
+ ["croissant"]={ 0x1F950 },
+ ["cross mark"]={ 0x274C },
+ ["cross mark button"]={ 0x274E },
+ ["crossed fingers"]={ 0x1F91E },
+ ["crossed fingers: dark skin tone"]={ 0x1F91E, 0x1F3FF },
+ ["crossed fingers: light skin tone"]={ 0x1F91E, 0x1F3FB },
+ ["crossed fingers: medium skin tone"]={ 0x1F91E, 0x1F3FD },
+ ["crossed fingers: medium-dark skin tone"]={ 0x1F91E, 0x1F3FE },
+ ["crossed fingers: medium-light skin tone"]={ 0x1F91E, 0x1F3FC },
+ ["crossed flags"]={ 0x1F38C },
+ ["crossed swords"]={ 0x2694 },
+ ["crown"]={ 0x1F451 },
+ ["crying cat face"]={ 0x1F63F },
+ ["crying face"]={ 0x1F622 },
+ ["crystal ball"]={ 0x1F52E },
+ ["cuba"]={ 0x1F1E8, 0x1F1FA },
+ ["cucumber"]={ 0x1F952 },
+ ["cup with straw"]={ 0x1F964 },
+ ["curaçao"]={ 0x1F1E8, 0x1F1FC },
+ ["curling stone"]={ 0x1F94C },
+ ["curly loop"]={ 0x27B0 },
+ ["currency exchange"]={ 0x1F4B1 },
+ ["curry rice"]={ 0x1F35B },
+ ["custard"]={ 0x1F36E },
+ ["customs"]={ 0x1F6C3 },
+ ["cut of meat"]={ 0x1F969 },
+ ["cyclone"]={ 0x1F300 },
+ ["cyprus"]={ 0x1F1E8, 0x1F1FE },
+ ["czechia"]={ 0x1F1E8, 0x1F1FF },
+ ["côte d’ivoire"]={ 0x1F1E8, 0x1F1EE },
+ ["dagger"]={ 0x1F5E1 },
+ ["dango"]={ 0x1F361 },
+ ["dashing away"]={ 0x1F4A8 },
+ ["deciduous tree"]={ 0x1F333 },
+ ["deer"]={ 0x1F98C },
+ ["delivery truck"]={ 0x1F69A },
+ ["denmark"]={ 0x1F1E9, 0x1F1F0 },
+ ["department store"]={ 0x1F3EC },
+ ["derelict house"]={ 0x1F3DA },
+ ["desert"]={ 0x1F3DC },
+ ["desert island"]={ 0x1F3DD },
+ ["desktop computer"]={ 0x1F5A5 },
+ ["detective"]={ 0x1F575 },
+ ["detective: dark skin tone"]={ 0x1F575, 0x1F3FF },
+ ["detective: light skin tone"]={ 0x1F575, 0x1F3FB },
+ ["detective: medium skin tone"]={ 0x1F575, 0x1F3FD },
+ ["detective: medium-dark skin tone"]={ 0x1F575, 0x1F3FE },
+ ["detective: medium-light skin tone"]={ 0x1F575, 0x1F3FC },
+ ["diamond suit"]={ 0x2666 },
+ ["diamond with a dot"]={ 0x1F4A0 },
+ ["diego garcia"]={ 0x1F1E9, 0x1F1EC },
+ ["dim button"]={ 0x1F505 },
+ ["direct hit"]={ 0x1F3AF },
+ ["disappointed but relieved face"]={ 0x1F625 },
+ ["disappointed face"]={ 0x1F61E },
+ ["dizzy"]={ 0x1F4AB },
+ ["dizzy face"]={ 0x1F635 },
+ ["djibouti"]={ 0x1F1E9, 0x1F1EF },
+ ["dog"]={ 0x1F415 },
+ ["dog face"]={ 0x1F436 },
+ ["dollar banknote"]={ 0x1F4B5 },
+ ["dolphin"]={ 0x1F42C },
+ ["dominica"]={ 0x1F1E9, 0x1F1F2 },
+ ["dominican republic"]={ 0x1F1E9, 0x1F1F4 },
+ ["door"]={ 0x1F6AA },
+ ["dotted six-pointed star"]={ 0x1F52F },
+ ["double curly loop"]={ 0x27BF },
+ ["double exclamation mark"]={ 0x203C },
+ ["doughnut"]={ 0x1F369 },
+ ["dove"]={ 0x1F54A },
+ ["down arrow"]={ 0x2B07 },
+ ["down button"]={ 0x1F53D },
+ ["down-left arrow"]={ 0x2199 },
+ ["down-right arrow"]={ 0x2198 },
+ ["dragon"]={ 0x1F409 },
+ ["dragon face"]={ 0x1F432 },
+ ["dress"]={ 0x1F457 },
+ ["drooling face"]={ 0x1F924 },
+ ["droplet"]={ 0x1F4A7 },
+ ["drum"]={ 0x1F941 },
+ ["duck"]={ 0x1F986 },
+ ["dumpling"]={ 0x1F95F },
+ ["dvd"]={ 0x1F4C0 },
+ ["e-mail"]={ 0x1F4E7 },
+ ["eagle"]={ 0x1F985 },
+ ["ear"]={ 0x1F442 },
+ ["ear of corn"]={ 0x1F33D },
+ ["ear: dark skin tone"]={ 0x1F442, 0x1F3FF },
+ ["ear: light skin tone"]={ 0x1F442, 0x1F3FB },
+ ["ear: medium skin tone"]={ 0x1F442, 0x1F3FD },
+ ["ear: medium-dark skin tone"]={ 0x1F442, 0x1F3FE },
+ ["ear: medium-light skin tone"]={ 0x1F442, 0x1F3FC },
+ ["ecuador"]={ 0x1F1EA, 0x1F1E8 },
+ ["egg"]={ 0x1F95A },
+ ["eggplant"]={ 0x1F346 },
+ ["egypt"]={ 0x1F1EA, 0x1F1EC },
+ ["eight o’clock"]={ 0x1F557 },
+ ["eight-pointed star"]={ 0x2734 },
+ ["eight-spoked asterisk"]={ 0x2733 },
+ ["eight-thirty"]={ 0x1F563 },
+ ["eject button"]={ 0x23CF },
+ ["el salvador"]={ 0x1F1F8, 0x1F1FB },
+ ["electric plug"]={ 0x1F50C },
+ ["elephant"]={ 0x1F418 },
+ ["eleven o’clock"]={ 0x1F55A },
+ ["eleven-thirty"]={ 0x1F566 },
+ ["elf"]={ 0x1F9DD },
+ ["elf: dark skin tone"]={ 0x1F9DD, 0x1F3FF },
+ ["elf: light skin tone"]={ 0x1F9DD, 0x1F3FB },
+ ["elf: medium skin tone"]={ 0x1F9DD, 0x1F3FD },
+ ["elf: medium-dark skin tone"]={ 0x1F9DD, 0x1F3FE },
+ ["elf: medium-light skin tone"]={ 0x1F9DD, 0x1F3FC },
+ ["end arrow"]={ 0x1F51A },
+ ["england"]={ 0x1F3F4, 0xE0067, 0xE0062, 0xE0065, 0xE006E, 0xE0067, 0xE007F },
+ ["envelope"]={ 0x2709 },
+ ["envelope with arrow"]={ 0x1F4E9 },
+ ["equatorial guinea"]={ 0x1F1EC, 0x1F1F6 },
+ ["eritrea"]={ 0x1F1EA, 0x1F1F7 },
+ ["estonia"]={ 0x1F1EA, 0x1F1EA },
+ ["ethiopia"]={ 0x1F1EA, 0x1F1F9 },
+ ["euro banknote"]={ 0x1F4B6 },
+ ["european union"]={ 0x1F1EA, 0x1F1FA },
+ ["evergreen tree"]={ 0x1F332 },
+ ["ewe"]={ 0x1F411 },
+ ["exclamation mark"]={ 0x2757 },
+ ["exclamation question mark"]={ 0x2049 },
+ ["exploding head"]={ 0x1F92F },
+ ["expressionless face"]={ 0x1F611 },
+ ["eye"]={ 0x1F441 },
+ ["eye in speech bubble"]={ 0x1F441, 0x200D, 0x1F5E8 },
+ ["eyes"]={ 0x1F440 },
+ ["face blowing a kiss"]={ 0x1F618 },
+ ["face savouring delicious food"]={ 0x1F60B },
+ ["face screaming in fear"]={ 0x1F631 },
+ ["face vomiting"]={ 0x1F92E },
+ ["face with cold sweat"]={ 0x1F613 },
+ ["face with hand over mouth"]={ 0x1F92D },
+ ["face with head-bandage"]={ 0x1F915 },
+ ["face with medical mask"]={ 0x1F637 },
+ ["face with monocle"]={ 0x1F9D0 },
+ ["face with open mouth"]={ 0x1F62E },
+ ["face with open mouth & cold sweat"]={ 0x1F630 },
+ ["face with raised eyebrow"]={ 0x1F928 },
+ ["face with rolling eyes"]={ 0x1F644 },
+ ["face with steam from nose"]={ 0x1F624 },
+ ["face with stuck-out tongue"]={ 0x1F61B },
+ ["face with stuck-out tongue & closed eyes"]={ 0x1F61D },
+ ["face with stuck-out tongue & winking eye"]={ 0x1F61C },
+ ["face with symbols over mouth"]={ 0x1F92C },
+ ["face with tears of joy"]={ 0x1F602 },
+ ["face with thermometer"]={ 0x1F912 },
+ ["face without mouth"]={ 0x1F636 },
+ ["factory"]={ 0x1F3ED },
+ ["fairy"]={ 0x1F9DA },
+ ["fairy: dark skin tone"]={ 0x1F9DA, 0x1F3FF },
+ ["fairy: light skin tone"]={ 0x1F9DA, 0x1F3FB },
+ ["fairy: medium skin tone"]={ 0x1F9DA, 0x1F3FD },
+ ["fairy: medium-dark skin tone"]={ 0x1F9DA, 0x1F3FE },
+ ["fairy: medium-light skin tone"]={ 0x1F9DA, 0x1F3FC },
+ ["falkland islands"]={ 0x1F1EB, 0x1F1F0 },
+ ["fallen leaf"]={ 0x1F342 },
+ ["family"]={ 0x1F46A },
+ ["family: man, boy"]={ 0x1F468, 0x200D, 0x1F466 },
+ ["family: man, boy, boy"]={ 0x1F468, 0x200D, 0x1F466, 0x200D, 0x1F466 },
+ ["family: man, girl"]={ 0x1F468, 0x200D, 0x1F467 },
+ ["family: man, girl, boy"]={ 0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F466 },
+ ["family: man, girl, girl"]={ 0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F467 },
+ ["family: man, man, boy"]={ 0x1F468, 0x200D, 0x1F468, 0x200D, 0x1F466 },
+ ["family: man, man, boy, boy"]={ 0x1F468, 0x200D, 0x1F468, 0x200D, 0x1F466, 0x200D, 0x1F466 },
+ ["family: man, man, girl"]={ 0x1F468, 0x200D, 0x1F468, 0x200D, 0x1F467 },
+ ["family: man, man, girl, boy"]={ 0x1F468, 0x200D, 0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F466 },
+ ["family: man, man, girl, girl"]={ 0x1F468, 0x200D, 0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F467 },
+ ["family: man, woman, boy"]={ 0x1F468, 0x200D, 0x1F469, 0x200D, 0x1F466 },
+ ["family: man, woman, boy, boy"]={ 0x1F468, 0x200D, 0x1F469, 0x200D, 0x1F466, 0x200D, 0x1F466 },
+ ["family: man, woman, girl"]={ 0x1F468, 0x200D, 0x1F469, 0x200D, 0x1F467 },
+ ["family: man, woman, girl, boy"]={ 0x1F468, 0x200D, 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466 },
+ ["family: man, woman, girl, girl"]={ 0x1F468, 0x200D, 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467 },
+ ["family: woman, boy"]={ 0x1F469, 0x200D, 0x1F466 },
+ ["family: woman, boy, boy"]={ 0x1F469, 0x200D, 0x1F466, 0x200D, 0x1F466 },
+ ["family: woman, girl"]={ 0x1F469, 0x200D, 0x1F467 },
+ ["family: woman, girl, boy"]={ 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466 },
+ ["family: woman, girl, girl"]={ 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467 },
+ ["family: woman, woman, boy"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F466 },
+ ["family: woman, woman, boy, boy"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F466, 0x200D, 0x1F466 },
+ ["family: woman, woman, girl"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F467 },
+ ["family: woman, woman, girl, boy"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466 },
+ ["family: woman, woman, girl, girl"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467 },
+ ["faroe islands"]={ 0x1F1EB, 0x1F1F4 },
+ ["fast down button"]={ 0x23EC },
+ ["fast reverse button"]={ 0x23EA },
+ ["fast up button"]={ 0x23EB },
+ ["fast-forward button"]={ 0x23E9 },
+ ["fax machine"]={ 0x1F4E0 },
+ ["fearful face"]={ 0x1F628 },
+ ["female sign"]={ 0x2640 },
+ ["ferris wheel"]={ 0x1F3A1 },
+ ["ferry"]={ 0x26F4 },
+ ["field hockey"]={ 0x1F3D1 },
+ ["fiji"]={ 0x1F1EB, 0x1F1EF },
+ ["file cabinet"]={ 0x1F5C4 },
+ ["file folder"]={ 0x1F4C1 },
+ ["film frames"]={ 0x1F39E },
+ ["film projector"]={ 0x1F4FD },
+ ["finland"]={ 0x1F1EB, 0x1F1EE },
+ ["fire"]={ 0x1F525 },
+ ["fire engine"]={ 0x1F692 },
+ ["fireworks"]={ 0x1F386 },
+ ["first quarter moon"]={ 0x1F313 },
+ ["first quarter moon with face"]={ 0x1F31B },
+ ["fish"]={ 0x1F41F },
+ ["fish cake with swirl"]={ 0x1F365 },
+ ["fishing pole"]={ 0x1F3A3 },
+ ["five o’clock"]={ 0x1F554 },
+ ["five-thirty"]={ 0x1F560 },
+ ["flag in hole"]={ 0x26F3 },
+ ["flashlight"]={ 0x1F526 },
+ ["fleur-de-lis"]={ 0x269C },
+ ["flexed biceps"]={ 0x1F4AA },
+ ["flexed biceps: dark skin tone"]={ 0x1F4AA, 0x1F3FF },
+ ["flexed biceps: light skin tone"]={ 0x1F4AA, 0x1F3FB },
+ ["flexed biceps: medium skin tone"]={ 0x1F4AA, 0x1F3FD },
+ ["flexed biceps: medium-dark skin tone"]={ 0x1F4AA, 0x1F3FE },
+ ["flexed biceps: medium-light skin tone"]={ 0x1F4AA, 0x1F3FC },
+ ["floppy disk"]={ 0x1F4BE },
+ ["flower playing cards"]={ 0x1F3B4 },
+ ["flushed face"]={ 0x1F633 },
+ ["flying saucer"]={ 0x1F6F8 },
+ ["fog"]={ 0x1F32B },
+ ["foggy"]={ 0x1F301 },
+ ["folded hands"]={ 0x1F64F },
+ ["folded hands: dark skin tone"]={ 0x1F64F, 0x1F3FF },
+ ["folded hands: light skin tone"]={ 0x1F64F, 0x1F3FB },
+ ["folded hands: medium skin tone"]={ 0x1F64F, 0x1F3FD },
+ ["folded hands: medium-dark skin tone"]={ 0x1F64F, 0x1F3FE },
+ ["folded hands: medium-light skin tone"]={ 0x1F64F, 0x1F3FC },
+ ["footprints"]={ 0x1F463 },
+ ["fork and knife"]={ 0x1F374 },
+ ["fork and knife with plate"]={ 0x1F37D },
+ ["fortune cookie"]={ 0x1F960 },
+ ["fountain"]={ 0x26F2 },
+ ["fountain pen"]={ 0x1F58B },
+ ["four leaf clover"]={ 0x1F340 },
+ ["four o’clock"]={ 0x1F553 },
+ ["four-thirty"]={ 0x1F55F },
+ ["fox face"]={ 0x1F98A },
+ ["framed picture"]={ 0x1F5BC },
+ ["france"]={ 0x1F1EB, 0x1F1F7 },
+ ["free button"]={ 0x1F193 },
+ ["french fries"]={ 0x1F35F },
+ ["french guiana"]={ 0x1F1EC, 0x1F1EB },
+ ["french polynesia"]={ 0x1F1F5, 0x1F1EB },
+ ["french southern territories"]={ 0x1F1F9, 0x1F1EB },
+ ["fried shrimp"]={ 0x1F364 },
+ ["frog face"]={ 0x1F438 },
+ ["front-facing baby chick"]={ 0x1F425 },
+ ["frowning face"]={ 0x2639 },
+ ["frowning face with open mouth"]={ 0x1F626 },
+ ["fuel pump"]={ 0x26FD },
+ ["full moon"]={ 0x1F315 },
+ ["full moon with face"]={ 0x1F31D },
+ ["funeral urn"]={ 0x26B1 },
+ ["gabon"]={ 0x1F1EC, 0x1F1E6 },
+ ["gambia"]={ 0x1F1EC, 0x1F1F2 },
+ ["game die"]={ 0x1F3B2 },
+ ["gear"]={ 0x2699 },
+ ["gem stone"]={ 0x1F48E },
+ ["gemini"]={ 0x264A },
+ ["genie"]={ 0x1F9DE },
+ ["georgia"]={ 0x1F1EC, 0x1F1EA },
+ ["germany"]={ 0x1F1E9, 0x1F1EA },
+ ["ghana"]={ 0x1F1EC, 0x1F1ED },
+ ["ghost"]={ 0x1F47B },
+ ["gibraltar"]={ 0x1F1EC, 0x1F1EE },
+ ["giraffe"]={ 0x1F992 },
+ ["girl"]={ 0x1F467 },
+ ["girl: dark skin tone"]={ 0x1F467, 0x1F3FF },
+ ["girl: light skin tone"]={ 0x1F467, 0x1F3FB },
+ ["girl: medium skin tone"]={ 0x1F467, 0x1F3FD },
+ ["girl: medium-dark skin tone"]={ 0x1F467, 0x1F3FE },
+ ["girl: medium-light skin tone"]={ 0x1F467, 0x1F3FC },
+ ["glass of milk"]={ 0x1F95B },
+ ["glasses"]={ 0x1F453 },
+ ["globe showing americas"]={ 0x1F30E },
+ ["globe showing asia-australia"]={ 0x1F30F },
+ ["globe showing europe-africa"]={ 0x1F30D },
+ ["globe with meridians"]={ 0x1F310 },
+ ["gloves"]={ 0x1F9E4 },
+ ["glowing star"]={ 0x1F31F },
+ ["goal net"]={ 0x1F945 },
+ ["goat"]={ 0x1F410 },
+ ["goblin"]={ 0x1F47A },
+ ["gorilla"]={ 0x1F98D },
+ ["graduation cap"]={ 0x1F393 },
+ ["grapes"]={ 0x1F347 },
+ ["greece"]={ 0x1F1EC, 0x1F1F7 },
+ ["green apple"]={ 0x1F34F },
+ ["green book"]={ 0x1F4D7 },
+ ["green heart"]={ 0x1F49A },
+ ["green salad"]={ 0x1F957 },
+ ["greenland"]={ 0x1F1EC, 0x1F1F1 },
+ ["grenada"]={ 0x1F1EC, 0x1F1E9 },
+ ["grimacing face"]={ 0x1F62C },
+ ["grinning cat face with smiling eyes"]={ 0x1F638 },
+ ["grinning face"]={ 0x1F600 },
+ ["grinning face with smiling eyes"]={ 0x1F601 },
+ ["growing heart"]={ 0x1F497 },
+ ["guadeloupe"]={ 0x1F1EC, 0x1F1F5 },
+ ["guam"]={ 0x1F1EC, 0x1F1FA },
+ ["guard"]={ 0x1F482 },
+ ["guard: dark skin tone"]={ 0x1F482, 0x1F3FF },
+ ["guard: light skin tone"]={ 0x1F482, 0x1F3FB },
+ ["guard: medium skin tone"]={ 0x1F482, 0x1F3FD },
+ ["guard: medium-dark skin tone"]={ 0x1F482, 0x1F3FE },
+ ["guard: medium-light skin tone"]={ 0x1F482, 0x1F3FC },
+ ["guatemala"]={ 0x1F1EC, 0x1F1F9 },
+ ["guernsey"]={ 0x1F1EC, 0x1F1EC },
+ ["guinea"]={ 0x1F1EC, 0x1F1F3 },
+ ["guinea-bissau"]={ 0x1F1EC, 0x1F1FC },
+ ["guitar"]={ 0x1F3B8 },
+ ["guyana"]={ 0x1F1EC, 0x1F1FE },
+ ["haiti"]={ 0x1F1ED, 0x1F1F9 },
+ ["hamburger"]={ 0x1F354 },
+ ["hammer"]={ 0x1F528 },
+ ["hammer and pick"]={ 0x2692 },
+ ["hammer and wrench"]={ 0x1F6E0 },
+ ["hamster face"]={ 0x1F439 },
+ ["handbag"]={ 0x1F45C },
+ ["handshake"]={ 0x1F91D },
+ ["hatching chick"]={ 0x1F423 },
+ ["headphone"]={ 0x1F3A7 },
+ ["hear-no-evil monkey"]={ 0x1F649 },
+ ["heard & mcdonald islands"]={ 0x1F1ED, 0x1F1F2 },
+ ["heart decoration"]={ 0x1F49F },
+ ["heart suit"]={ 0x2665 },
+ ["heart with arrow"]={ 0x1F498 },
+ ["heart with ribbon"]={ 0x1F49D },
+ ["heavy check mark"]={ 0x2714 },
+ ["heavy division sign"]={ 0x2797 },
+ ["heavy dollar sign"]={ 0x1F4B2 },
+ ["heavy heart exclamation"]={ 0x2763 },
+ ["heavy large circle"]={ 0x2B55 },
+ ["heavy minus sign"]={ 0x2796 },
+ ["heavy multiplication x"]={ 0x2716 },
+ ["heavy plus sign"]={ 0x2795 },
+ ["hedgehog"]={ 0x1F994 },
+ ["helicopter"]={ 0x1F681 },
+ ["herb"]={ 0x1F33F },
+ ["hibiscus"]={ 0x1F33A },
+ ["high voltage"]={ 0x26A1 },
+ ["high-heeled shoe"]={ 0x1F460 },
+ ["high-speed train"]={ 0x1F684 },
+ ["high-speed train with bullet nose"]={ 0x1F685 },
+ ["hole"]={ 0x1F573 },
+ ["honduras"]={ 0x1F1ED, 0x1F1F3 },
+ ["honey pot"]={ 0x1F36F },
+ ["honeybee"]={ 0x1F41D },
+ ["hong kong sar china"]={ 0x1F1ED, 0x1F1F0 },
+ ["horizontal traffic light"]={ 0x1F6A5 },
+ ["horse"]={ 0x1F40E },
+ ["horse face"]={ 0x1F434 },
+ ["horse racing"]={ 0x1F3C7 },
+ ["horse racing: dark skin tone"]={ 0x1F3C7, 0x1F3FF },
+ ["horse racing: light skin tone"]={ 0x1F3C7, 0x1F3FB },
+ ["horse racing: medium skin tone"]={ 0x1F3C7, 0x1F3FD },
+ ["horse racing: medium-dark skin tone"]={ 0x1F3C7, 0x1F3FE },
+ ["horse racing: medium-light skin tone"]={ 0x1F3C7, 0x1F3FC },
+ ["hospital"]={ 0x1F3E5 },
+ ["hot beverage"]={ 0x2615 },
+ ["hot dog"]={ 0x1F32D },
+ ["hot pepper"]={ 0x1F336 },
+ ["hot springs"]={ 0x2668 },
+ ["hotel"]={ 0x1F3E8 },
+ ["hourglass"]={ 0x231B },
+ ["hourglass with flowing sand"]={ 0x23F3 },
+ ["house"]={ 0x1F3E0 },
+ ["house with garden"]={ 0x1F3E1 },
+ ["hugging face"]={ 0x1F917 },
+ ["hundred points"]={ 0x1F4AF },
+ ["hungary"]={ 0x1F1ED, 0x1F1FA },
+ ["hushed face"]={ 0x1F62F },
+ ["ice cream"]={ 0x1F368 },
+ ["ice hockey"]={ 0x1F3D2 },
+ ["ice skate"]={ 0x26F8 },
+ ["iceland"]={ 0x1F1EE, 0x1F1F8 },
+ ["id button"]={ 0x1F194 },
+ ["inbox tray"]={ 0x1F4E5 },
+ ["incoming envelope"]={ 0x1F4E8 },
+ ["index pointing up"]={ 0x261D },
+ ["index pointing up: dark skin tone"]={ 0x261D, 0x1F3FF },
+ ["index pointing up: light skin tone"]={ 0x261D, 0x1F3FB },
+ ["index pointing up: medium skin tone"]={ 0x261D, 0x1F3FD },
+ ["index pointing up: medium-dark skin tone"]={ 0x261D, 0x1F3FE },
+ ["index pointing up: medium-light skin tone"]={ 0x261D, 0x1F3FC },
+ ["india"]={ 0x1F1EE, 0x1F1F3 },
+ ["indonesia"]={ 0x1F1EE, 0x1F1E9 },
+ ["information"]={ 0x2139 },
+ ["input latin letters"]={ 0x1F524 },
+ ["input latin lowercase"]={ 0x1F521 },
+ ["input latin uppercase"]={ 0x1F520 },
+ ["input numbers"]={ 0x1F522 },
+ ["input symbols"]={ 0x1F523 },
+ ["iran"]={ 0x1F1EE, 0x1F1F7 },
+ ["iraq"]={ 0x1F1EE, 0x1F1F6 },
+ ["ireland"]={ 0x1F1EE, 0x1F1EA },
+ ["isle of man"]={ 0x1F1EE, 0x1F1F2 },
+ ["israel"]={ 0x1F1EE, 0x1F1F1 },
+ ["italy"]={ 0x1F1EE, 0x1F1F9 },
+ ["jack-o-lantern"]={ 0x1F383 },
+ ["jamaica"]={ 0x1F1EF, 0x1F1F2 },
+ ["japan"]={ 0x1F1EF, 0x1F1F5 },
+ ["japanese castle"]={ 0x1F3EF },
+ ["japanese dolls"]={ 0x1F38E },
+ ["japanese post office"]={ 0x1F3E3 },
+ ["japanese symbol for beginner"]={ 0x1F530 },
+ ["japanese “acceptable” button"]={ 0x1F251 },
+ ["japanese “application” button"]={ 0x1F238 },
+ ["japanese “bargain” button"]={ 0x1F250 },
+ ["japanese “congratulations” button"]={ 0x3297 },
+ ["japanese “discount” button"]={ 0x1F239 },
+ ["japanese “free of charge” button"]={ 0x1F21A },
+ ["japanese “here” button"]={ 0x1F201 },
+ ["japanese “monthly amount” button"]={ 0x1F237 },
+ ["japanese “no vacancy” button"]={ 0x1F235 },
+ ["japanese “not free of charge” button"]={ 0x1F236 },
+ ["japanese “open for business” button"]={ 0x1F23A },
+ ["japanese “passing grade” button"]={ 0x1F234 },
+ ["japanese “prohibited” button"]={ 0x1F232 },
+ ["japanese “reserved” button"]={ 0x1F22F },
+ ["japanese “secret” button"]={ 0x3299 },
+ ["japanese “service charge” button"]={ 0x1F202 },
+ ["japanese “vacancy” button"]={ 0x1F233 },
+ ["jeans"]={ 0x1F456 },
+ ["jersey"]={ 0x1F1EF, 0x1F1EA },
+ ["joker"]={ 0x1F0CF },
+ ["jordan"]={ 0x1F1EF, 0x1F1F4 },
+ ["joystick"]={ 0x1F579 },
+ ["kaaba"]={ 0x1F54B },
+ ["kazakhstan"]={ 0x1F1F0, 0x1F1FF },
+ ["kenya"]={ 0x1F1F0, 0x1F1EA },
+ ["key"]={ 0x1F511 },
+ ["keyboard"]={ 0x2328 },
+ ["keycap 10"]={ 0x1F51F },
+ ["keycap: 0"]={ 0x30, 0x20E3 },
+ ["keycap: 1"]={ 0x31, 0x20E3 },
+ ["keycap: 2"]={ 0x32, 0x20E3 },
+ ["keycap: 3"]={ 0x33, 0x20E3 },
+ ["keycap: 4"]={ 0x34, 0x20E3 },
+ ["keycap: 5"]={ 0x35, 0x20E3 },
+ ["keycap: 6"]={ 0x36, 0x20E3 },
+ ["keycap: 7"]={ 0x37, 0x20E3 },
+ ["keycap: 8"]={ 0x38, 0x20E3 },
+ ["keycap: 9"]={ 0x39, 0x20E3 },
+ ["keycap: asterisk"]={ 0x2A, 0x20E3 },
+ ["keycap: hash"]={ 0x23, 0x20E3 },
+ ["kick scooter"]={ 0x1F6F4 },
+ ["kimono"]={ 0x1F458 },
+ ["kiribati"]={ 0x1F1F0, 0x1F1EE },
+ ["kiss"]={ 0x1F48F },
+ ["kiss mark"]={ 0x1F48B },
+ ["kiss: man, man"]={ 0x1F468, 0x200D, 0x2764, 0x200D, 0x1F48B, 0x200D, 0x1F468 },
+ ["kiss: woman, man"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F48B, 0x200D, 0x1F468 },
+ ["kiss: woman, woman"]={ 0x1F469, 0x200D, 0x2764, 0x200D, 0x1F48B, 0x200D, 0x1F469 },
+ ["kissing cat face with closed eyes"]={ 0x1F63D },
+ ["kissing face"]={ 0x1F617 },
+ ["kissing face with closed eyes"]={ 0x1F61A },
+ ["kissing face with smiling eyes"]={ 0x1F619 },
+ ["kitchen knife"]={ 0x1F52A },
+ ["kiwi fruit"]={ 0x1F95D },
+ ["koala"]={ 0x1F428 },
+ ["kosovo"]={ 0x1F1FD, 0x1F1F0 },
+ ["kuwait"]={ 0x1F1F0, 0x1F1FC },
+ ["kyrgyzstan"]={ 0x1F1F0, 0x1F1EC },
+ ["label"]={ 0x1F3F7 },
+ ["lady beetle"]={ 0x1F41E },
+ ["laos"]={ 0x1F1F1, 0x1F1E6 },
+ ["laptop computer"]={ 0x1F4BB },
+ ["large blue diamond"]={ 0x1F537 },
+ ["large orange diamond"]={ 0x1F536 },
+ ["last quarter moon"]={ 0x1F317 },
+ ["last quarter moon with face"]={ 0x1F31C },
+ ["last track button"]={ 0x23EE },
+ ["latin cross"]={ 0x271D },
+ ["latvia"]={ 0x1F1F1, 0x1F1FB },
+ ["leaf fluttering in wind"]={ 0x1F343 },
+ ["lebanon"]={ 0x1F1F1, 0x1F1E7 },
+ ["ledger"]={ 0x1F4D2 },
+ ["left arrow"]={ 0x2B05 },
+ ["left arrow curving right"]={ 0x21AA },
+ ["left luggage"]={ 0x1F6C5 },
+ ["left speech bubble"]={ 0x1F5E8 },
+ ["left-facing fist"]={ 0x1F91B },
+ ["left-facing fist: dark skin tone"]={ 0x1F91B, 0x1F3FF },
+ ["left-facing fist: light skin tone"]={ 0x1F91B, 0x1F3FB },
+ ["left-facing fist: medium skin tone"]={ 0x1F91B, 0x1F3FD },
+ ["left-facing fist: medium-dark skin tone"]={ 0x1F91B, 0x1F3FE },
+ ["left-facing fist: medium-light skin tone"]={ 0x1F91B, 0x1F3FC },
+ ["left-pointing magnifying glass"]={ 0x1F50D },
+ ["left-right arrow"]={ 0x2194 },
+ ["lemon"]={ 0x1F34B },
+ ["leo"]={ 0x264C },
+ ["leopard"]={ 0x1F406 },
+ ["lesotho"]={ 0x1F1F1, 0x1F1F8 },
+ ["level slider"]={ 0x1F39A },
+ ["liberia"]={ 0x1F1F1, 0x1F1F7 },
+ ["libra"]={ 0x264E },
+ ["libya"]={ 0x1F1F1, 0x1F1FE },
+ ["liechtenstein"]={ 0x1F1F1, 0x1F1EE },
+ ["light bulb"]={ 0x1F4A1 },
+ ["light rail"]={ 0x1F688 },
+ ["link"]={ 0x1F517 },
+ ["linked paperclips"]={ 0x1F587 },
+ ["lion face"]={ 0x1F981 },
+ ["lipstick"]={ 0x1F484 },
+ ["lithuania"]={ 0x1F1F1, 0x1F1F9 },
+ ["litter in bin sign"]={ 0x1F6AE },
+ ["lizard"]={ 0x1F98E },
+ ["locked"]={ 0x1F512 },
+ ["locked with key"]={ 0x1F510 },
+ ["locked with pen"]={ 0x1F50F },
+ ["locomotive"]={ 0x1F682 },
+ ["lollipop"]={ 0x1F36D },
+ ["loudly crying face"]={ 0x1F62D },
+ ["loudspeaker"]={ 0x1F4E2 },
+ ["love hotel"]={ 0x1F3E9 },
+ ["love letter"]={ 0x1F48C },
+ ["love-you gesture"]={ 0x1F91F },
+ ["love-you gesture: dark skin tone"]={ 0x1F91F, 0x1F3FF },
+ ["love-you gesture: light skin tone"]={ 0x1F91F, 0x1F3FB },
+ ["love-you gesture: medium skin tone"]={ 0x1F91F, 0x1F3FD },
+ ["love-you gesture: medium-dark skin tone"]={ 0x1F91F, 0x1F3FE },
+ ["love-you gesture: medium-light skin tone"]={ 0x1F91F, 0x1F3FC },
+ ["luxembourg"]={ 0x1F1F1, 0x1F1FA },
+ ["lying face"]={ 0x1F925 },
+ ["macau sar china"]={ 0x1F1F2, 0x1F1F4 },
+ ["macedonia"]={ 0x1F1F2, 0x1F1F0 },
+ ["madagascar"]={ 0x1F1F2, 0x1F1EC },
+ ["mage"]={ 0x1F9D9 },
+ ["mage: dark skin tone"]={ 0x1F9D9, 0x1F3FF },
+ ["mage: light skin tone"]={ 0x1F9D9, 0x1F3FB },
+ ["mage: medium skin tone"]={ 0x1F9D9, 0x1F3FD },
+ ["mage: medium-dark skin tone"]={ 0x1F9D9, 0x1F3FE },
+ ["mage: medium-light skin tone"]={ 0x1F9D9, 0x1F3FC },
+ ["mahjong red dragon"]={ 0x1F004 },
+ ["malawi"]={ 0x1F1F2, 0x1F1FC },
+ ["malaysia"]={ 0x1F1F2, 0x1F1FE },
+ ["maldives"]={ 0x1F1F2, 0x1F1FB },
+ ["male sign"]={ 0x2642 },
+ ["mali"]={ 0x1F1F2, 0x1F1F1 },
+ ["malta"]={ 0x1F1F2, 0x1F1F9 },
+ ["man"]={ 0x1F468 },
+ ["man and woman holding hands"]={ 0x1F46B },
+ ["man artist"]={ 0x1F468, 0x200D, 0x1F3A8 },
+ ["man artist: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F3A8 },
+ ["man artist: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F3A8 },
+ ["man artist: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F3A8 },
+ ["man artist: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F3A8 },
+ ["man artist: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F3A8 },
+ ["man astronaut"]={ 0x1F468, 0x200D, 0x1F680 },
+ ["man astronaut: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F680 },
+ ["man astronaut: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F680 },
+ ["man astronaut: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F680 },
+ ["man astronaut: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F680 },
+ ["man astronaut: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F680 },
+ ["man biking"]={ 0x1F6B4, 0x200D, 0x2642 },
+ ["man biking: dark skin tone"]={ 0x1F6B4, 0x1F3FF, 0x200D, 0x2642 },
+ ["man biking: light skin tone"]={ 0x1F6B4, 0x1F3FB, 0x200D, 0x2642 },
+ ["man biking: medium skin tone"]={ 0x1F6B4, 0x1F3FD, 0x200D, 0x2642 },
+ ["man biking: medium-dark skin tone"]={ 0x1F6B4, 0x1F3FE, 0x200D, 0x2642 },
+ ["man biking: medium-light skin tone"]={ 0x1F6B4, 0x1F3FC, 0x200D, 0x2642 },
+ ["man bouncing ball"]={ 0x26F9, 0x200D, 0x2642 },
+ ["man bouncing ball: dark skin tone"]={ 0x26F9, 0x1F3FF, 0x200D, 0x2642 },
+ ["man bouncing ball: light skin tone"]={ 0x26F9, 0x1F3FB, 0x200D, 0x2642 },
+ ["man bouncing ball: medium skin tone"]={ 0x26F9, 0x1F3FD, 0x200D, 0x2642 },
+ ["man bouncing ball: medium-dark skin tone"]={ 0x26F9, 0x1F3FE, 0x200D, 0x2642 },
+ ["man bouncing ball: medium-light skin tone"]={ 0x26F9, 0x1F3FC, 0x200D, 0x2642 },
+ ["man bowing"]={ 0x1F647, 0x200D, 0x2642 },
+ ["man bowing: dark skin tone"]={ 0x1F647, 0x1F3FF, 0x200D, 0x2642 },
+ ["man bowing: light skin tone"]={ 0x1F647, 0x1F3FB, 0x200D, 0x2642 },
+ ["man bowing: medium skin tone"]={ 0x1F647, 0x1F3FD, 0x200D, 0x2642 },
+ ["man bowing: medium-dark skin tone"]={ 0x1F647, 0x1F3FE, 0x200D, 0x2642 },
+ ["man bowing: medium-light skin tone"]={ 0x1F647, 0x1F3FC, 0x200D, 0x2642 },
+ ["man cartwheeling"]={ 0x1F938, 0x200D, 0x2642 },
+ ["man cartwheeling: dark skin tone"]={ 0x1F938, 0x1F3FF, 0x200D, 0x2642 },
+ ["man cartwheeling: light skin tone"]={ 0x1F938, 0x1F3FB, 0x200D, 0x2642 },
+ ["man cartwheeling: medium skin tone"]={ 0x1F938, 0x1F3FD, 0x200D, 0x2642 },
+ ["man cartwheeling: medium-dark skin tone"]={ 0x1F938, 0x1F3FE, 0x200D, 0x2642 },
+ ["man cartwheeling: medium-light skin tone"]={ 0x1F938, 0x1F3FC, 0x200D, 0x2642 },
+ ["man climbing"]={ 0x1F9D7, 0x200D, 0x2642 },
+ ["man climbing: dark skin tone"]={ 0x1F9D7, 0x1F3FF, 0x200D, 0x2642 },
+ ["man climbing: light skin tone"]={ 0x1F9D7, 0x1F3FB, 0x200D, 0x2642 },
+ ["man climbing: medium skin tone"]={ 0x1F9D7, 0x1F3FD, 0x200D, 0x2642 },
+ ["man climbing: medium-dark skin tone"]={ 0x1F9D7, 0x1F3FE, 0x200D, 0x2642 },
+ ["man climbing: medium-light skin tone"]={ 0x1F9D7, 0x1F3FC, 0x200D, 0x2642 },
+ ["man construction worker"]={ 0x1F477, 0x200D, 0x2642 },
+ ["man construction worker: dark skin tone"]={ 0x1F477, 0x1F3FF, 0x200D, 0x2642 },
+ ["man construction worker: light skin tone"]={ 0x1F477, 0x1F3FB, 0x200D, 0x2642 },
+ ["man construction worker: medium skin tone"]={ 0x1F477, 0x1F3FD, 0x200D, 0x2642 },
+ ["man construction worker: medium-dark skin tone"]={ 0x1F477, 0x1F3FE, 0x200D, 0x2642 },
+ ["man construction worker: medium-light skin tone"]={ 0x1F477, 0x1F3FC, 0x200D, 0x2642 },
+ ["man cook"]={ 0x1F468, 0x200D, 0x1F373 },
+ ["man cook: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F373 },
+ ["man cook: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F373 },
+ ["man cook: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F373 },
+ ["man cook: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F373 },
+ ["man cook: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F373 },
+ ["man dancing"]={ 0x1F57A },
+ ["man dancing: dark skin tone"]={ 0x1F57A, 0x1F3FF },
+ ["man dancing: light skin tone"]={ 0x1F57A, 0x1F3FB },
+ ["man dancing: medium skin tone"]={ 0x1F57A, 0x1F3FD },
+ ["man dancing: medium-dark skin tone"]={ 0x1F57A, 0x1F3FE },
+ ["man dancing: medium-light skin tone"]={ 0x1F57A, 0x1F3FC },
+ ["man detective"]={ 0x1F575, 0x200D, 0x2642 },
+ ["man detective: dark skin tone"]={ 0x1F575, 0x1F3FF, 0x200D, 0x2642 },
+ ["man detective: light skin tone"]={ 0x1F575, 0x1F3FB, 0x200D, 0x2642 },
+ ["man detective: medium skin tone"]={ 0x1F575, 0x1F3FD, 0x200D, 0x2642 },
+ ["man detective: medium-dark skin tone"]={ 0x1F575, 0x1F3FE, 0x200D, 0x2642 },
+ ["man detective: medium-light skin tone"]={ 0x1F575, 0x1F3FC, 0x200D, 0x2642 },
+ ["man elf"]={ 0x1F9DD, 0x200D, 0x2642 },
+ ["man elf: dark skin tone"]={ 0x1F9DD, 0x1F3FF, 0x200D, 0x2642 },
+ ["man elf: light skin tone"]={ 0x1F9DD, 0x1F3FB, 0x200D, 0x2642 },
+ ["man elf: medium skin tone"]={ 0x1F9DD, 0x1F3FD, 0x200D, 0x2642 },
+ ["man elf: medium-dark skin tone"]={ 0x1F9DD, 0x1F3FE, 0x200D, 0x2642 },
+ ["man elf: medium-light skin tone"]={ 0x1F9DD, 0x1F3FC, 0x200D, 0x2642 },
+ ["man facepalming"]={ 0x1F926, 0x200D, 0x2642 },
+ ["man facepalming: dark skin tone"]={ 0x1F926, 0x1F3FF, 0x200D, 0x2642 },
+ ["man facepalming: light skin tone"]={ 0x1F926, 0x1F3FB, 0x200D, 0x2642 },
+ ["man facepalming: medium skin tone"]={ 0x1F926, 0x1F3FD, 0x200D, 0x2642 },
+ ["man facepalming: medium-dark skin tone"]={ 0x1F926, 0x1F3FE, 0x200D, 0x2642 },
+ ["man facepalming: medium-light skin tone"]={ 0x1F926, 0x1F3FC, 0x200D, 0x2642 },
+ ["man factory worker"]={ 0x1F468, 0x200D, 0x1F3ED },
+ ["man factory worker: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F3ED },
+ ["man factory worker: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F3ED },
+ ["man factory worker: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F3ED },
+ ["man factory worker: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F3ED },
+ ["man factory worker: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F3ED },
+ ["man fairy"]={ 0x1F9DA, 0x200D, 0x2642 },
+ ["man fairy: dark skin tone"]={ 0x1F9DA, 0x1F3FF, 0x200D, 0x2642 },
+ ["man fairy: light skin tone"]={ 0x1F9DA, 0x1F3FB, 0x200D, 0x2642 },
+ ["man fairy: medium skin tone"]={ 0x1F9DA, 0x1F3FD, 0x200D, 0x2642 },
+ ["man fairy: medium-dark skin tone"]={ 0x1F9DA, 0x1F3FE, 0x200D, 0x2642 },
+ ["man fairy: medium-light skin tone"]={ 0x1F9DA, 0x1F3FC, 0x200D, 0x2642 },
+ ["man farmer"]={ 0x1F468, 0x200D, 0x1F33E },
+ ["man farmer: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F33E },
+ ["man farmer: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F33E },
+ ["man farmer: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F33E },
+ ["man farmer: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F33E },
+ ["man farmer: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F33E },
+ ["man firefighter"]={ 0x1F468, 0x200D, 0x1F692 },
+ ["man firefighter: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F692 },
+ ["man firefighter: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F692 },
+ ["man firefighter: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F692 },
+ ["man firefighter: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F692 },
+ ["man firefighter: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F692 },
+ ["man frowning"]={ 0x1F64D, 0x200D, 0x2642 },
+ ["man frowning: dark skin tone"]={ 0x1F64D, 0x1F3FF, 0x200D, 0x2642 },
+ ["man frowning: light skin tone"]={ 0x1F64D, 0x1F3FB, 0x200D, 0x2642 },
+ ["man frowning: medium skin tone"]={ 0x1F64D, 0x1F3FD, 0x200D, 0x2642 },
+ ["man frowning: medium-dark skin tone"]={ 0x1F64D, 0x1F3FE, 0x200D, 0x2642 },
+ ["man frowning: medium-light skin tone"]={ 0x1F64D, 0x1F3FC, 0x200D, 0x2642 },
+ ["man genie"]={ 0x1F9DE, 0x200D, 0x2642 },
+ ["man gesturing no"]={ 0x1F645, 0x200D, 0x2642 },
+ ["man gesturing no: dark skin tone"]={ 0x1F645, 0x1F3FF, 0x200D, 0x2642 },
+ ["man gesturing no: light skin tone"]={ 0x1F645, 0x1F3FB, 0x200D, 0x2642 },
+ ["man gesturing no: medium skin tone"]={ 0x1F645, 0x1F3FD, 0x200D, 0x2642 },
+ ["man gesturing no: medium-dark skin tone"]={ 0x1F645, 0x1F3FE, 0x200D, 0x2642 },
+ ["man gesturing no: medium-light skin tone"]={ 0x1F645, 0x1F3FC, 0x200D, 0x2642 },
+ ["man gesturing ok"]={ 0x1F646, 0x200D, 0x2642 },
+ ["man gesturing ok: dark skin tone"]={ 0x1F646, 0x1F3FF, 0x200D, 0x2642 },
+ ["man gesturing ok: light skin tone"]={ 0x1F646, 0x1F3FB, 0x200D, 0x2642 },
+ ["man gesturing ok: medium skin tone"]={ 0x1F646, 0x1F3FD, 0x200D, 0x2642 },
+ ["man gesturing ok: medium-dark skin tone"]={ 0x1F646, 0x1F3FE, 0x200D, 0x2642 },
+ ["man gesturing ok: medium-light skin tone"]={ 0x1F646, 0x1F3FC, 0x200D, 0x2642 },
+ ["man getting haircut"]={ 0x1F487, 0x200D, 0x2642 },
+ ["man getting haircut: dark skin tone"]={ 0x1F487, 0x1F3FF, 0x200D, 0x2642 },
+ ["man getting haircut: light skin tone"]={ 0x1F487, 0x1F3FB, 0x200D, 0x2642 },
+ ["man getting haircut: medium skin tone"]={ 0x1F487, 0x1F3FD, 0x200D, 0x2642 },
+ ["man getting haircut: medium-dark skin tone"]={ 0x1F487, 0x1F3FE, 0x200D, 0x2642 },
+ ["man getting haircut: medium-light skin tone"]={ 0x1F487, 0x1F3FC, 0x200D, 0x2642 },
+ ["man getting massage"]={ 0x1F486, 0x200D, 0x2642 },
+ ["man getting massage: dark skin tone"]={ 0x1F486, 0x1F3FF, 0x200D, 0x2642 },
+ ["man getting massage: light skin tone"]={ 0x1F486, 0x1F3FB, 0x200D, 0x2642 },
+ ["man getting massage: medium skin tone"]={ 0x1F486, 0x1F3FD, 0x200D, 0x2642 },
+ ["man getting massage: medium-dark skin tone"]={ 0x1F486, 0x1F3FE, 0x200D, 0x2642 },
+ ["man getting massage: medium-light skin tone"]={ 0x1F486, 0x1F3FC, 0x200D, 0x2642 },
+ ["man golfing"]={ 0x1F3CC, 0x200D, 0x2642 },
+ ["man golfing: dark skin tone"]={ 0x1F3CC, 0x1F3FF, 0x200D, 0x2642 },
+ ["man golfing: light skin tone"]={ 0x1F3CC, 0x1F3FB, 0x200D, 0x2642 },
+ ["man golfing: medium skin tone"]={ 0x1F3CC, 0x1F3FD, 0x200D, 0x2642 },
+ ["man golfing: medium-dark skin tone"]={ 0x1F3CC, 0x1F3FE, 0x200D, 0x2642 },
+ ["man golfing: medium-light skin tone"]={ 0x1F3CC, 0x1F3FC, 0x200D, 0x2642 },
+ ["man guard"]={ 0x1F482, 0x200D, 0x2642 },
+ ["man guard: dark skin tone"]={ 0x1F482, 0x1F3FF, 0x200D, 0x2642 },
+ ["man guard: light skin tone"]={ 0x1F482, 0x1F3FB, 0x200D, 0x2642 },
+ ["man guard: medium skin tone"]={ 0x1F482, 0x1F3FD, 0x200D, 0x2642 },
+ ["man guard: medium-dark skin tone"]={ 0x1F482, 0x1F3FE, 0x200D, 0x2642 },
+ ["man guard: medium-light skin tone"]={ 0x1F482, 0x1F3FC, 0x200D, 0x2642 },
+ ["man health worker"]={ 0x1F468, 0x200D, 0x2695 },
+ ["man health worker: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x2695 },
+ ["man health worker: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x2695 },
+ ["man health worker: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x2695 },
+ ["man health worker: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x2695 },
+ ["man health worker: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x2695 },
+ ["man in business suit levitating"]={ 0x1F574 },
+ ["man in business suit levitating: dark skin tone"]={ 0x1F574, 0x1F3FF },
+ ["man in business suit levitating: light skin tone"]={ 0x1F574, 0x1F3FB },
+ ["man in business suit levitating: medium skin tone"]={ 0x1F574, 0x1F3FD },
+ ["man in business suit levitating: medium-dark skin tone"]={ 0x1F574, 0x1F3FE },
+ ["man in business suit levitating: medium-light skin tone"]={ 0x1F574, 0x1F3FC },
+ ["man in lotus position"]={ 0x1F9D8, 0x200D, 0x2642 },
+ ["man in lotus position: dark skin tone"]={ 0x1F9D8, 0x1F3FF, 0x200D, 0x2642 },
+ ["man in lotus position: light skin tone"]={ 0x1F9D8, 0x1F3FB, 0x200D, 0x2642 },
+ ["man in lotus position: medium skin tone"]={ 0x1F9D8, 0x1F3FD, 0x200D, 0x2642 },
+ ["man in lotus position: medium-dark skin tone"]={ 0x1F9D8, 0x1F3FE, 0x200D, 0x2642 },
+ ["man in lotus position: medium-light skin tone"]={ 0x1F9D8, 0x1F3FC, 0x200D, 0x2642 },
+ ["man in steamy room"]={ 0x1F9D6, 0x200D, 0x2642 },
+ ["man in steamy room: dark skin tone"]={ 0x1F9D6, 0x1F3FF, 0x200D, 0x2642 },
+ ["man in steamy room: light skin tone"]={ 0x1F9D6, 0x1F3FB, 0x200D, 0x2642 },
+ ["man in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD, 0x200D, 0x2642 },
+ ["man in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE, 0x200D, 0x2642 },
+ ["man in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC, 0x200D, 0x2642 },
+ ["man in tuxedo"]={ 0x1F935 },
+ ["man in tuxedo: dark skin tone"]={ 0x1F935, 0x1F3FF },
+ ["man in tuxedo: light skin tone"]={ 0x1F935, 0x1F3FB },
+ ["man in tuxedo: medium skin tone"]={ 0x1F935, 0x1F3FD },
+ ["man in tuxedo: medium-dark skin tone"]={ 0x1F935, 0x1F3FE },
+ ["man in tuxedo: medium-light skin tone"]={ 0x1F935, 0x1F3FC },
+ ["man judge"]={ 0x1F468, 0x200D, 0x2696 },
+ ["man judge: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x2696 },
+ ["man judge: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x2696 },
+ ["man judge: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x2696 },
+ ["man judge: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x2696 },
+ ["man judge: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x2696 },
+ ["man juggling"]={ 0x1F939, 0x200D, 0x2642 },
+ ["man juggling: dark skin tone"]={ 0x1F939, 0x1F3FF, 0x200D, 0x2642 },
+ ["man juggling: light skin tone"]={ 0x1F939, 0x1F3FB, 0x200D, 0x2642 },
+ ["man juggling: medium skin tone"]={ 0x1F939, 0x1F3FD, 0x200D, 0x2642 },
+ ["man juggling: medium-dark skin tone"]={ 0x1F939, 0x1F3FE, 0x200D, 0x2642 },
+ ["man juggling: medium-light skin tone"]={ 0x1F939, 0x1F3FC, 0x200D, 0x2642 },
+ ["man lifting weights"]={ 0x1F3CB, 0x200D, 0x2642 },
+ ["man lifting weights: dark skin tone"]={ 0x1F3CB, 0x1F3FF, 0x200D, 0x2642 },
+ ["man lifting weights: light skin tone"]={ 0x1F3CB, 0x1F3FB, 0x200D, 0x2642 },
+ ["man lifting weights: medium skin tone"]={ 0x1F3CB, 0x1F3FD, 0x200D, 0x2642 },
+ ["man lifting weights: medium-dark skin tone"]={ 0x1F3CB, 0x1F3FE, 0x200D, 0x2642 },
+ ["man lifting weights: medium-light skin tone"]={ 0x1F3CB, 0x1F3FC, 0x200D, 0x2642 },
+ ["man mage"]={ 0x1F9D9, 0x200D, 0x2642 },
+ ["man mage: dark skin tone"]={ 0x1F9D9, 0x1F3FF, 0x200D, 0x2642 },
+ ["man mage: light skin tone"]={ 0x1F9D9, 0x1F3FB, 0x200D, 0x2642 },
+ ["man mage: medium skin tone"]={ 0x1F9D9, 0x1F3FD, 0x200D, 0x2642 },
+ ["man mage: medium-dark skin tone"]={ 0x1F9D9, 0x1F3FE, 0x200D, 0x2642 },
+ ["man mage: medium-light skin tone"]={ 0x1F9D9, 0x1F3FC, 0x200D, 0x2642 },
+ ["man mechanic"]={ 0x1F468, 0x200D, 0x1F527 },
+ ["man mechanic: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F527 },
+ ["man mechanic: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F527 },
+ ["man mechanic: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F527 },
+ ["man mechanic: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F527 },
+ ["man mechanic: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F527 },
+ ["man mountain biking"]={ 0x1F6B5, 0x200D, 0x2642 },
+ ["man mountain biking: dark skin tone"]={ 0x1F6B5, 0x1F3FF, 0x200D, 0x2642 },
+ ["man mountain biking: light skin tone"]={ 0x1F6B5, 0x1F3FB, 0x200D, 0x2642 },
+ ["man mountain biking: medium skin tone"]={ 0x1F6B5, 0x1F3FD, 0x200D, 0x2642 },
+ ["man mountain biking: medium-dark skin tone"]={ 0x1F6B5, 0x1F3FE, 0x200D, 0x2642 },
+ ["man mountain biking: medium-light skin tone"]={ 0x1F6B5, 0x1F3FC, 0x200D, 0x2642 },
+ ["man office worker"]={ 0x1F468, 0x200D, 0x1F4BC },
+ ["man office worker: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F4BC },
+ ["man office worker: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F4BC },
+ ["man office worker: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F4BC },
+ ["man office worker: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F4BC },
+ ["man office worker: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F4BC },
+ ["man pilot"]={ 0x1F468, 0x200D, 0x2708 },
+ ["man pilot: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x2708 },
+ ["man pilot: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x2708 },
+ ["man pilot: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x2708 },
+ ["man pilot: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x2708 },
+ ["man pilot: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x2708 },
+ ["man playing handball"]={ 0x1F93E, 0x200D, 0x2642 },
+ ["man playing handball: dark skin tone"]={ 0x1F93E, 0x1F3FF, 0x200D, 0x2642 },
+ ["man playing handball: light skin tone"]={ 0x1F93E, 0x1F3FB, 0x200D, 0x2642 },
+ ["man playing handball: medium skin tone"]={ 0x1F93E, 0x1F3FD, 0x200D, 0x2642 },
+ ["man playing handball: medium-dark skin tone"]={ 0x1F93E, 0x1F3FE, 0x200D, 0x2642 },
+ ["man playing handball: medium-light skin tone"]={ 0x1F93E, 0x1F3FC, 0x200D, 0x2642 },
+ ["man playing water polo"]={ 0x1F93D, 0x200D, 0x2642 },
+ ["man playing water polo: dark skin tone"]={ 0x1F93D, 0x1F3FF, 0x200D, 0x2642 },
+ ["man playing water polo: light skin tone"]={ 0x1F93D, 0x1F3FB, 0x200D, 0x2642 },
+ ["man playing water polo: medium skin tone"]={ 0x1F93D, 0x1F3FD, 0x200D, 0x2642 },
+ ["man playing water polo: medium-dark skin tone"]={ 0x1F93D, 0x1F3FE, 0x200D, 0x2642 },
+ ["man playing water polo: medium-light skin tone"]={ 0x1F93D, 0x1F3FC, 0x200D, 0x2642 },
+ ["man police officer"]={ 0x1F46E, 0x200D, 0x2642 },
+ ["man police officer: dark skin tone"]={ 0x1F46E, 0x1F3FF, 0x200D, 0x2642 },
+ ["man police officer: light skin tone"]={ 0x1F46E, 0x1F3FB, 0x200D, 0x2642 },
+ ["man police officer: medium skin tone"]={ 0x1F46E, 0x1F3FD, 0x200D, 0x2642 },
+ ["man police officer: medium-dark skin tone"]={ 0x1F46E, 0x1F3FE, 0x200D, 0x2642 },
+ ["man police officer: medium-light skin tone"]={ 0x1F46E, 0x1F3FC, 0x200D, 0x2642 },
+ ["man pouting"]={ 0x1F64E, 0x200D, 0x2642 },
+ ["man pouting: dark skin tone"]={ 0x1F64E, 0x1F3FF, 0x200D, 0x2642 },
+ ["man pouting: light skin tone"]={ 0x1F64E, 0x1F3FB, 0x200D, 0x2642 },
+ ["man pouting: medium skin tone"]={ 0x1F64E, 0x1F3FD, 0x200D, 0x2642 },
+ ["man pouting: medium-dark skin tone"]={ 0x1F64E, 0x1F3FE, 0x200D, 0x2642 },
+ ["man pouting: medium-light skin tone"]={ 0x1F64E, 0x1F3FC, 0x200D, 0x2642 },
+ ["man raising hand"]={ 0x1F64B, 0x200D, 0x2642 },
+ ["man raising hand: dark skin tone"]={ 0x1F64B, 0x1F3FF, 0x200D, 0x2642 },
+ ["man raising hand: light skin tone"]={ 0x1F64B, 0x1F3FB, 0x200D, 0x2642 },
+ ["man raising hand: medium skin tone"]={ 0x1F64B, 0x1F3FD, 0x200D, 0x2642 },
+ ["man raising hand: medium-dark skin tone"]={ 0x1F64B, 0x1F3FE, 0x200D, 0x2642 },
+ ["man raising hand: medium-light skin tone"]={ 0x1F64B, 0x1F3FC, 0x200D, 0x2642 },
+ ["man rowing boat"]={ 0x1F6A3, 0x200D, 0x2642 },
+ ["man rowing boat: dark skin tone"]={ 0x1F6A3, 0x1F3FF, 0x200D, 0x2642 },
+ ["man rowing boat: light skin tone"]={ 0x1F6A3, 0x1F3FB, 0x200D, 0x2642 },
+ ["man rowing boat: medium skin tone"]={ 0x1F6A3, 0x1F3FD, 0x200D, 0x2642 },
+ ["man rowing boat: medium-dark skin tone"]={ 0x1F6A3, 0x1F3FE, 0x200D, 0x2642 },
+ ["man rowing boat: medium-light skin tone"]={ 0x1F6A3, 0x1F3FC, 0x200D, 0x2642 },
+ ["man running"]={ 0x1F3C3, 0x200D, 0x2642 },
+ ["man running: dark skin tone"]={ 0x1F3C3, 0x1F3FF, 0x200D, 0x2642 },
+ ["man running: light skin tone"]={ 0x1F3C3, 0x1F3FB, 0x200D, 0x2642 },
+ ["man running: medium skin tone"]={ 0x1F3C3, 0x1F3FD, 0x200D, 0x2642 },
+ ["man running: medium-dark skin tone"]={ 0x1F3C3, 0x1F3FE, 0x200D, 0x2642 },
+ ["man running: medium-light skin tone"]={ 0x1F3C3, 0x1F3FC, 0x200D, 0x2642 },
+ ["man scientist"]={ 0x1F468, 0x200D, 0x1F52C },
+ ["man scientist: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F52C },
+ ["man scientist: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F52C },
+ ["man scientist: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F52C },
+ ["man scientist: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F52C },
+ ["man scientist: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F52C },
+ ["man shrugging"]={ 0x1F937, 0x200D, 0x2642 },
+ ["man shrugging: dark skin tone"]={ 0x1F937, 0x1F3FF, 0x200D, 0x2642 },
+ ["man shrugging: light skin tone"]={ 0x1F937, 0x1F3FB, 0x200D, 0x2642 },
+ ["man shrugging: medium skin tone"]={ 0x1F937, 0x1F3FD, 0x200D, 0x2642 },
+ ["man shrugging: medium-dark skin tone"]={ 0x1F937, 0x1F3FE, 0x200D, 0x2642 },
+ ["man shrugging: medium-light skin tone"]={ 0x1F937, 0x1F3FC, 0x200D, 0x2642 },
+ ["man singer"]={ 0x1F468, 0x200D, 0x1F3A4 },
+ ["man singer: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F3A4 },
+ ["man singer: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F3A4 },
+ ["man singer: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F3A4 },
+ ["man singer: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F3A4 },
+ ["man singer: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F3A4 },
+ ["man student"]={ 0x1F468, 0x200D, 0x1F393 },
+ ["man student: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F393 },
+ ["man student: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F393 },
+ ["man student: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F393 },
+ ["man student: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F393 },
+ ["man student: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F393 },
+ ["man surfing"]={ 0x1F3C4, 0x200D, 0x2642 },
+ ["man surfing: dark skin tone"]={ 0x1F3C4, 0x1F3FF, 0x200D, 0x2642 },
+ ["man surfing: light skin tone"]={ 0x1F3C4, 0x1F3FB, 0x200D, 0x2642 },
+ ["man surfing: medium skin tone"]={ 0x1F3C4, 0x1F3FD, 0x200D, 0x2642 },
+ ["man surfing: medium-dark skin tone"]={ 0x1F3C4, 0x1F3FE, 0x200D, 0x2642 },
+ ["man surfing: medium-light skin tone"]={ 0x1F3C4, 0x1F3FC, 0x200D, 0x2642 },
+ ["man swimming"]={ 0x1F3CA, 0x200D, 0x2642 },
+ ["man swimming: dark skin tone"]={ 0x1F3CA, 0x1F3FF, 0x200D, 0x2642 },
+ ["man swimming: light skin tone"]={ 0x1F3CA, 0x1F3FB, 0x200D, 0x2642 },
+ ["man swimming: medium skin tone"]={ 0x1F3CA, 0x1F3FD, 0x200D, 0x2642 },
+ ["man swimming: medium-dark skin tone"]={ 0x1F3CA, 0x1F3FE, 0x200D, 0x2642 },
+ ["man swimming: medium-light skin tone"]={ 0x1F3CA, 0x1F3FC, 0x200D, 0x2642 },
+ ["man teacher"]={ 0x1F468, 0x200D, 0x1F3EB },
+ ["man teacher: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F3EB },
+ ["man teacher: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F3EB },
+ ["man teacher: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F3EB },
+ ["man teacher: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F3EB },
+ ["man teacher: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F3EB },
+ ["man technologist"]={ 0x1F468, 0x200D, 0x1F4BB },
+ ["man technologist: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F4BB },
+ ["man technologist: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F4BB },
+ ["man technologist: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F4BB },
+ ["man technologist: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F4BB },
+ ["man technologist: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F4BB },
+ ["man tipping hand"]={ 0x1F481, 0x200D, 0x2642 },
+ ["man tipping hand: dark skin tone"]={ 0x1F481, 0x1F3FF, 0x200D, 0x2642 },
+ ["man tipping hand: light skin tone"]={ 0x1F481, 0x1F3FB, 0x200D, 0x2642 },
+ ["man tipping hand: medium skin tone"]={ 0x1F481, 0x1F3FD, 0x200D, 0x2642 },
+ ["man tipping hand: medium-dark skin tone"]={ 0x1F481, 0x1F3FE, 0x200D, 0x2642 },
+ ["man tipping hand: medium-light skin tone"]={ 0x1F481, 0x1F3FC, 0x200D, 0x2642 },
+ ["man vampire"]={ 0x1F9DB, 0x200D, 0x2642 },
+ ["man vampire: dark skin tone"]={ 0x1F9DB, 0x1F3FF, 0x200D, 0x2642 },
+ ["man vampire: light skin tone"]={ 0x1F9DB, 0x1F3FB, 0x200D, 0x2642 },
+ ["man vampire: medium skin tone"]={ 0x1F9DB, 0x1F3FD, 0x200D, 0x2642 },
+ ["man vampire: medium-dark skin tone"]={ 0x1F9DB, 0x1F3FE, 0x200D, 0x2642 },
+ ["man vampire: medium-light skin tone"]={ 0x1F9DB, 0x1F3FC, 0x200D, 0x2642 },
+ ["man walking"]={ 0x1F6B6, 0x200D, 0x2642 },
+ ["man walking: dark skin tone"]={ 0x1F6B6, 0x1F3FF, 0x200D, 0x2642 },
+ ["man walking: light skin tone"]={ 0x1F6B6, 0x1F3FB, 0x200D, 0x2642 },
+ ["man walking: medium skin tone"]={ 0x1F6B6, 0x1F3FD, 0x200D, 0x2642 },
+ ["man walking: medium-dark skin tone"]={ 0x1F6B6, 0x1F3FE, 0x200D, 0x2642 },
+ ["man walking: medium-light skin tone"]={ 0x1F6B6, 0x1F3FC, 0x200D, 0x2642 },
+ ["man wearing turban"]={ 0x1F473, 0x200D, 0x2642 },
+ ["man wearing turban: dark skin tone"]={ 0x1F473, 0x1F3FF, 0x200D, 0x2642 },
+ ["man wearing turban: light skin tone"]={ 0x1F473, 0x1F3FB, 0x200D, 0x2642 },
+ ["man wearing turban: medium skin tone"]={ 0x1F473, 0x1F3FD, 0x200D, 0x2642 },
+ ["man wearing turban: medium-dark skin tone"]={ 0x1F473, 0x1F3FE, 0x200D, 0x2642 },
+ ["man wearing turban: medium-light skin tone"]={ 0x1F473, 0x1F3FC, 0x200D, 0x2642 },
+ ["man with chinese cap"]={ 0x1F472 },
+ ["man with chinese cap: dark skin tone"]={ 0x1F472, 0x1F3FF },
+ ["man with chinese cap: light skin tone"]={ 0x1F472, 0x1F3FB },
+ ["man with chinese cap: medium skin tone"]={ 0x1F472, 0x1F3FD },
+ ["man with chinese cap: medium-dark skin tone"]={ 0x1F472, 0x1F3FE },
+ ["man with chinese cap: medium-light skin tone"]={ 0x1F472, 0x1F3FC },
+ ["man zombie"]={ 0x1F9DF, 0x200D, 0x2642 },
+ ["man: dark skin tone"]={ 0x1F468, 0x1F3FF },
+ ["man: light skin tone"]={ 0x1F468, 0x1F3FB },
+ ["man: medium skin tone"]={ 0x1F468, 0x1F3FD },
+ ["man: medium-dark skin tone"]={ 0x1F468, 0x1F3FE },
+ ["man: medium-light skin tone"]={ 0x1F468, 0x1F3FC },
+ ["mantelpiece clock"]={ 0x1F570 },
+ ["man’s shoe"]={ 0x1F45E },
+ ["map of japan"]={ 0x1F5FE },
+ ["maple leaf"]={ 0x1F341 },
+ ["marshall islands"]={ 0x1F1F2, 0x1F1ED },
+ ["martial arts uniform"]={ 0x1F94B },
+ ["martinique"]={ 0x1F1F2, 0x1F1F6 },
+ ["mauritania"]={ 0x1F1F2, 0x1F1F7 },
+ ["mauritius"]={ 0x1F1F2, 0x1F1FA },
+ ["mayotte"]={ 0x1F1FE, 0x1F1F9 },
+ ["meat on bone"]={ 0x1F356 },
+ ["medical symbol"]={ 0x2695 },
+ ["megaphone"]={ 0x1F4E3 },
+ ["melon"]={ 0x1F348 },
+ ["memo"]={ 0x1F4DD },
+ ["men with bunny ears partying"]={ 0x1F46F, 0x200D, 0x2642 },
+ ["men wrestling"]={ 0x1F93C, 0x200D, 0x2642 },
+ ["menorah"]={ 0x1F54E },
+ ["men’s room"]={ 0x1F6B9 },
+ ["mermaid"]={ 0x1F9DC, 0x200D, 0x2640 },
+ ["mermaid: dark skin tone"]={ 0x1F9DC, 0x1F3FF, 0x200D, 0x2640 },
+ ["mermaid: light skin tone"]={ 0x1F9DC, 0x1F3FB, 0x200D, 0x2640 },
+ ["mermaid: medium skin tone"]={ 0x1F9DC, 0x1F3FD, 0x200D, 0x2640 },
+ ["mermaid: medium-dark skin tone"]={ 0x1F9DC, 0x1F3FE, 0x200D, 0x2640 },
+ ["mermaid: medium-light skin tone"]={ 0x1F9DC, 0x1F3FC, 0x200D, 0x2640 },
+ ["merman"]={ 0x1F9DC, 0x200D, 0x2642 },
+ ["merman: dark skin tone"]={ 0x1F9DC, 0x1F3FF, 0x200D, 0x2642 },
+ ["merman: light skin tone"]={ 0x1F9DC, 0x1F3FB, 0x200D, 0x2642 },
+ ["merman: medium skin tone"]={ 0x1F9DC, 0x1F3FD, 0x200D, 0x2642 },
+ ["merman: medium-dark skin tone"]={ 0x1F9DC, 0x1F3FE, 0x200D, 0x2642 },
+ ["merman: medium-light skin tone"]={ 0x1F9DC, 0x1F3FC, 0x200D, 0x2642 },
+ ["merperson"]={ 0x1F9DC },
+ ["merperson: dark skin tone"]={ 0x1F9DC, 0x1F3FF },
+ ["merperson: light skin tone"]={ 0x1F9DC, 0x1F3FB },
+ ["merperson: medium skin tone"]={ 0x1F9DC, 0x1F3FD },
+ ["merperson: medium-dark skin tone"]={ 0x1F9DC, 0x1F3FE },
+ ["merperson: medium-light skin tone"]={ 0x1F9DC, 0x1F3FC },
+ ["metro"]={ 0x1F687 },
+ ["mexico"]={ 0x1F1F2, 0x1F1FD },
+ ["micronesia"]={ 0x1F1EB, 0x1F1F2 },
+ ["microphone"]={ 0x1F3A4 },
+ ["microscope"]={ 0x1F52C },
+ ["middle finger"]={ 0x1F595 },
+ ["middle finger: dark skin tone"]={ 0x1F595, 0x1F3FF },
+ ["middle finger: light skin tone"]={ 0x1F595, 0x1F3FB },
+ ["middle finger: medium skin tone"]={ 0x1F595, 0x1F3FD },
+ ["middle finger: medium-dark skin tone"]={ 0x1F595, 0x1F3FE },
+ ["middle finger: medium-light skin tone"]={ 0x1F595, 0x1F3FC },
+ ["military medal"]={ 0x1F396 },
+ ["milky way"]={ 0x1F30C },
+ ["minibus"]={ 0x1F690 },
+ ["moai"]={ 0x1F5FF },
+ ["mobile phone"]={ 0x1F4F1 },
+ ["mobile phone off"]={ 0x1F4F4 },
+ ["mobile phone with arrow"]={ 0x1F4F2 },
+ ["moldova"]={ 0x1F1F2, 0x1F1E9 },
+ ["monaco"]={ 0x1F1F2, 0x1F1E8 },
+ ["money bag"]={ 0x1F4B0 },
+ ["money with wings"]={ 0x1F4B8 },
+ ["money-mouth face"]={ 0x1F911 },
+ ["mongolia"]={ 0x1F1F2, 0x1F1F3 },
+ ["monkey"]={ 0x1F412 },
+ ["monkey face"]={ 0x1F435 },
+ ["monorail"]={ 0x1F69D },
+ ["montenegro"]={ 0x1F1F2, 0x1F1EA },
+ ["montserrat"]={ 0x1F1F2, 0x1F1F8 },
+ ["moon viewing ceremony"]={ 0x1F391 },
+ ["morocco"]={ 0x1F1F2, 0x1F1E6 },
+ ["mosque"]={ 0x1F54C },
+ ["motor boat"]={ 0x1F6E5 },
+ ["motor scooter"]={ 0x1F6F5 },
+ ["motorcycle"]={ 0x1F3CD },
+ ["motorway"]={ 0x1F6E3 },
+ ["mount fuji"]={ 0x1F5FB },
+ ["mountain"]={ 0x26F0 },
+ ["mountain cableway"]={ 0x1F6A0 },
+ ["mountain railway"]={ 0x1F69E },
+ ["mouse"]={ 0x1F401 },
+ ["mouse face"]={ 0x1F42D },
+ ["mouth"]={ 0x1F444 },
+ ["movie camera"]={ 0x1F3A5 },
+ ["mozambique"]={ 0x1F1F2, 0x1F1FF },
+ ["mrs. claus"]={ 0x1F936 },
+ ["mrs. claus: dark skin tone"]={ 0x1F936, 0x1F3FF },
+ ["mrs. claus: light skin tone"]={ 0x1F936, 0x1F3FB },
+ ["mrs. claus: medium skin tone"]={ 0x1F936, 0x1F3FD },
+ ["mrs. claus: medium-dark skin tone"]={ 0x1F936, 0x1F3FE },
+ ["mrs. claus: medium-light skin tone"]={ 0x1F936, 0x1F3FC },
+ ["mushroom"]={ 0x1F344 },
+ ["musical keyboard"]={ 0x1F3B9 },
+ ["musical note"]={ 0x1F3B5 },
+ ["musical notes"]={ 0x1F3B6 },
+ ["musical score"]={ 0x1F3BC },
+ ["muted speaker"]={ 0x1F507 },
+ ["myanmar (burma)"]={ 0x1F1F2, 0x1F1F2 },
+ ["nail polish"]={ 0x1F485 },
+ ["nail polish: dark skin tone"]={ 0x1F485, 0x1F3FF },
+ ["nail polish: light skin tone"]={ 0x1F485, 0x1F3FB },
+ ["nail polish: medium skin tone"]={ 0x1F485, 0x1F3FD },
+ ["nail polish: medium-dark skin tone"]={ 0x1F485, 0x1F3FE },
+ ["nail polish: medium-light skin tone"]={ 0x1F485, 0x1F3FC },
+ ["name badge"]={ 0x1F4DB },
+ ["namibia"]={ 0x1F1F3, 0x1F1E6 },
+ ["national park"]={ 0x1F3DE },
+ ["nauru"]={ 0x1F1F3, 0x1F1F7 },
+ ["nauseated face"]={ 0x1F922 },
+ ["necktie"]={ 0x1F454 },
+ ["nepal"]={ 0x1F1F3, 0x1F1F5 },
+ ["nerd face"]={ 0x1F913 },
+ ["netherlands"]={ 0x1F1F3, 0x1F1F1 },
+ ["neutral face"]={ 0x1F610 },
+ ["new button"]={ 0x1F195 },
+ ["new caledonia"]={ 0x1F1F3, 0x1F1E8 },
+ ["new moon"]={ 0x1F311 },
+ ["new moon face"]={ 0x1F31A },
+ ["new zealand"]={ 0x1F1F3, 0x1F1FF },
+ ["newspaper"]={ 0x1F4F0 },
+ ["next track button"]={ 0x23ED },
+ ["ng button"]={ 0x1F196 },
+ ["nicaragua"]={ 0x1F1F3, 0x1F1EE },
+ ["niger"]={ 0x1F1F3, 0x1F1EA },
+ ["nigeria"]={ 0x1F1F3, 0x1F1EC },
+ ["night with stars"]={ 0x1F303 },
+ ["nine o’clock"]={ 0x1F558 },
+ ["nine-thirty"]={ 0x1F564 },
+ ["niue"]={ 0x1F1F3, 0x1F1FA },
+ ["no bicycles"]={ 0x1F6B3 },
+ ["no entry"]={ 0x26D4 },
+ ["no littering"]={ 0x1F6AF },
+ ["no mobile phones"]={ 0x1F4F5 },
+ ["no one under eighteen"]={ 0x1F51E },
+ ["no pedestrians"]={ 0x1F6B7 },
+ ["no smoking"]={ 0x1F6AD },
+ ["non-potable water"]={ 0x1F6B1 },
+ ["norfolk island"]={ 0x1F1F3, 0x1F1EB },
+ ["north korea"]={ 0x1F1F0, 0x1F1F5 },
+ ["northern mariana islands"]={ 0x1F1F2, 0x1F1F5 },
+ ["norway"]={ 0x1F1F3, 0x1F1F4 },
+ ["nose"]={ 0x1F443 },
+ ["nose: dark skin tone"]={ 0x1F443, 0x1F3FF },
+ ["nose: light skin tone"]={ 0x1F443, 0x1F3FB },
+ ["nose: medium skin tone"]={ 0x1F443, 0x1F3FD },
+ ["nose: medium-dark skin tone"]={ 0x1F443, 0x1F3FE },
+ ["nose: medium-light skin tone"]={ 0x1F443, 0x1F3FC },
+ ["notebook"]={ 0x1F4D3 },
+ ["notebook with decorative cover"]={ 0x1F4D4 },
+ ["nut and bolt"]={ 0x1F529 },
+ ["o button (blood type)"]={ 0x1F17E },
+ ["octopus"]={ 0x1F419 },
+ ["oden"]={ 0x1F362 },
+ ["office building"]={ 0x1F3E2 },
+ ["ogre"]={ 0x1F479 },
+ ["oil drum"]={ 0x1F6E2 },
+ ["ok button"]={ 0x1F197 },
+ ["ok hand"]={ 0x1F44C },
+ ["ok hand: dark skin tone"]={ 0x1F44C, 0x1F3FF },
+ ["ok hand: light skin tone"]={ 0x1F44C, 0x1F3FB },
+ ["ok hand: medium skin tone"]={ 0x1F44C, 0x1F3FD },
+ ["ok hand: medium-dark skin tone"]={ 0x1F44C, 0x1F3FE },
+ ["ok hand: medium-light skin tone"]={ 0x1F44C, 0x1F3FC },
+ ["old key"]={ 0x1F5DD },
+ ["old man"]={ 0x1F474 },
+ ["old man: dark skin tone"]={ 0x1F474, 0x1F3FF },
+ ["old man: light skin tone"]={ 0x1F474, 0x1F3FB },
+ ["old man: medium skin tone"]={ 0x1F474, 0x1F3FD },
+ ["old man: medium-dark skin tone"]={ 0x1F474, 0x1F3FE },
+ ["old man: medium-light skin tone"]={ 0x1F474, 0x1F3FC },
+ ["old woman"]={ 0x1F475 },
+ ["old woman: dark skin tone"]={ 0x1F475, 0x1F3FF },
+ ["old woman: light skin tone"]={ 0x1F475, 0x1F3FB },
+ ["old woman: medium skin tone"]={ 0x1F475, 0x1F3FD },
+ ["old woman: medium-dark skin tone"]={ 0x1F475, 0x1F3FE },
+ ["old woman: medium-light skin tone"]={ 0x1F475, 0x1F3FC },
+ ["older adult"]={ 0x1F9D3 },
+ ["older adult: dark skin tone"]={ 0x1F9D3, 0x1F3FF },
+ ["older adult: light skin tone"]={ 0x1F9D3, 0x1F3FB },
+ ["older adult: medium skin tone"]={ 0x1F9D3, 0x1F3FD },
+ ["older adult: medium-dark skin tone"]={ 0x1F9D3, 0x1F3FE },
+ ["older adult: medium-light skin tone"]={ 0x1F9D3, 0x1F3FC },
+ ["om"]={ 0x1F549 },
+ ["oman"]={ 0x1F1F4, 0x1F1F2 },
+ ["on! arrow"]={ 0x1F51B },
+ ["oncoming automobile"]={ 0x1F698 },
+ ["oncoming bus"]={ 0x1F68D },
+ ["oncoming fist"]={ 0x1F44A },
+ ["oncoming fist: dark skin tone"]={ 0x1F44A, 0x1F3FF },
+ ["oncoming fist: light skin tone"]={ 0x1F44A, 0x1F3FB },
+ ["oncoming fist: medium skin tone"]={ 0x1F44A, 0x1F3FD },
+ ["oncoming fist: medium-dark skin tone"]={ 0x1F44A, 0x1F3FE },
+ ["oncoming fist: medium-light skin tone"]={ 0x1F44A, 0x1F3FC },
+ ["oncoming police car"]={ 0x1F694 },
+ ["oncoming taxi"]={ 0x1F696 },
+ ["one o’clock"]={ 0x1F550 },
+ ["one-thirty"]={ 0x1F55C },
+ ["open book"]={ 0x1F4D6 },
+ ["open file folder"]={ 0x1F4C2 },
+ ["open hands"]={ 0x1F450 },
+ ["open hands: dark skin tone"]={ 0x1F450, 0x1F3FF },
+ ["open hands: light skin tone"]={ 0x1F450, 0x1F3FB },
+ ["open hands: medium skin tone"]={ 0x1F450, 0x1F3FD },
+ ["open hands: medium-dark skin tone"]={ 0x1F450, 0x1F3FE },
+ ["open hands: medium-light skin tone"]={ 0x1F450, 0x1F3FC },
+ ["open mailbox with lowered flag"]={ 0x1F4ED },
+ ["open mailbox with raised flag"]={ 0x1F4EC },
+ ["ophiuchus"]={ 0x26CE },
+ ["optical disk"]={ 0x1F4BF },
+ ["orange book"]={ 0x1F4D9 },
+ ["orange heart"]={ 0x1F9E1 },
+ ["orthodox cross"]={ 0x2626 },
+ ["outbox tray"]={ 0x1F4E4 },
+ ["owl"]={ 0x1F989 },
+ ["ox"]={ 0x1F402 },
+ ["p button"]={ 0x1F17F },
+ ["package"]={ 0x1F4E6 },
+ ["page facing up"]={ 0x1F4C4 },
+ ["page with curl"]={ 0x1F4C3 },
+ ["pager"]={ 0x1F4DF },
+ ["paintbrush"]={ 0x1F58C },
+ ["pakistan"]={ 0x1F1F5, 0x1F1F0 },
+ ["palau"]={ 0x1F1F5, 0x1F1FC },
+ ["palestinian territories"]={ 0x1F1F5, 0x1F1F8 },
+ ["palm tree"]={ 0x1F334 },
+ ["palms up together"]={ 0x1F932 },
+ ["palms up together: dark skin tone"]={ 0x1F932, 0x1F3FF },
+ ["palms up together: light skin tone"]={ 0x1F932, 0x1F3FB },
+ ["palms up together: medium skin tone"]={ 0x1F932, 0x1F3FD },
+ ["palms up together: medium-dark skin tone"]={ 0x1F932, 0x1F3FE },
+ ["palms up together: medium-light skin tone"]={ 0x1F932, 0x1F3FC },
+ ["panama"]={ 0x1F1F5, 0x1F1E6 },
+ ["pancakes"]={ 0x1F95E },
+ ["panda face"]={ 0x1F43C },
+ ["paperclip"]={ 0x1F4CE },
+ ["papua new guinea"]={ 0x1F1F5, 0x1F1EC },
+ ["paraguay"]={ 0x1F1F5, 0x1F1FE },
+ ["part alternation mark"]={ 0x303D },
+ ["party popper"]={ 0x1F389 },
+ ["passenger ship"]={ 0x1F6F3 },
+ ["passport control"]={ 0x1F6C2 },
+ ["pause button"]={ 0x23F8 },
+ ["paw prints"]={ 0x1F43E },
+ ["peace symbol"]={ 0x262E },
+ ["peach"]={ 0x1F351 },
+ ["peanuts"]={ 0x1F95C },
+ ["pear"]={ 0x1F350 },
+ ["pen"]={ 0x1F58A },
+ ["pencil"]={ 0x270F },
+ ["penguin"]={ 0x1F427 },
+ ["pensive face"]={ 0x1F614 },
+ ["people with bunny ears partying"]={ 0x1F46F },
+ ["people wrestling"]={ 0x1F93C },
+ ["performing arts"]={ 0x1F3AD },
+ ["persevering face"]={ 0x1F623 },
+ ["person biking"]={ 0x1F6B4 },
+ ["person biking: dark skin tone"]={ 0x1F6B4, 0x1F3FF },
+ ["person biking: light skin tone"]={ 0x1F6B4, 0x1F3FB },
+ ["person biking: medium skin tone"]={ 0x1F6B4, 0x1F3FD },
+ ["person biking: medium-dark skin tone"]={ 0x1F6B4, 0x1F3FE },
+ ["person biking: medium-light skin tone"]={ 0x1F6B4, 0x1F3FC },
+ ["person bouncing ball"]={ 0x26F9 },
+ ["person bouncing ball: dark skin tone"]={ 0x26F9, 0x1F3FF },
+ ["person bouncing ball: light skin tone"]={ 0x26F9, 0x1F3FB },
+ ["person bouncing ball: medium skin tone"]={ 0x26F9, 0x1F3FD },
+ ["person bouncing ball: medium-dark skin tone"]={ 0x26F9, 0x1F3FE },
+ ["person bouncing ball: medium-light skin tone"]={ 0x26F9, 0x1F3FC },
+ ["person bowing"]={ 0x1F647 },
+ ["person bowing: dark skin tone"]={ 0x1F647, 0x1F3FF },
+ ["person bowing: light skin tone"]={ 0x1F647, 0x1F3FB },
+ ["person bowing: medium skin tone"]={ 0x1F647, 0x1F3FD },
+ ["person bowing: medium-dark skin tone"]={ 0x1F647, 0x1F3FE },
+ ["person bowing: medium-light skin tone"]={ 0x1F647, 0x1F3FC },
+ ["person cartwheeling"]={ 0x1F938 },
+ ["person cartwheeling: dark skin tone"]={ 0x1F938, 0x1F3FF },
+ ["person cartwheeling: light skin tone"]={ 0x1F938, 0x1F3FB },
+ ["person cartwheeling: medium skin tone"]={ 0x1F938, 0x1F3FD },
+ ["person cartwheeling: medium-dark skin tone"]={ 0x1F938, 0x1F3FE },
+ ["person cartwheeling: medium-light skin tone"]={ 0x1F938, 0x1F3FC },
+ ["person climbing"]={ 0x1F9D7 },
+ ["person climbing: dark skin tone"]={ 0x1F9D7, 0x1F3FF },
+ ["person climbing: light skin tone"]={ 0x1F9D7, 0x1F3FB },
+ ["person climbing: medium skin tone"]={ 0x1F9D7, 0x1F3FD },
+ ["person climbing: medium-dark skin tone"]={ 0x1F9D7, 0x1F3FE },
+ ["person climbing: medium-light skin tone"]={ 0x1F9D7, 0x1F3FC },
+ ["person facepalming"]={ 0x1F926 },
+ ["person facepalming: dark skin tone"]={ 0x1F926, 0x1F3FF },
+ ["person facepalming: light skin tone"]={ 0x1F926, 0x1F3FB },
+ ["person facepalming: medium skin tone"]={ 0x1F926, 0x1F3FD },
+ ["person facepalming: medium-dark skin tone"]={ 0x1F926, 0x1F3FE },
+ ["person facepalming: medium-light skin tone"]={ 0x1F926, 0x1F3FC },
+ ["person fencing"]={ 0x1F93A },
+ ["person frowning"]={ 0x1F64D },
+ ["person frowning: dark skin tone"]={ 0x1F64D, 0x1F3FF },
+ ["person frowning: light skin tone"]={ 0x1F64D, 0x1F3FB },
+ ["person frowning: medium skin tone"]={ 0x1F64D, 0x1F3FD },
+ ["person frowning: medium-dark skin tone"]={ 0x1F64D, 0x1F3FE },
+ ["person frowning: medium-light skin tone"]={ 0x1F64D, 0x1F3FC },
+ ["person gesturing no"]={ 0x1F645 },
+ ["person gesturing no: dark skin tone"]={ 0x1F645, 0x1F3FF },
+ ["person gesturing no: light skin tone"]={ 0x1F645, 0x1F3FB },
+ ["person gesturing no: medium skin tone"]={ 0x1F645, 0x1F3FD },
+ ["person gesturing no: medium-dark skin tone"]={ 0x1F645, 0x1F3FE },
+ ["person gesturing no: medium-light skin tone"]={ 0x1F645, 0x1F3FC },
+ ["person gesturing ok"]={ 0x1F646 },
+ ["person gesturing ok: dark skin tone"]={ 0x1F646, 0x1F3FF },
+ ["person gesturing ok: light skin tone"]={ 0x1F646, 0x1F3FB },
+ ["person gesturing ok: medium skin tone"]={ 0x1F646, 0x1F3FD },
+ ["person gesturing ok: medium-dark skin tone"]={ 0x1F646, 0x1F3FE },
+ ["person gesturing ok: medium-light skin tone"]={ 0x1F646, 0x1F3FC },
+ ["person getting haircut"]={ 0x1F487 },
+ ["person getting haircut: dark skin tone"]={ 0x1F487, 0x1F3FF },
+ ["person getting haircut: light skin tone"]={ 0x1F487, 0x1F3FB },
+ ["person getting haircut: medium skin tone"]={ 0x1F487, 0x1F3FD },
+ ["person getting haircut: medium-dark skin tone"]={ 0x1F487, 0x1F3FE },
+ ["person getting haircut: medium-light skin tone"]={ 0x1F487, 0x1F3FC },
+ ["person getting massage"]={ 0x1F486 },
+ ["person getting massage: dark skin tone"]={ 0x1F486, 0x1F3FF },
+ ["person getting massage: light skin tone"]={ 0x1F486, 0x1F3FB },
+ ["person getting massage: medium skin tone"]={ 0x1F486, 0x1F3FD },
+ ["person getting massage: medium-dark skin tone"]={ 0x1F486, 0x1F3FE },
+ ["person getting massage: medium-light skin tone"]={ 0x1F486, 0x1F3FC },
+ ["person golfing"]={ 0x1F3CC },
+ ["person golfing: dark skin tone"]={ 0x1F3CC, 0x1F3FF },
+ ["person golfing: light skin tone"]={ 0x1F3CC, 0x1F3FB },
+ ["person golfing: medium skin tone"]={ 0x1F3CC, 0x1F3FD },
+ ["person golfing: medium-dark skin tone"]={ 0x1F3CC, 0x1F3FE },
+ ["person golfing: medium-light skin tone"]={ 0x1F3CC, 0x1F3FC },
+ ["person in bed"]={ 0x1F6CC },
+ ["person in bed: dark skin tone"]={ 0x1F6CC, 0x1F3FF },
+ ["person in bed: light skin tone"]={ 0x1F6CC, 0x1F3FB },
+ ["person in bed: medium skin tone"]={ 0x1F6CC, 0x1F3FD },
+ ["person in bed: medium-dark skin tone"]={ 0x1F6CC, 0x1F3FE },
+ ["person in bed: medium-light skin tone"]={ 0x1F6CC, 0x1F3FC },
+ ["person in lotus position"]={ 0x1F9D8 },
+ ["person in lotus position: dark skin tone"]={ 0x1F9D8, 0x1F3FF },
+ ["person in lotus position: light skin tone"]={ 0x1F9D8, 0x1F3FB },
+ ["person in lotus position: medium skin tone"]={ 0x1F9D8, 0x1F3FD },
+ ["person in lotus position: medium-dark skin tone"]={ 0x1F9D8, 0x1F3FE },
+ ["person in lotus position: medium-light skin tone"]={ 0x1F9D8, 0x1F3FC },
+ ["person in steamy room"]={ 0x1F9D6 },
+ ["person in steamy room: dark skin tone"]={ 0x1F9D6, 0x1F3FF },
+ ["person in steamy room: light skin tone"]={ 0x1F9D6, 0x1F3FB },
+ ["person in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD },
+ ["person in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE },
+ ["person in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC },
+ ["person juggling"]={ 0x1F939 },
+ ["person juggling: dark skin tone"]={ 0x1F939, 0x1F3FF },
+ ["person juggling: light skin tone"]={ 0x1F939, 0x1F3FB },
+ ["person juggling: medium skin tone"]={ 0x1F939, 0x1F3FD },
+ ["person juggling: medium-dark skin tone"]={ 0x1F939, 0x1F3FE },
+ ["person juggling: medium-light skin tone"]={ 0x1F939, 0x1F3FC },
+ ["person lifting weights"]={ 0x1F3CB },
+ ["person lifting weights: dark skin tone"]={ 0x1F3CB, 0x1F3FF },
+ ["person lifting weights: light skin tone"]={ 0x1F3CB, 0x1F3FB },
+ ["person lifting weights: medium skin tone"]={ 0x1F3CB, 0x1F3FD },
+ ["person lifting weights: medium-dark skin tone"]={ 0x1F3CB, 0x1F3FE },
+ ["person lifting weights: medium-light skin tone"]={ 0x1F3CB, 0x1F3FC },
+ ["person mountain biking"]={ 0x1F6B5 },
+ ["person mountain biking: dark skin tone"]={ 0x1F6B5, 0x1F3FF },
+ ["person mountain biking: light skin tone"]={ 0x1F6B5, 0x1F3FB },
+ ["person mountain biking: medium skin tone"]={ 0x1F6B5, 0x1F3FD },
+ ["person mountain biking: medium-dark skin tone"]={ 0x1F6B5, 0x1F3FE },
+ ["person mountain biking: medium-light skin tone"]={ 0x1F6B5, 0x1F3FC },
+ ["person playing handball"]={ 0x1F93E },
+ ["person playing handball: dark skin tone"]={ 0x1F93E, 0x1F3FF },
+ ["person playing handball: light skin tone"]={ 0x1F93E, 0x1F3FB },
+ ["person playing handball: medium skin tone"]={ 0x1F93E, 0x1F3FD },
+ ["person playing handball: medium-dark skin tone"]={ 0x1F93E, 0x1F3FE },
+ ["person playing handball: medium-light skin tone"]={ 0x1F93E, 0x1F3FC },
+ ["person playing water polo"]={ 0x1F93D },
+ ["person playing water polo: dark skin tone"]={ 0x1F93D, 0x1F3FF },
+ ["person playing water polo: light skin tone"]={ 0x1F93D, 0x1F3FB },
+ ["person playing water polo: medium skin tone"]={ 0x1F93D, 0x1F3FD },
+ ["person playing water polo: medium-dark skin tone"]={ 0x1F93D, 0x1F3FE },
+ ["person playing water polo: medium-light skin tone"]={ 0x1F93D, 0x1F3FC },
+ ["person pouting"]={ 0x1F64E },
+ ["person pouting: dark skin tone"]={ 0x1F64E, 0x1F3FF },
+ ["person pouting: light skin tone"]={ 0x1F64E, 0x1F3FB },
+ ["person pouting: medium skin tone"]={ 0x1F64E, 0x1F3FD },
+ ["person pouting: medium-dark skin tone"]={ 0x1F64E, 0x1F3FE },
+ ["person pouting: medium-light skin tone"]={ 0x1F64E, 0x1F3FC },
+ ["person raising hand"]={ 0x1F64B },
+ ["person raising hand: dark skin tone"]={ 0x1F64B, 0x1F3FF },
+ ["person raising hand: light skin tone"]={ 0x1F64B, 0x1F3FB },
+ ["person raising hand: medium skin tone"]={ 0x1F64B, 0x1F3FD },
+ ["person raising hand: medium-dark skin tone"]={ 0x1F64B, 0x1F3FE },
+ ["person raising hand: medium-light skin tone"]={ 0x1F64B, 0x1F3FC },
+ ["person rowing boat"]={ 0x1F6A3 },
+ ["person rowing boat: dark skin tone"]={ 0x1F6A3, 0x1F3FF },
+ ["person rowing boat: light skin tone"]={ 0x1F6A3, 0x1F3FB },
+ ["person rowing boat: medium skin tone"]={ 0x1F6A3, 0x1F3FD },
+ ["person rowing boat: medium-dark skin tone"]={ 0x1F6A3, 0x1F3FE },
+ ["person rowing boat: medium-light skin tone"]={ 0x1F6A3, 0x1F3FC },
+ ["person running"]={ 0x1F3C3 },
+ ["person running: dark skin tone"]={ 0x1F3C3, 0x1F3FF },
+ ["person running: light skin tone"]={ 0x1F3C3, 0x1F3FB },
+ ["person running: medium skin tone"]={ 0x1F3C3, 0x1F3FD },
+ ["person running: medium-dark skin tone"]={ 0x1F3C3, 0x1F3FE },
+ ["person running: medium-light skin tone"]={ 0x1F3C3, 0x1F3FC },
+ ["person shrugging"]={ 0x1F937 },
+ ["person shrugging: dark skin tone"]={ 0x1F937, 0x1F3FF },
+ ["person shrugging: light skin tone"]={ 0x1F937, 0x1F3FB },
+ ["person shrugging: medium skin tone"]={ 0x1F937, 0x1F3FD },
+ ["person shrugging: medium-dark skin tone"]={ 0x1F937, 0x1F3FE },
+ ["person shrugging: medium-light skin tone"]={ 0x1F937, 0x1F3FC },
+ ["person surfing"]={ 0x1F3C4 },
+ ["person surfing: dark skin tone"]={ 0x1F3C4, 0x1F3FF },
+ ["person surfing: light skin tone"]={ 0x1F3C4, 0x1F3FB },
+ ["person surfing: medium skin tone"]={ 0x1F3C4, 0x1F3FD },
+ ["person surfing: medium-dark skin tone"]={ 0x1F3C4, 0x1F3FE },
+ ["person surfing: medium-light skin tone"]={ 0x1F3C4, 0x1F3FC },
+ ["person swimming"]={ 0x1F3CA },
+ ["person swimming: dark skin tone"]={ 0x1F3CA, 0x1F3FF },
+ ["person swimming: light skin tone"]={ 0x1F3CA, 0x1F3FB },
+ ["person swimming: medium skin tone"]={ 0x1F3CA, 0x1F3FD },
+ ["person swimming: medium-dark skin tone"]={ 0x1F3CA, 0x1F3FE },
+ ["person swimming: medium-light skin tone"]={ 0x1F3CA, 0x1F3FC },
+ ["person taking bath"]={ 0x1F6C0 },
+ ["person taking bath: dark skin tone"]={ 0x1F6C0, 0x1F3FF },
+ ["person taking bath: light skin tone"]={ 0x1F6C0, 0x1F3FB },
+ ["person taking bath: medium skin tone"]={ 0x1F6C0, 0x1F3FD },
+ ["person taking bath: medium-dark skin tone"]={ 0x1F6C0, 0x1F3FE },
+ ["person taking bath: medium-light skin tone"]={ 0x1F6C0, 0x1F3FC },
+ ["person tipping hand"]={ 0x1F481 },
+ ["person tipping hand: dark skin tone"]={ 0x1F481, 0x1F3FF },
+ ["person tipping hand: light skin tone"]={ 0x1F481, 0x1F3FB },
+ ["person tipping hand: medium skin tone"]={ 0x1F481, 0x1F3FD },
+ ["person tipping hand: medium-dark skin tone"]={ 0x1F481, 0x1F3FE },
+ ["person tipping hand: medium-light skin tone"]={ 0x1F481, 0x1F3FC },
+ ["person walking"]={ 0x1F6B6 },
+ ["person walking: dark skin tone"]={ 0x1F6B6, 0x1F3FF },
+ ["person walking: light skin tone"]={ 0x1F6B6, 0x1F3FB },
+ ["person walking: medium skin tone"]={ 0x1F6B6, 0x1F3FD },
+ ["person walking: medium-dark skin tone"]={ 0x1F6B6, 0x1F3FE },
+ ["person walking: medium-light skin tone"]={ 0x1F6B6, 0x1F3FC },
+ ["person wearing turban"]={ 0x1F473 },
+ ["person wearing turban: dark skin tone"]={ 0x1F473, 0x1F3FF },
+ ["person wearing turban: light skin tone"]={ 0x1F473, 0x1F3FB },
+ ["person wearing turban: medium skin tone"]={ 0x1F473, 0x1F3FD },
+ ["person wearing turban: medium-dark skin tone"]={ 0x1F473, 0x1F3FE },
+ ["person wearing turban: medium-light skin tone"]={ 0x1F473, 0x1F3FC },
+ ["peru"]={ 0x1F1F5, 0x1F1EA },
+ ["philippines"]={ 0x1F1F5, 0x1F1ED },
+ ["pick"]={ 0x26CF },
+ ["pie"]={ 0x1F967 },
+ ["pig"]={ 0x1F416 },
+ ["pig face"]={ 0x1F437 },
+ ["pig nose"]={ 0x1F43D },
+ ["pile of poo"]={ 0x1F4A9 },
+ ["pill"]={ 0x1F48A },
+ ["pine decoration"]={ 0x1F38D },
+ ["pineapple"]={ 0x1F34D },
+ ["ping pong"]={ 0x1F3D3 },
+ ["pisces"]={ 0x2653 },
+ ["pistol"]={ 0x1F52B },
+ ["pitcairn islands"]={ 0x1F1F5, 0x1F1F3 },
+ ["pizza"]={ 0x1F355 },
+ ["place of worship"]={ 0x1F6D0 },
+ ["play button"]={ 0x25B6 },
+ ["play or pause button"]={ 0x23EF },
+ ["poland"]={ 0x1F1F5, 0x1F1F1 },
+ ["police car"]={ 0x1F693 },
+ ["police car light"]={ 0x1F6A8 },
+ ["police officer"]={ 0x1F46E },
+ ["police officer: dark skin tone"]={ 0x1F46E, 0x1F3FF },
+ ["police officer: light skin tone"]={ 0x1F46E, 0x1F3FB },
+ ["police officer: medium skin tone"]={ 0x1F46E, 0x1F3FD },
+ ["police officer: medium-dark skin tone"]={ 0x1F46E, 0x1F3FE },
+ ["police officer: medium-light skin tone"]={ 0x1F46E, 0x1F3FC },
+ ["poodle"]={ 0x1F429 },
+ ["pool 8 ball"]={ 0x1F3B1 },
+ ["popcorn"]={ 0x1F37F },
+ ["portugal"]={ 0x1F1F5, 0x1F1F9 },
+ ["post office"]={ 0x1F3E4 },
+ ["postal horn"]={ 0x1F4EF },
+ ["postbox"]={ 0x1F4EE },
+ ["pot of food"]={ 0x1F372 },
+ ["potable water"]={ 0x1F6B0 },
+ ["potato"]={ 0x1F954 },
+ ["poultry leg"]={ 0x1F357 },
+ ["pound banknote"]={ 0x1F4B7 },
+ ["pouting cat face"]={ 0x1F63E },
+ ["pouting face"]={ 0x1F621 },
+ ["prayer beads"]={ 0x1F4FF },
+ ["pregnant woman"]={ 0x1F930 },
+ ["pregnant woman: dark skin tone"]={ 0x1F930, 0x1F3FF },
+ ["pregnant woman: light skin tone"]={ 0x1F930, 0x1F3FB },
+ ["pregnant woman: medium skin tone"]={ 0x1F930, 0x1F3FD },
+ ["pregnant woman: medium-dark skin tone"]={ 0x1F930, 0x1F3FE },
+ ["pregnant woman: medium-light skin tone"]={ 0x1F930, 0x1F3FC },
+ ["pretzel"]={ 0x1F968 },
+ ["prince"]={ 0x1F934 },
+ ["prince: dark skin tone"]={ 0x1F934, 0x1F3FF },
+ ["prince: light skin tone"]={ 0x1F934, 0x1F3FB },
+ ["prince: medium skin tone"]={ 0x1F934, 0x1F3FD },
+ ["prince: medium-dark skin tone"]={ 0x1F934, 0x1F3FE },
+ ["prince: medium-light skin tone"]={ 0x1F934, 0x1F3FC },
+ ["princess"]={ 0x1F478 },
+ ["princess: dark skin tone"]={ 0x1F478, 0x1F3FF },
+ ["princess: light skin tone"]={ 0x1F478, 0x1F3FB },
+ ["princess: medium skin tone"]={ 0x1F478, 0x1F3FD },
+ ["princess: medium-dark skin tone"]={ 0x1F478, 0x1F3FE },
+ ["princess: medium-light skin tone"]={ 0x1F478, 0x1F3FC },
+ ["printer"]={ 0x1F5A8 },
+ ["prohibited"]={ 0x1F6AB },
+ ["puerto rico"]={ 0x1F1F5, 0x1F1F7 },
+ ["purple heart"]={ 0x1F49C },
+ ["purse"]={ 0x1F45B },
+ ["pushpin"]={ 0x1F4CC },
+ ["qatar"]={ 0x1F1F6, 0x1F1E6 },
+ ["question mark"]={ 0x2753 },
+ ["rabbit"]={ 0x1F407 },
+ ["rabbit face"]={ 0x1F430 },
+ ["racing car"]={ 0x1F3CE },
+ ["radio"]={ 0x1F4FB },
+ ["radio button"]={ 0x1F518 },
+ ["radioactive"]={ 0x2622 },
+ ["railway car"]={ 0x1F683 },
+ ["railway track"]={ 0x1F6E4 },
+ ["rainbow"]={ 0x1F308 },
+ ["rainbow flag"]={ 0x1F3F3, 0x200D, 0x1F308 },
+ ["raised back of hand"]={ 0x1F91A },
+ ["raised back of hand: dark skin tone"]={ 0x1F91A, 0x1F3FF },
+ ["raised back of hand: light skin tone"]={ 0x1F91A, 0x1F3FB },
+ ["raised back of hand: medium skin tone"]={ 0x1F91A, 0x1F3FD },
+ ["raised back of hand: medium-dark skin tone"]={ 0x1F91A, 0x1F3FE },
+ ["raised back of hand: medium-light skin tone"]={ 0x1F91A, 0x1F3FC },
+ ["raised fist"]={ 0x270A },
+ ["raised fist: dark skin tone"]={ 0x270A, 0x1F3FF },
+ ["raised fist: light skin tone"]={ 0x270A, 0x1F3FB },
+ ["raised fist: medium skin tone"]={ 0x270A, 0x1F3FD },
+ ["raised fist: medium-dark skin tone"]={ 0x270A, 0x1F3FE },
+ ["raised fist: medium-light skin tone"]={ 0x270A, 0x1F3FC },
+ ["raised hand"]={ 0x270B },
+ ["raised hand with fingers splayed"]={ 0x1F590 },
+ ["raised hand with fingers splayed: dark skin tone"]={ 0x1F590, 0x1F3FF },
+ ["raised hand with fingers splayed: light skin tone"]={ 0x1F590, 0x1F3FB },
+ ["raised hand with fingers splayed: medium skin tone"]={ 0x1F590, 0x1F3FD },
+ ["raised hand with fingers splayed: medium-dark skin tone"]={ 0x1F590, 0x1F3FE },
+ ["raised hand with fingers splayed: medium-light skin tone"]={ 0x1F590, 0x1F3FC },
+ ["raised hand: dark skin tone"]={ 0x270B, 0x1F3FF },
+ ["raised hand: light skin tone"]={ 0x270B, 0x1F3FB },
+ ["raised hand: medium skin tone"]={ 0x270B, 0x1F3FD },
+ ["raised hand: medium-dark skin tone"]={ 0x270B, 0x1F3FE },
+ ["raised hand: medium-light skin tone"]={ 0x270B, 0x1F3FC },
+ ["raising hands"]={ 0x1F64C },
+ ["raising hands: dark skin tone"]={ 0x1F64C, 0x1F3FF },
+ ["raising hands: light skin tone"]={ 0x1F64C, 0x1F3FB },
+ ["raising hands: medium skin tone"]={ 0x1F64C, 0x1F3FD },
+ ["raising hands: medium-dark skin tone"]={ 0x1F64C, 0x1F3FE },
+ ["raising hands: medium-light skin tone"]={ 0x1F64C, 0x1F3FC },
+ ["ram"]={ 0x1F40F },
+ ["rat"]={ 0x1F400 },
+ ["record button"]={ 0x23FA },
+ ["recycling symbol"]={ 0x267B },
+ ["red apple"]={ 0x1F34E },
+ ["red circle"]={ 0x1F534 },
+ ["red heart"]={ 0x2764 },
+ ["red paper lantern"]={ 0x1F3EE },
+ ["red triangle pointed down"]={ 0x1F53B },
+ ["red triangle pointed up"]={ 0x1F53A },
+ ["registered"]={ 0xAE },
+ ["relieved face"]={ 0x1F60C },
+ ["reminder ribbon"]={ 0x1F397 },
+ ["repeat button"]={ 0x1F501 },
+ ["repeat single button"]={ 0x1F502 },
+ ["rescue worker’s helmet"]={ 0x26D1 },
+ ["restroom"]={ 0x1F6BB },
+ ["reverse button"]={ 0x25C0 },
+ ["revolving hearts"]={ 0x1F49E },
+ ["rhinoceros"]={ 0x1F98F },
+ ["ribbon"]={ 0x1F380 },
+ ["rice ball"]={ 0x1F359 },
+ ["rice cracker"]={ 0x1F358 },
+ ["right anger bubble"]={ 0x1F5EF },
+ ["right arrow"]={ 0x27A1 },
+ ["right arrow curving down"]={ 0x2935 },
+ ["right arrow curving left"]={ 0x21A9 },
+ ["right arrow curving up"]={ 0x2934 },
+ ["right-facing fist"]={ 0x1F91C },
+ ["right-facing fist: dark skin tone"]={ 0x1F91C, 0x1F3FF },
+ ["right-facing fist: light skin tone"]={ 0x1F91C, 0x1F3FB },
+ ["right-facing fist: medium skin tone"]={ 0x1F91C, 0x1F3FD },
+ ["right-facing fist: medium-dark skin tone"]={ 0x1F91C, 0x1F3FE },
+ ["right-facing fist: medium-light skin tone"]={ 0x1F91C, 0x1F3FC },
+ ["right-pointing magnifying glass"]={ 0x1F50E },
+ ["ring"]={ 0x1F48D },
+ ["roasted sweet potato"]={ 0x1F360 },
+ ["robot face"]={ 0x1F916 },
+ ["rocket"]={ 0x1F680 },
+ ["rolled-up newspaper"]={ 0x1F5DE },
+ ["roller coaster"]={ 0x1F3A2 },
+ ["rolling on the floor laughing"]={ 0x1F923 },
+ ["romania"]={ 0x1F1F7, 0x1F1F4 },
+ ["rooster"]={ 0x1F413 },
+ ["rose"]={ 0x1F339 },
+ ["rosette"]={ 0x1F3F5 },
+ ["round pushpin"]={ 0x1F4CD },
+ ["rugby football"]={ 0x1F3C9 },
+ ["running shirt"]={ 0x1F3BD },
+ ["running shoe"]={ 0x1F45F },
+ ["russia"]={ 0x1F1F7, 0x1F1FA },
+ ["rwanda"]={ 0x1F1F7, 0x1F1FC },
+ ["réunion"]={ 0x1F1F7, 0x1F1EA },
+ ["sagittarius"]={ 0x2650 },
+ ["sailboat"]={ 0x26F5 },
+ ["sake"]={ 0x1F376 },
+ ["samoa"]={ 0x1F1FC, 0x1F1F8 },
+ ["san marino"]={ 0x1F1F8, 0x1F1F2 },
+ ["sandwich"]={ 0x1F96A },
+ ["santa claus"]={ 0x1F385 },
+ ["santa claus: dark skin tone"]={ 0x1F385, 0x1F3FF },
+ ["santa claus: light skin tone"]={ 0x1F385, 0x1F3FB },
+ ["santa claus: medium skin tone"]={ 0x1F385, 0x1F3FD },
+ ["santa claus: medium-dark skin tone"]={ 0x1F385, 0x1F3FE },
+ ["santa claus: medium-light skin tone"]={ 0x1F385, 0x1F3FC },
+ ["satellite"]={ 0x1F6F0 },
+ ["satellite antenna"]={ 0x1F4E1 },
+ ["saudi arabia"]={ 0x1F1F8, 0x1F1E6 },
+ ["sauropod"]={ 0x1F995 },
+ ["saxophone"]={ 0x1F3B7 },
+ ["scarf"]={ 0x1F9E3 },
+ ["school"]={ 0x1F3EB },
+ ["school backpack"]={ 0x1F392 },
+ ["scissors"]={ 0x2702 },
+ ["scorpion"]={ 0x1F982 },
+ ["scorpius"]={ 0x264F },
+ ["scotland"]={ 0x1F3F4, 0xE0067, 0xE0062, 0xE0073, 0xE0063, 0xE0074, 0xE007F },
+ ["scroll"]={ 0x1F4DC },
+ ["seat"]={ 0x1F4BA },
+ ["see-no-evil monkey"]={ 0x1F648 },
+ ["seedling"]={ 0x1F331 },
+ ["selfie"]={ 0x1F933 },
+ ["selfie: dark skin tone"]={ 0x1F933, 0x1F3FF },
+ ["selfie: light skin tone"]={ 0x1F933, 0x1F3FB },
+ ["selfie: medium skin tone"]={ 0x1F933, 0x1F3FD },
+ ["selfie: medium-dark skin tone"]={ 0x1F933, 0x1F3FE },
+ ["selfie: medium-light skin tone"]={ 0x1F933, 0x1F3FC },
+ ["senegal"]={ 0x1F1F8, 0x1F1F3 },
+ ["serbia"]={ 0x1F1F7, 0x1F1F8 },
+ ["seven o’clock"]={ 0x1F556 },
+ ["seven-thirty"]={ 0x1F562 },
+ ["seychelles"]={ 0x1F1F8, 0x1F1E8 },
+ ["shallow pan of food"]={ 0x1F958 },
+ ["shamrock"]={ 0x2618 },
+ ["shark"]={ 0x1F988 },
+ ["shaved ice"]={ 0x1F367 },
+ ["sheaf of rice"]={ 0x1F33E },
+ ["shield"]={ 0x1F6E1 },
+ ["shinto shrine"]={ 0x26E9 },
+ ["ship"]={ 0x1F6A2 },
+ ["shooting star"]={ 0x1F320 },
+ ["shopping bags"]={ 0x1F6CD },
+ ["shopping cart"]={ 0x1F6D2 },
+ ["shortcake"]={ 0x1F370 },
+ ["shower"]={ 0x1F6BF },
+ ["shrimp"]={ 0x1F990 },
+ ["shuffle tracks button"]={ 0x1F500 },
+ ["shushing face"]={ 0x1F92B },
+ ["sierra leone"]={ 0x1F1F8, 0x1F1F1 },
+ ["sign of the horns"]={ 0x1F918 },
+ ["sign of the horns: dark skin tone"]={ 0x1F918, 0x1F3FF },
+ ["sign of the horns: light skin tone"]={ 0x1F918, 0x1F3FB },
+ ["sign of the horns: medium skin tone"]={ 0x1F918, 0x1F3FD },
+ ["sign of the horns: medium-dark skin tone"]={ 0x1F918, 0x1F3FE },
+ ["sign of the horns: medium-light skin tone"]={ 0x1F918, 0x1F3FC },
+ ["singapore"]={ 0x1F1F8, 0x1F1EC },
+ ["sint maarten"]={ 0x1F1F8, 0x1F1FD },
+ ["six o’clock"]={ 0x1F555 },
+ ["six-thirty"]={ 0x1F561 },
+ ["skier"]={ 0x26F7 },
+ ["skis"]={ 0x1F3BF },
+ ["skull"]={ 0x1F480 },
+ ["skull and crossbones"]={ 0x2620 },
+ ["sled"]={ 0x1F6F7 },
+ ["sleeping face"]={ 0x1F634 },
+ ["sleepy face"]={ 0x1F62A },
+ ["slightly frowning face"]={ 0x1F641 },
+ ["slightly smiling face"]={ 0x1F642 },
+ ["slot machine"]={ 0x1F3B0 },
+ ["slovakia"]={ 0x1F1F8, 0x1F1F0 },
+ ["slovenia"]={ 0x1F1F8, 0x1F1EE },
+ ["small airplane"]={ 0x1F6E9 },
+ ["small blue diamond"]={ 0x1F539 },
+ ["small orange diamond"]={ 0x1F538 },
+ ["smiling cat face with heart-eyes"]={ 0x1F63B },
+ ["smiling cat face with open mouth"]={ 0x1F63A },
+ ["smiling face"]={ 0x263A },
+ ["smiling face with halo"]={ 0x1F607 },
+ ["smiling face with heart-eyes"]={ 0x1F60D },
+ ["smiling face with horns"]={ 0x1F608 },
+ ["smiling face with open mouth"]={ 0x1F603 },
+ ["smiling face with open mouth & closed eyes"]={ 0x1F606 },
+ ["smiling face with open mouth & cold sweat"]={ 0x1F605 },
+ ["smiling face with open mouth & smiling eyes"]={ 0x1F604 },
+ ["smiling face with smiling eyes"]={ 0x1F60A },
+ ["smiling face with sunglasses"]={ 0x1F60E },
+ ["smirking face"]={ 0x1F60F },
+ ["snail"]={ 0x1F40C },
+ ["snake"]={ 0x1F40D },
+ ["sneezing face"]={ 0x1F927 },
+ ["snow-capped mountain"]={ 0x1F3D4 },
+ ["snowboarder"]={ 0x1F3C2 },
+ ["snowboarder: dark skin tone"]={ 0x1F3C2, 0x1F3FF },
+ ["snowboarder: light skin tone"]={ 0x1F3C2, 0x1F3FB },
+ ["snowboarder: medium skin tone"]={ 0x1F3C2, 0x1F3FD },
+ ["snowboarder: medium-dark skin tone"]={ 0x1F3C2, 0x1F3FE },
+ ["snowboarder: medium-light skin tone"]={ 0x1F3C2, 0x1F3FC },
+ ["snowflake"]={ 0x2744 },
+ ["snowman"]={ 0x2603 },
+ ["snowman without snow"]={ 0x26C4 },
+ ["soccer ball"]={ 0x26BD },
+ ["socks"]={ 0x1F9E6 },
+ ["soft ice cream"]={ 0x1F366 },
+ ["solomon islands"]={ 0x1F1F8, 0x1F1E7 },
+ ["somalia"]={ 0x1F1F8, 0x1F1F4 },
+ ["soon arrow"]={ 0x1F51C },
+ ["sos button"]={ 0x1F198 },
+ ["south africa"]={ 0x1F1FF, 0x1F1E6 },
+ ["south georgia & south sandwich islands"]={ 0x1F1EC, 0x1F1F8 },
+ ["south korea"]={ 0x1F1F0, 0x1F1F7 },
+ ["south sudan"]={ 0x1F1F8, 0x1F1F8 },
+ ["spade suit"]={ 0x2660 },
+ ["spaghetti"]={ 0x1F35D },
+ ["spain"]={ 0x1F1EA, 0x1F1F8 },
+ ["sparkle"]={ 0x2747 },
+ ["sparkler"]={ 0x1F387 },
+ ["sparkles"]={ 0x2728 },
+ ["sparkling heart"]={ 0x1F496 },
+ ["speak-no-evil monkey"]={ 0x1F64A },
+ ["speaker high volume"]={ 0x1F50A },
+ ["speaker low volume"]={ 0x1F508 },
+ ["speaker medium volume"]={ 0x1F509 },
+ ["speaking head"]={ 0x1F5E3 },
+ ["speech balloon"]={ 0x1F4AC },
+ ["speedboat"]={ 0x1F6A4 },
+ ["spider"]={ 0x1F577 },
+ ["spider web"]={ 0x1F578 },
+ ["spiral calendar"]={ 0x1F5D3 },
+ ["spiral notepad"]={ 0x1F5D2 },
+ ["spiral shell"]={ 0x1F41A },
+ ["spoon"]={ 0x1F944 },
+ ["sport utility vehicle"]={ 0x1F699 },
+ ["sports medal"]={ 0x1F3C5 },
+ ["spouting whale"]={ 0x1F433 },
+ ["squid"]={ 0x1F991 },
+ ["sri lanka"]={ 0x1F1F1, 0x1F1F0 },
+ ["st. barthélemy"]={ 0x1F1E7, 0x1F1F1 },
+ ["st. helena"]={ 0x1F1F8, 0x1F1ED },
+ ["st. kitts & nevis"]={ 0x1F1F0, 0x1F1F3 },
+ ["st. lucia"]={ 0x1F1F1, 0x1F1E8 },
+ ["st. martin"]={ 0x1F1F2, 0x1F1EB },
+ ["st. pierre & miquelon"]={ 0x1F1F5, 0x1F1F2 },
+ ["st. vincent & grenadines"]={ 0x1F1FB, 0x1F1E8 },
+ ["stadium"]={ 0x1F3DF },
+ ["star and crescent"]={ 0x262A },
+ ["star of david"]={ 0x2721 },
+ ["star-struck"]={ 0x1F929 },
+ ["station"]={ 0x1F689 },
+ ["statue of liberty"]={ 0x1F5FD },
+ ["steaming bowl"]={ 0x1F35C },
+ ["stop button"]={ 0x23F9 },
+ ["stop sign"]={ 0x1F6D1 },
+ ["stopwatch"]={ 0x23F1 },
+ ["straight ruler"]={ 0x1F4CF },
+ ["strawberry"]={ 0x1F353 },
+ ["studio microphone"]={ 0x1F399 },
+ ["stuffed flatbread"]={ 0x1F959 },
+ ["sudan"]={ 0x1F1F8, 0x1F1E9 },
+ ["sun"]={ 0x2600 },
+ ["sun behind cloud"]={ 0x26C5 },
+ ["sun behind large cloud"]={ 0x1F325 },
+ ["sun behind rain cloud"]={ 0x1F326 },
+ ["sun behind small cloud"]={ 0x1F324 },
+ ["sun with face"]={ 0x1F31E },
+ ["sunflower"]={ 0x1F33B },
+ ["sunglasses"]={ 0x1F576 },
+ ["sunrise"]={ 0x1F305 },
+ ["sunrise over mountains"]={ 0x1F304 },
+ ["sunset"]={ 0x1F307 },
+ ["suriname"]={ 0x1F1F8, 0x1F1F7 },
+ ["sushi"]={ 0x1F363 },
+ ["suspension railway"]={ 0x1F69F },
+ ["svalbard & jan mayen"]={ 0x1F1F8, 0x1F1EF },
+ ["swaziland"]={ 0x1F1F8, 0x1F1FF },
+ ["sweat droplets"]={ 0x1F4A6 },
+ ["sweden"]={ 0x1F1F8, 0x1F1EA },
+ ["switzerland"]={ 0x1F1E8, 0x1F1ED },
+ ["synagogue"]={ 0x1F54D },
+ ["syria"]={ 0x1F1F8, 0x1F1FE },
+ ["syringe"]={ 0x1F489 },
+ ["são tomé & príncipe"]={ 0x1F1F8, 0x1F1F9 },
+ ["t-rex"]={ 0x1F996 },
+ ["t-shirt"]={ 0x1F455 },
+ ["taco"]={ 0x1F32E },
+ ["taiwan"]={ 0x1F1F9, 0x1F1FC },
+ ["tajikistan"]={ 0x1F1F9, 0x1F1EF },
+ ["takeout box"]={ 0x1F961 },
+ ["tanabata tree"]={ 0x1F38B },
+ ["tangerine"]={ 0x1F34A },
+ ["tanzania"]={ 0x1F1F9, 0x1F1FF },
+ ["taurus"]={ 0x2649 },
+ ["taxi"]={ 0x1F695 },
+ ["teacup without handle"]={ 0x1F375 },
+ ["tear-off calendar"]={ 0x1F4C6 },
+ ["telephone"]={ 0x260E },
+ ["telephone receiver"]={ 0x1F4DE },
+ ["telescope"]={ 0x1F52D },
+ ["television"]={ 0x1F4FA },
+ ["ten o’clock"]={ 0x1F559 },
+ ["ten-thirty"]={ 0x1F565 },
+ ["tennis"]={ 0x1F3BE },
+ ["tent"]={ 0x26FA },
+ ["thailand"]={ 0x1F1F9, 0x1F1ED },
+ ["thermometer"]={ 0x1F321 },
+ ["thinking face"]={ 0x1F914 },
+ ["thought balloon"]={ 0x1F4AD },
+ ["three o’clock"]={ 0x1F552 },
+ ["three-thirty"]={ 0x1F55E },
+ ["thumbs down"]={ 0x1F44E },
+ ["thumbs down: dark skin tone"]={ 0x1F44E, 0x1F3FF },
+ ["thumbs down: light skin tone"]={ 0x1F44E, 0x1F3FB },
+ ["thumbs down: medium skin tone"]={ 0x1F44E, 0x1F3FD },
+ ["thumbs down: medium-dark skin tone"]={ 0x1F44E, 0x1F3FE },
+ ["thumbs down: medium-light skin tone"]={ 0x1F44E, 0x1F3FC },
+ ["thumbs up"]={ 0x1F44D },
+ ["thumbs up: dark skin tone"]={ 0x1F44D, 0x1F3FF },
+ ["thumbs up: light skin tone"]={ 0x1F44D, 0x1F3FB },
+ ["thumbs up: medium skin tone"]={ 0x1F44D, 0x1F3FD },
+ ["thumbs up: medium-dark skin tone"]={ 0x1F44D, 0x1F3FE },
+ ["thumbs up: medium-light skin tone"]={ 0x1F44D, 0x1F3FC },
+ ["ticket"]={ 0x1F3AB },
+ ["tiger"]={ 0x1F405 },
+ ["tiger face"]={ 0x1F42F },
+ ["timer clock"]={ 0x23F2 },
+ ["timor-leste"]={ 0x1F1F9, 0x1F1F1 },
+ ["tired face"]={ 0x1F62B },
+ ["togo"]={ 0x1F1F9, 0x1F1EC },
+ ["toilet"]={ 0x1F6BD },
+ ["tokelau"]={ 0x1F1F9, 0x1F1F0 },
+ ["tokyo tower"]={ 0x1F5FC },
+ ["tomato"]={ 0x1F345 },
+ ["tonga"]={ 0x1F1F9, 0x1F1F4 },
+ ["tongue"]={ 0x1F445 },
+ ["top arrow"]={ 0x1F51D },
+ ["top hat"]={ 0x1F3A9 },
+ ["tornado"]={ 0x1F32A },
+ ["trackball"]={ 0x1F5B2 },
+ ["tractor"]={ 0x1F69C },
+ ["trade mark"]={ 0x2122 },
+ ["train"]={ 0x1F686 },
+ ["tram"]={ 0x1F68A },
+ ["tram car"]={ 0x1F68B },
+ ["triangular flag"]={ 0x1F6A9 },
+ ["triangular ruler"]={ 0x1F4D0 },
+ ["trident emblem"]={ 0x1F531 },
+ ["trinidad & tobago"]={ 0x1F1F9, 0x1F1F9 },
+ ["tristan da cunha"]={ 0x1F1F9, 0x1F1E6 },
+ ["trolleybus"]={ 0x1F68E },
+ ["trophy"]={ 0x1F3C6 },
+ ["tropical drink"]={ 0x1F379 },
+ ["tropical fish"]={ 0x1F420 },
+ ["trumpet"]={ 0x1F3BA },
+ ["tulip"]={ 0x1F337 },
+ ["tumbler glass"]={ 0x1F943 },
+ ["tunisia"]={ 0x1F1F9, 0x1F1F3 },
+ ["turkey"]={ 0x1F1F9, 0x1F1F7 },
+ ["turkmenistan"]={ 0x1F1F9, 0x1F1F2 },
+ ["turks & caicos islands"]={ 0x1F1F9, 0x1F1E8 },
+ ["turtle"]={ 0x1F422 },
+ ["tuvalu"]={ 0x1F1F9, 0x1F1FB },
+ ["twelve o’clock"]={ 0x1F55B },
+ ["twelve-thirty"]={ 0x1F567 },
+ ["two hearts"]={ 0x1F495 },
+ ["two men holding hands"]={ 0x1F46C },
+ ["two o’clock"]={ 0x1F551 },
+ ["two women holding hands"]={ 0x1F46D },
+ ["two-hump camel"]={ 0x1F42B },
+ ["two-thirty"]={ 0x1F55D },
+ ["u.s. outlying islands"]={ 0x1F1FA, 0x1F1F2 },
+ ["u.s. virgin islands"]={ 0x1F1FB, 0x1F1EE },
+ ["uganda"]={ 0x1F1FA, 0x1F1EC },
+ ["ukraine"]={ 0x1F1FA, 0x1F1E6 },
+ ["umbrella"]={ 0x2602 },
+ ["umbrella on ground"]={ 0x26F1 },
+ ["umbrella with rain drops"]={ 0x2614 },
+ ["unamused face"]={ 0x1F612 },
+ ["unicorn face"]={ 0x1F984 },
+ ["united arab emirates"]={ 0x1F1E6, 0x1F1EA },
+ ["united kingdom"]={ 0x1F1EC, 0x1F1E7 },
+ ["united nations"]={ 0x1F1FA, 0x1F1F3 },
+ ["united states"]={ 0x1F1FA, 0x1F1F8 },
+ ["unlocked"]={ 0x1F513 },
+ ["up arrow"]={ 0x2B06 },
+ ["up button"]={ 0x1F53C },
+ ["up! button"]={ 0x1F199 },
+ ["up-down arrow"]={ 0x2195 },
+ ["up-left arrow"]={ 0x2196 },
+ ["up-right arrow"]={ 0x2197 },
+ ["upside-down face"]={ 0x1F643 },
+ ["uruguay"]={ 0x1F1FA, 0x1F1FE },
+ ["uzbekistan"]={ 0x1F1FA, 0x1F1FF },
+ ["vampire"]={ 0x1F9DB },
+ ["vampire: dark skin tone"]={ 0x1F9DB, 0x1F3FF },
+ ["vampire: light skin tone"]={ 0x1F9DB, 0x1F3FB },
+ ["vampire: medium skin tone"]={ 0x1F9DB, 0x1F3FD },
+ ["vampire: medium-dark skin tone"]={ 0x1F9DB, 0x1F3FE },
+ ["vampire: medium-light skin tone"]={ 0x1F9DB, 0x1F3FC },
+ ["vanuatu"]={ 0x1F1FB, 0x1F1FA },
+ ["vatican city"]={ 0x1F1FB, 0x1F1E6 },
+ ["venezuela"]={ 0x1F1FB, 0x1F1EA },
+ ["vertical traffic light"]={ 0x1F6A6 },
+ ["vibration mode"]={ 0x1F4F3 },
+ ["victory hand"]={ 0x270C },
+ ["victory hand: dark skin tone"]={ 0x270C, 0x1F3FF },
+ ["victory hand: light skin tone"]={ 0x270C, 0x1F3FB },
+ ["victory hand: medium skin tone"]={ 0x270C, 0x1F3FD },
+ ["victory hand: medium-dark skin tone"]={ 0x270C, 0x1F3FE },
+ ["victory hand: medium-light skin tone"]={ 0x270C, 0x1F3FC },
+ ["video camera"]={ 0x1F4F9 },
+ ["video game"]={ 0x1F3AE },
+ ["videocassette"]={ 0x1F4FC },
+ ["vietnam"]={ 0x1F1FB, 0x1F1F3 },
+ ["violin"]={ 0x1F3BB },
+ ["virgo"]={ 0x264D },
+ ["volcano"]={ 0x1F30B },
+ ["volleyball"]={ 0x1F3D0 },
+ ["vs button"]={ 0x1F19A },
+ ["vulcan salute"]={ 0x1F596 },
+ ["vulcan salute: dark skin tone"]={ 0x1F596, 0x1F3FF },
+ ["vulcan salute: light skin tone"]={ 0x1F596, 0x1F3FB },
+ ["vulcan salute: medium skin tone"]={ 0x1F596, 0x1F3FD },
+ ["vulcan salute: medium-dark skin tone"]={ 0x1F596, 0x1F3FE },
+ ["vulcan salute: medium-light skin tone"]={ 0x1F596, 0x1F3FC },
+ ["wales"]={ 0x1F3F4, 0xE0067, 0xE0062, 0xE0077, 0xE006C, 0xE0073, 0xE007F },
+ ["wallis & futuna"]={ 0x1F1FC, 0x1F1EB },
+ ["waning crescent moon"]={ 0x1F318 },
+ ["waning gibbous moon"]={ 0x1F316 },
+ ["warning"]={ 0x26A0 },
+ ["wastebasket"]={ 0x1F5D1 },
+ ["watch"]={ 0x231A },
+ ["water buffalo"]={ 0x1F403 },
+ ["water closet"]={ 0x1F6BE },
+ ["water wave"]={ 0x1F30A },
+ ["watermelon"]={ 0x1F349 },
+ ["waving hand"]={ 0x1F44B },
+ ["waving hand: dark skin tone"]={ 0x1F44B, 0x1F3FF },
+ ["waving hand: light skin tone"]={ 0x1F44B, 0x1F3FB },
+ ["waving hand: medium skin tone"]={ 0x1F44B, 0x1F3FD },
+ ["waving hand: medium-dark skin tone"]={ 0x1F44B, 0x1F3FE },
+ ["waving hand: medium-light skin tone"]={ 0x1F44B, 0x1F3FC },
+ ["wavy dash"]={ 0x3030 },
+ ["waxing crescent moon"]={ 0x1F312 },
+ ["waxing gibbous moon"]={ 0x1F314 },
+ ["weary cat face"]={ 0x1F640 },
+ ["weary face"]={ 0x1F629 },
+ ["wedding"]={ 0x1F492 },
+ ["western sahara"]={ 0x1F1EA, 0x1F1ED },
+ ["whale"]={ 0x1F40B },
+ ["wheel of dharma"]={ 0x2638 },
+ ["wheelchair symbol"]={ 0x267F },
+ ["white circle"]={ 0x26AA },
+ ["white exclamation mark"]={ 0x2755 },
+ ["white flag"]={ 0x1F3F3 },
+ ["white flower"]={ 0x1F4AE },
+ ["white heavy check mark"]={ 0x2705 },
+ ["white large square"]={ 0x2B1C },
+ ["white medium square"]={ 0x25FB },
+ ["white medium star"]={ 0x2B50 },
+ ["white medium-small square"]={ 0x25FD },
+ ["white question mark"]={ 0x2754 },
+ ["white small square"]={ 0x25AB },
+ ["white square button"]={ 0x1F533 },
+ ["wilted flower"]={ 0x1F940 },
+ ["wind chime"]={ 0x1F390 },
+ ["wind face"]={ 0x1F32C },
+ ["wine glass"]={ 0x1F377 },
+ ["winking face"]={ 0x1F609 },
+ ["wolf face"]={ 0x1F43A },
+ ["woman"]={ 0x1F469 },
+ ["woman artist"]={ 0x1F469, 0x200D, 0x1F3A8 },
+ ["woman artist: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F3A8 },
+ ["woman artist: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F3A8 },
+ ["woman artist: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F3A8 },
+ ["woman artist: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F3A8 },
+ ["woman artist: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F3A8 },
+ ["woman astronaut"]={ 0x1F469, 0x200D, 0x1F680 },
+ ["woman astronaut: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F680 },
+ ["woman astronaut: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F680 },
+ ["woman astronaut: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F680 },
+ ["woman astronaut: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F680 },
+ ["woman astronaut: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F680 },
+ ["woman biking"]={ 0x1F6B4, 0x200D, 0x2640 },
+ ["woman biking: dark skin tone"]={ 0x1F6B4, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman biking: light skin tone"]={ 0x1F6B4, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman biking: medium skin tone"]={ 0x1F6B4, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman biking: medium-dark skin tone"]={ 0x1F6B4, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman biking: medium-light skin tone"]={ 0x1F6B4, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman bouncing ball"]={ 0x26F9, 0x200D, 0x2640 },
+ ["woman bouncing ball: dark skin tone"]={ 0x26F9, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman bouncing ball: light skin tone"]={ 0x26F9, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman bouncing ball: medium skin tone"]={ 0x26F9, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman bouncing ball: medium-dark skin tone"]={ 0x26F9, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman bouncing ball: medium-light skin tone"]={ 0x26F9, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman bowing"]={ 0x1F647, 0x200D, 0x2640 },
+ ["woman bowing: dark skin tone"]={ 0x1F647, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman bowing: light skin tone"]={ 0x1F647, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman bowing: medium skin tone"]={ 0x1F647, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman bowing: medium-dark skin tone"]={ 0x1F647, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman bowing: medium-light skin tone"]={ 0x1F647, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman cartwheeling"]={ 0x1F938, 0x200D, 0x2640 },
+ ["woman cartwheeling: dark skin tone"]={ 0x1F938, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman cartwheeling: light skin tone"]={ 0x1F938, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman cartwheeling: medium skin tone"]={ 0x1F938, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman cartwheeling: medium-dark skin tone"]={ 0x1F938, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman cartwheeling: medium-light skin tone"]={ 0x1F938, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman climbing"]={ 0x1F9D7, 0x200D, 0x2640 },
+ ["woman climbing: dark skin tone"]={ 0x1F9D7, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman climbing: light skin tone"]={ 0x1F9D7, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman climbing: medium skin tone"]={ 0x1F9D7, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman climbing: medium-dark skin tone"]={ 0x1F9D7, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman climbing: medium-light skin tone"]={ 0x1F9D7, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman construction worker"]={ 0x1F477, 0x200D, 0x2640 },
+ ["woman construction worker: dark skin tone"]={ 0x1F477, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman construction worker: light skin tone"]={ 0x1F477, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman construction worker: medium skin tone"]={ 0x1F477, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman construction worker: medium-dark skin tone"]={ 0x1F477, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman construction worker: medium-light skin tone"]={ 0x1F477, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman cook"]={ 0x1F469, 0x200D, 0x1F373 },
+ ["woman cook: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F373 },
+ ["woman cook: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F373 },
+ ["woman cook: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F373 },
+ ["woman cook: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F373 },
+ ["woman cook: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F373 },
+ ["woman dancing"]={ 0x1F483 },
+ ["woman dancing: dark skin tone"]={ 0x1F483, 0x1F3FF },
+ ["woman dancing: light skin tone"]={ 0x1F483, 0x1F3FB },
+ ["woman dancing: medium skin tone"]={ 0x1F483, 0x1F3FD },
+ ["woman dancing: medium-dark skin tone"]={ 0x1F483, 0x1F3FE },
+ ["woman dancing: medium-light skin tone"]={ 0x1F483, 0x1F3FC },
+ ["woman detective"]={ 0x1F575, 0x200D, 0x2640 },
+ ["woman detective: dark skin tone"]={ 0x1F575, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman detective: light skin tone"]={ 0x1F575, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman detective: medium skin tone"]={ 0x1F575, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman detective: medium-dark skin tone"]={ 0x1F575, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman detective: medium-light skin tone"]={ 0x1F575, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman elf"]={ 0x1F9DD, 0x200D, 0x2640 },
+ ["woman elf: dark skin tone"]={ 0x1F9DD, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman elf: light skin tone"]={ 0x1F9DD, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman elf: medium skin tone"]={ 0x1F9DD, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman elf: medium-dark skin tone"]={ 0x1F9DD, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman elf: medium-light skin tone"]={ 0x1F9DD, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman facepalming"]={ 0x1F926, 0x200D, 0x2640 },
+ ["woman facepalming: dark skin tone"]={ 0x1F926, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman facepalming: light skin tone"]={ 0x1F926, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman facepalming: medium skin tone"]={ 0x1F926, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman facepalming: medium-dark skin tone"]={ 0x1F926, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman facepalming: medium-light skin tone"]={ 0x1F926, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman factory worker"]={ 0x1F469, 0x200D, 0x1F3ED },
+ ["woman factory worker: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F3ED },
+ ["woman factory worker: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F3ED },
+ ["woman factory worker: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F3ED },
+ ["woman factory worker: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F3ED },
+ ["woman factory worker: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F3ED },
+ ["woman fairy"]={ 0x1F9DA, 0x200D, 0x2640 },
+ ["woman fairy: dark skin tone"]={ 0x1F9DA, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman fairy: light skin tone"]={ 0x1F9DA, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman fairy: medium skin tone"]={ 0x1F9DA, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman fairy: medium-dark skin tone"]={ 0x1F9DA, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman fairy: medium-light skin tone"]={ 0x1F9DA, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman farmer"]={ 0x1F469, 0x200D, 0x1F33E },
+ ["woman farmer: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F33E },
+ ["woman farmer: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F33E },
+ ["woman farmer: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F33E },
+ ["woman farmer: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F33E },
+ ["woman farmer: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F33E },
+ ["woman firefighter"]={ 0x1F469, 0x200D, 0x1F692 },
+ ["woman firefighter: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F692 },
+ ["woman firefighter: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F692 },
+ ["woman firefighter: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F692 },
+ ["woman firefighter: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F692 },
+ ["woman firefighter: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F692 },
+ ["woman frowning"]={ 0x1F64D, 0x200D, 0x2640 },
+ ["woman frowning: dark skin tone"]={ 0x1F64D, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman frowning: light skin tone"]={ 0x1F64D, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman frowning: medium skin tone"]={ 0x1F64D, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman frowning: medium-dark skin tone"]={ 0x1F64D, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman frowning: medium-light skin tone"]={ 0x1F64D, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman genie"]={ 0x1F9DE, 0x200D, 0x2640 },
+ ["woman gesturing no"]={ 0x1F645, 0x200D, 0x2640 },
+ ["woman gesturing no: dark skin tone"]={ 0x1F645, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman gesturing no: light skin tone"]={ 0x1F645, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman gesturing no: medium skin tone"]={ 0x1F645, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman gesturing no: medium-dark skin tone"]={ 0x1F645, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman gesturing no: medium-light skin tone"]={ 0x1F645, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman gesturing ok"]={ 0x1F646, 0x200D, 0x2640 },
+ ["woman gesturing ok: dark skin tone"]={ 0x1F646, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman gesturing ok: light skin tone"]={ 0x1F646, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman gesturing ok: medium skin tone"]={ 0x1F646, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman gesturing ok: medium-dark skin tone"]={ 0x1F646, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman gesturing ok: medium-light skin tone"]={ 0x1F646, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman getting haircut"]={ 0x1F487, 0x200D, 0x2640 },
+ ["woman getting haircut: dark skin tone"]={ 0x1F487, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman getting haircut: light skin tone"]={ 0x1F487, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman getting haircut: medium skin tone"]={ 0x1F487, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman getting haircut: medium-dark skin tone"]={ 0x1F487, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman getting haircut: medium-light skin tone"]={ 0x1F487, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman getting massage"]={ 0x1F486, 0x200D, 0x2640 },
+ ["woman getting massage: dark skin tone"]={ 0x1F486, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman getting massage: light skin tone"]={ 0x1F486, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman getting massage: medium skin tone"]={ 0x1F486, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman getting massage: medium-dark skin tone"]={ 0x1F486, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman getting massage: medium-light skin tone"]={ 0x1F486, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman golfing"]={ 0x1F3CC, 0x200D, 0x2640 },
+ ["woman golfing: dark skin tone"]={ 0x1F3CC, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman golfing: light skin tone"]={ 0x1F3CC, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman golfing: medium skin tone"]={ 0x1F3CC, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman golfing: medium-dark skin tone"]={ 0x1F3CC, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman golfing: medium-light skin tone"]={ 0x1F3CC, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman guard"]={ 0x1F482, 0x200D, 0x2640 },
+ ["woman guard: dark skin tone"]={ 0x1F482, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman guard: light skin tone"]={ 0x1F482, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman guard: medium skin tone"]={ 0x1F482, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman guard: medium-dark skin tone"]={ 0x1F482, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman guard: medium-light skin tone"]={ 0x1F482, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman health worker"]={ 0x1F469, 0x200D, 0x2695 },
+ ["woman health worker: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x2695 },
+ ["woman health worker: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x2695 },
+ ["woman health worker: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x2695 },
+ ["woman health worker: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x2695 },
+ ["woman health worker: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x2695 },
+ ["woman in lotus position"]={ 0x1F9D8, 0x200D, 0x2640 },
+ ["woman in lotus position: dark skin tone"]={ 0x1F9D8, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman in lotus position: light skin tone"]={ 0x1F9D8, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman in lotus position: medium skin tone"]={ 0x1F9D8, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman in lotus position: medium-dark skin tone"]={ 0x1F9D8, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman in lotus position: medium-light skin tone"]={ 0x1F9D8, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman in steamy room"]={ 0x1F9D6, 0x200D, 0x2640 },
+ ["woman in steamy room: dark skin tone"]={ 0x1F9D6, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman in steamy room: light skin tone"]={ 0x1F9D6, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman judge"]={ 0x1F469, 0x200D, 0x2696 },
+ ["woman judge: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x2696 },
+ ["woman judge: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x2696 },
+ ["woman judge: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x2696 },
+ ["woman judge: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x2696 },
+ ["woman judge: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x2696 },
+ ["woman juggling"]={ 0x1F939, 0x200D, 0x2640 },
+ ["woman juggling: dark skin tone"]={ 0x1F939, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman juggling: light skin tone"]={ 0x1F939, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman juggling: medium skin tone"]={ 0x1F939, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman juggling: medium-dark skin tone"]={ 0x1F939, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman juggling: medium-light skin tone"]={ 0x1F939, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman lifting weights"]={ 0x1F3CB, 0x200D, 0x2640 },
+ ["woman lifting weights: dark skin tone"]={ 0x1F3CB, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman lifting weights: light skin tone"]={ 0x1F3CB, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman lifting weights: medium skin tone"]={ 0x1F3CB, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman lifting weights: medium-dark skin tone"]={ 0x1F3CB, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman lifting weights: medium-light skin tone"]={ 0x1F3CB, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman mage"]={ 0x1F9D9, 0x200D, 0x2640 },
+ ["woman mage: dark skin tone"]={ 0x1F9D9, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman mage: light skin tone"]={ 0x1F9D9, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman mage: medium skin tone"]={ 0x1F9D9, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman mage: medium-dark skin tone"]={ 0x1F9D9, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman mage: medium-light skin tone"]={ 0x1F9D9, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman mechanic"]={ 0x1F469, 0x200D, 0x1F527 },
+ ["woman mechanic: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F527 },
+ ["woman mechanic: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F527 },
+ ["woman mechanic: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F527 },
+ ["woman mechanic: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F527 },
+ ["woman mechanic: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F527 },
+ ["woman mountain biking"]={ 0x1F6B5, 0x200D, 0x2640 },
+ ["woman mountain biking: dark skin tone"]={ 0x1F6B5, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman mountain biking: light skin tone"]={ 0x1F6B5, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman mountain biking: medium skin tone"]={ 0x1F6B5, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman mountain biking: medium-dark skin tone"]={ 0x1F6B5, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman mountain biking: medium-light skin tone"]={ 0x1F6B5, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman office worker"]={ 0x1F469, 0x200D, 0x1F4BC },
+ ["woman office worker: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F4BC },
+ ["woman office worker: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F4BC },
+ ["woman office worker: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F4BC },
+ ["woman office worker: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F4BC },
+ ["woman office worker: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F4BC },
+ ["woman pilot"]={ 0x1F469, 0x200D, 0x2708 },
+ ["woman pilot: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x2708 },
+ ["woman pilot: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x2708 },
+ ["woman pilot: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x2708 },
+ ["woman pilot: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x2708 },
+ ["woman pilot: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x2708 },
+ ["woman playing handball"]={ 0x1F93E, 0x200D, 0x2640 },
+ ["woman playing handball: dark skin tone"]={ 0x1F93E, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman playing handball: light skin tone"]={ 0x1F93E, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman playing handball: medium skin tone"]={ 0x1F93E, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman playing handball: medium-dark skin tone"]={ 0x1F93E, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman playing handball: medium-light skin tone"]={ 0x1F93E, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman playing water polo"]={ 0x1F93D, 0x200D, 0x2640 },
+ ["woman playing water polo: dark skin tone"]={ 0x1F93D, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman playing water polo: light skin tone"]={ 0x1F93D, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman playing water polo: medium skin tone"]={ 0x1F93D, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman playing water polo: medium-dark skin tone"]={ 0x1F93D, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman playing water polo: medium-light skin tone"]={ 0x1F93D, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman police officer"]={ 0x1F46E, 0x200D, 0x2640 },
+ ["woman police officer: dark skin tone"]={ 0x1F46E, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman police officer: light skin tone"]={ 0x1F46E, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman police officer: medium skin tone"]={ 0x1F46E, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman police officer: medium-dark skin tone"]={ 0x1F46E, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman police officer: medium-light skin tone"]={ 0x1F46E, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman pouting"]={ 0x1F64E, 0x200D, 0x2640 },
+ ["woman pouting: dark skin tone"]={ 0x1F64E, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman pouting: light skin tone"]={ 0x1F64E, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman pouting: medium skin tone"]={ 0x1F64E, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman pouting: medium-dark skin tone"]={ 0x1F64E, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman pouting: medium-light skin tone"]={ 0x1F64E, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman raising hand"]={ 0x1F64B, 0x200D, 0x2640 },
+ ["woman raising hand: dark skin tone"]={ 0x1F64B, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman raising hand: light skin tone"]={ 0x1F64B, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman raising hand: medium skin tone"]={ 0x1F64B, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman raising hand: medium-dark skin tone"]={ 0x1F64B, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman raising hand: medium-light skin tone"]={ 0x1F64B, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman rowing boat"]={ 0x1F6A3, 0x200D, 0x2640 },
+ ["woman rowing boat: dark skin tone"]={ 0x1F6A3, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman rowing boat: light skin tone"]={ 0x1F6A3, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman rowing boat: medium skin tone"]={ 0x1F6A3, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman rowing boat: medium-dark skin tone"]={ 0x1F6A3, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman rowing boat: medium-light skin tone"]={ 0x1F6A3, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman running"]={ 0x1F3C3, 0x200D, 0x2640 },
+ ["woman running: dark skin tone"]={ 0x1F3C3, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman running: light skin tone"]={ 0x1F3C3, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman running: medium skin tone"]={ 0x1F3C3, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman running: medium-dark skin tone"]={ 0x1F3C3, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman running: medium-light skin tone"]={ 0x1F3C3, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman scientist"]={ 0x1F469, 0x200D, 0x1F52C },
+ ["woman scientist: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F52C },
+ ["woman scientist: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F52C },
+ ["woman scientist: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F52C },
+ ["woman scientist: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F52C },
+ ["woman scientist: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F52C },
+ ["woman shrugging"]={ 0x1F937, 0x200D, 0x2640 },
+ ["woman shrugging: dark skin tone"]={ 0x1F937, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman shrugging: light skin tone"]={ 0x1F937, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman shrugging: medium skin tone"]={ 0x1F937, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman shrugging: medium-dark skin tone"]={ 0x1F937, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman shrugging: medium-light skin tone"]={ 0x1F937, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman singer"]={ 0x1F469, 0x200D, 0x1F3A4 },
+ ["woman singer: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F3A4 },
+ ["woman singer: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F3A4 },
+ ["woman singer: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F3A4 },
+ ["woman singer: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F3A4 },
+ ["woman singer: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F3A4 },
+ ["woman student"]={ 0x1F469, 0x200D, 0x1F393 },
+ ["woman student: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F393 },
+ ["woman student: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F393 },
+ ["woman student: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F393 },
+ ["woman student: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F393 },
+ ["woman student: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F393 },
+ ["woman surfing"]={ 0x1F3C4, 0x200D, 0x2640 },
+ ["woman surfing: dark skin tone"]={ 0x1F3C4, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman surfing: light skin tone"]={ 0x1F3C4, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman surfing: medium skin tone"]={ 0x1F3C4, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman surfing: medium-dark skin tone"]={ 0x1F3C4, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman surfing: medium-light skin tone"]={ 0x1F3C4, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman swimming"]={ 0x1F3CA, 0x200D, 0x2640 },
+ ["woman swimming: dark skin tone"]={ 0x1F3CA, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman swimming: light skin tone"]={ 0x1F3CA, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman swimming: medium skin tone"]={ 0x1F3CA, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman swimming: medium-dark skin tone"]={ 0x1F3CA, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman swimming: medium-light skin tone"]={ 0x1F3CA, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman teacher"]={ 0x1F469, 0x200D, 0x1F3EB },
+ ["woman teacher: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F3EB },
+ ["woman teacher: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F3EB },
+ ["woman teacher: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F3EB },
+ ["woman teacher: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F3EB },
+ ["woman teacher: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F3EB },
+ ["woman technologist"]={ 0x1F469, 0x200D, 0x1F4BB },
+ ["woman technologist: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F4BB },
+ ["woman technologist: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F4BB },
+ ["woman technologist: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F4BB },
+ ["woman technologist: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F4BB },
+ ["woman technologist: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F4BB },
+ ["woman tipping hand"]={ 0x1F481, 0x200D, 0x2640 },
+ ["woman tipping hand: dark skin tone"]={ 0x1F481, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman tipping hand: light skin tone"]={ 0x1F481, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman tipping hand: medium skin tone"]={ 0x1F481, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman tipping hand: medium-dark skin tone"]={ 0x1F481, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman tipping hand: medium-light skin tone"]={ 0x1F481, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman vampire"]={ 0x1F9DB, 0x200D, 0x2640 },
+ ["woman vampire: dark skin tone"]={ 0x1F9DB, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman vampire: light skin tone"]={ 0x1F9DB, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman vampire: medium skin tone"]={ 0x1F9DB, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman vampire: medium-dark skin tone"]={ 0x1F9DB, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman vampire: medium-light skin tone"]={ 0x1F9DB, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman walking"]={ 0x1F6B6, 0x200D, 0x2640 },
+ ["woman walking: dark skin tone"]={ 0x1F6B6, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman walking: light skin tone"]={ 0x1F6B6, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman walking: medium skin tone"]={ 0x1F6B6, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman walking: medium-dark skin tone"]={ 0x1F6B6, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman walking: medium-light skin tone"]={ 0x1F6B6, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman wearing turban"]={ 0x1F473, 0x200D, 0x2640 },
+ ["woman wearing turban: dark skin tone"]={ 0x1F473, 0x1F3FF, 0x200D, 0x2640 },
+ ["woman wearing turban: light skin tone"]={ 0x1F473, 0x1F3FB, 0x200D, 0x2640 },
+ ["woman wearing turban: medium skin tone"]={ 0x1F473, 0x1F3FD, 0x200D, 0x2640 },
+ ["woman wearing turban: medium-dark skin tone"]={ 0x1F473, 0x1F3FE, 0x200D, 0x2640 },
+ ["woman wearing turban: medium-light skin tone"]={ 0x1F473, 0x1F3FC, 0x200D, 0x2640 },
+ ["woman with headscarf"]={ 0x1F9D5 },
+ ["woman with headscarf: dark skin tone"]={ 0x1F9D5, 0x1F3FF },
+ ["woman with headscarf: light skin tone"]={ 0x1F9D5, 0x1F3FB },
+ ["woman with headscarf: medium skin tone"]={ 0x1F9D5, 0x1F3FD },
+ ["woman with headscarf: medium-dark skin tone"]={ 0x1F9D5, 0x1F3FE },
+ ["woman with headscarf: medium-light skin tone"]={ 0x1F9D5, 0x1F3FC },
+ ["woman zombie"]={ 0x1F9DF, 0x200D, 0x2640 },
+ ["woman: dark skin tone"]={ 0x1F469, 0x1F3FF },
+ ["woman: light skin tone"]={ 0x1F469, 0x1F3FB },
+ ["woman: medium skin tone"]={ 0x1F469, 0x1F3FD },
+ ["woman: medium-dark skin tone"]={ 0x1F469, 0x1F3FE },
+ ["woman: medium-light skin tone"]={ 0x1F469, 0x1F3FC },
+ ["woman’s boot"]={ 0x1F462 },
+ ["woman’s clothes"]={ 0x1F45A },
+ ["woman’s hat"]={ 0x1F452 },
+ ["woman’s sandal"]={ 0x1F461 },
+ ["women with bunny ears partying"]={ 0x1F46F, 0x200D, 0x2640 },
+ ["women wrestling"]={ 0x1F93C, 0x200D, 0x2640 },
+ ["women’s room"]={ 0x1F6BA },
+ ["world map"]={ 0x1F5FA },
+ ["worried face"]={ 0x1F61F },
+ ["wrapped gift"]={ 0x1F381 },
+ ["wrench"]={ 0x1F527 },
+ ["writing hand"]={ 0x270D },
+ ["writing hand: dark skin tone"]={ 0x270D, 0x1F3FF },
+ ["writing hand: light skin tone"]={ 0x270D, 0x1F3FB },
+ ["writing hand: medium skin tone"]={ 0x270D, 0x1F3FD },
+ ["writing hand: medium-dark skin tone"]={ 0x270D, 0x1F3FE },
+ ["writing hand: medium-light skin tone"]={ 0x270D, 0x1F3FC },
+ ["yellow heart"]={ 0x1F49B },
+ ["yemen"]={ 0x1F1FE, 0x1F1EA },
+ ["yen banknote"]={ 0x1F4B4 },
+ ["yin yang"]={ 0x262F },
+ ["zambia"]={ 0x1F1FF, 0x1F1F2 },
+ ["zebra"]={ 0x1F993 },
+ ["zimbabwe"]={ 0x1F1FF, 0x1F1FC },
+ ["zipper-mouth face"]={ 0x1F910 },
+ ["zombie"]={ 0x1F9DF },
+ ["zzz"]={ 0x1F4A4 },
+ ["Åland islands"]={ 0x1F1E6, 0x1F1FD },
+}


Property changes on: trunk/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -14,8 +14,9 @@
 local utfchar, utfbyte, utfvalues, ustring, utotable = utf.char, utf.byte, utf.values, utf.ustring, utf.totable
 local concat, unpack, tohash, insert = table.concat, table.unpack, table.tohash, table.insert
 local next, tonumber, type, rawget, rawset = next, tonumber, type, rawget, rawset
-local format, lower, gsub, find = string.format, string.lower, string.gsub, string.find
-local P, R, S, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cs
+local format, lower, gsub, find, match = string.format, string.lower, string.gsub, string.find, string.match
+local P, R, S, C, Cs, Ct, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc, lpeg.V
+local formatters = string.formatters
 
 if not characters then require("char-def") end
 
@@ -1387,6 +1388,174 @@
     end
 end
 
+do
+
+    -- There is no need to preload this table.
+
+    local any       = P(1)
+    local special   = S([['".,:;-+()]])
+                    + P('“') + P('”')
+    local apostrofe = P("’") + P("'")
+
+    local pattern = Cs ( (
+        (P("medium light") / "medium-light" + P("medium dark")  / "medium-dark") * P(" skin tone")
+        + (apostrofe * P("s"))/""
+        + special/""
+        + any
+    )^1)
+
+    local function load()
+        local name = resolvers.find_file("char-emj.lua")
+        local data = name and name ~= "" and dofile(name) or { }
+        local hash = { }
+        for d, c in next, data do
+            local k = lpegmatch(pattern,d) or d
+            local u = { }
+            for i=1,#c do
+                u[i] = utfchar(c[i])
+            end
+            u = concat(u)
+            hash[k] = u
+        end
+        return data, hash
+    end
+
+    local data, hash = nil, nil
+
+    function characters.emojized(name)
+        local t = lpegmatch(pattern,name)
+        if t then
+            return t
+        else
+            return { name }
+        end
+    end
+
+    local start     = P(" ")
+    local finish    = P(-1) + P(" ")
+    local skintone  = P("medium ")^0 * (P("light ") + P("dark "))^0 * P("skin tone")
+    local gender    = P("woman") + P("man")
+    local expanded  = (
+                            P("m-l-")/"medium-light"
+                          + P("m-d-")/"medium-dark"
+                          + P("l-")  /"light"
+                          + P("m-")  /"medium"
+                          + P("d-")  /"dark"
+                      )
+                    * (P("s-t")/" skin tone")
+    local compacted = (
+                        (P("medium-")/"m-" * (P("light")/"l" + P("dark")/"d"))
+                      + (P("medium")/"m"   +  P("light")/"l" + P("dark")/"d")
+                      )
+                    * (P(" skin tone")/"-s-t")
+
+    local pattern_0 = Cs((expanded + any)^1)
+    local pattern_1 = Cs(((start * skintone + skintone * finish)/"" + any)^1)
+    local pattern_2 = Cs(((start * gender   + gender   * finish)/"" + any)^1)
+    local pattern_4 = Cs((compacted + any)^1)
+
+ -- print(lpegmatch(pattern_0,"kiss woman l-s-t man d-s-t"))
+ -- print(lpegmatch(pattern_0,"something m-l-s-t"))
+ -- print(lpegmatch(pattern_0,"something m-s-t"))
+ -- print(lpegmatch(pattern_4,"something medium-light skin tone"))
+ -- print(lpegmatch(pattern_4,"something medium skin tone"))
+
+    local skin =
+        P("light skin tone")        / utfchar(0x1F3FB)
+      + P("medium-light skin tone") / utfchar(0x1F3FC)
+      + P("medium skin tone")       / utfchar(0x1F3FD)
+      + P("medium-dark skin tone")  / utfchar(0x1F3FE)
+      + P("dark skin tone")         / utfchar(0x1F3FF)
+
+    local parent =
+        P("man")   / utfchar(0x1F468)
+      + P("woman") / utfchar(0x1F469)
+
+    local child =
+        P("baby")  / utfchar(0x1F476)
+      + P("boy")   / utfchar(0x1F466)
+      + P("girl")  / utfchar(0x1F467)
+
+    local zwj   = utfchar(0x200D)
+    local heart = utfchar(0x2764) .. utfchar(0xFE0F) .. zwj
+    local kiss  = utfchar(0x2764) .. utfchar(0xFE0F) .. utfchar(0x200D) .. utfchar(0x1F48B) .. zwj
+
+    ----- member = parent + child
+
+    local space = P(" ")
+    local final = P(-1)
+
+    local p_done   = (space^1/zwj) + P(-1)
+    local p_rest   = space/"" * (skin * p_done) + p_done
+    local p_parent = parent * p_rest
+    local p_child  = child  * p_rest
+
+    local p_family = Cs ( (P("family")            * space^1)/"" * p_parent^-2 * p_child^-2 )
+    local p_couple = Cs ( (P("couple with heart") * space^1)/"" * p_parent * Cc(heart) * p_parent )
+    local p_kiss   = Cs ( (P("kiss")              * space^1)/"" * p_parent * Cc(kiss)  * p_parent )
+
+    local p_special = p_family + p_couple + p_kiss
+
+--     print(lpeg.match(p_special,"family man woman girl"))
+--      print(lpeg.match(p_special,"family man dark skin tone woman girl girl"))
+
+ -- local p_special = P { "all",
+ --     all    = Cs (V("family") + V("couple") + V("kiss")),
+ --     family = C("family")            * space^1 * V("parent")^-2 * V("child")^-2,
+ --     couple = P("couple with heart") * space^1 * V("parent") * Cc(heart) * V("parent"),
+ --     kiss   = P("kiss")              * space^1 * V("parent") * Cc(kiss) * V("parent"),
+ --     parent = parent * V("rest"),
+ --     child  = child  * V("rest"),
+ --     rest   = (space * skin)^0/"" * ((space^1/zwj) + P(-1)),
+ -- }
+
+    -- maybe characters.emoji.toutf
+
+    local emoji      = { }
+    characters.emoji = emoji
+
+    function emoji.resolve(name)
+        if not hash then
+            data, hash = load()
+        end
+        local h = hash[name]
+        if h then
+            return h
+        end
+        -- expand shortcuts
+        local name = lpegmatch(pattern_0,name) or name
+        -- expand some 25K variants
+        local h = lpegmatch(p_special,name)
+        if h then
+            return h
+        end
+        -- simplify
+        local s = lpegmatch(pattern_1,name)
+        local h = hash[s]
+        if h then
+            return h
+        end
+        -- simplify
+        local s = lpegmatch(pattern_2,name)
+        local h = hash[s]
+        if h then
+            return h
+        end
+    end
+
+    function emoji.known()
+        if not hash then
+            data, hash = load()
+        end
+        return hash, data
+    end
+
+    function emoji.compact(name)
+        return lpegmatch(pattern_4,name) or name
+    end
+
+end
+
 -- code moved to char-tex.lua
 
 return characters

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1450,11 +1450,19 @@
     local p_texescape = patterns.texescape
 
     function context.escaped(s)
-        return context(lpegmatch(p_texescape,s) or s)
+        if s then
+            context(lpegmatch(p_texescape,s) or s)
+        else
+         -- context("")
+        end
     end
 
     function context.escape(s)
-        return lpegmatch(p_texescape,s) or s or ""
+        if s then
+            return lpegmatch(p_texescape,s) or s
+        else
+            return ""
+        end
     end
 
 end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv	2017-05-02 22:24:44 UTC (rev 44160)
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2017.04.20 21:31}
+\newcontextversion{2017.04.27 01:00}
 
 %D This file is loaded at runtime, thereby providing an excellent place for
 %D hacks, patches, extensions and new features.

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/context.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/context.mkiv	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/context.mkiv	2017-05-02 22:24:44 UTC (rev 44160)
@@ -39,7 +39,7 @@
 %D up and the dependencies are more consistent.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2017.04.20 21:31}
+\edef\contextversion{2017.04.27 01:00}
 \edef\contextkind   {beta}
 
 %D For those who want to use this:
@@ -443,6 +443,8 @@
 
 \loadmarkfile{scrp-ini}
 
+\loadmarkfile{symb-emj}
+
 \loadmarkfile{lang-wrd} % can be optional (discussion with mm sideeffect)
 \loadmarkfile{lang-rep} % can be optional (bt 2013 side effect)
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1831,6 +1831,9 @@
             r = r + 1
             result[r] = c_endchar
             local stream = concat(result)
+         -- if trace_charstrings then
+         --     report("vdata: %s",stream)
+         -- end
             if glyph then
                 glyph.stream  = stream
             else
@@ -2082,7 +2085,9 @@
     local dictionary   = dictionaries[1]
     readglobals(f,data)
     readcharstrings(f,data,version)
-    if version ~= "cff2" then
+    if version == "cff2" then
+        dictionary.charset = nil
+    else
         readencodings(f,data)
         readcharsets(f,data,dictionary)
     end
@@ -2248,11 +2253,17 @@
         --
         parsedictionaries(data,dictionaries,"cff2")
         --
-        local storeoffset = dictionaries[1].vstore + data.header.offset + 2 -- cff has a preceding size field
-        local regions, deltas = readers.helpers.readvariationdata(f,storeoffset,factors)
-        --
-        data.regions  = regions
-        data.deltas   = deltas
+        local offset = dictionaries[1].vstore
+        if offset > 0 then
+            local storeoffset = dictionaries[1].vstore + data.header.offset + 2 -- cff has a preceding size field
+            local regions, deltas = readers.helpers.readvariationdata(f,storeoffset,factors)
+            --
+            data.regions  = regions
+            data.deltas   = deltas
+        else
+            data.regions  = { }
+            data.deltas   = { }
+        end
         data.factors  = specification.factors
         --
         local cid = data.dictionaries[1].cid

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -125,14 +125,15 @@
                 offset = tonumber(offset) or false
             end
             d[#d+1] = {
-                font   = font,
-                start  = start,
-                stop   = stop,
-                gaps   = gaps,
-                offset = offset,
-                rscale = tonumber (details.rscale) or 1,
-                force  = toboolean(details.force,true),
-                check  = toboolean(details.check,true),
+                font     = font,
+                start    = start,
+                stop     = stop,
+                gaps     = gaps,
+                offset   = offset,
+                rscale   = tonumber (details.rscale) or 1,
+                force    = toboolean(details.force,true),
+                check    = toboolean(details.check,true),
+                features = details.features,
             }
         end
     end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.mkvi
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.mkvi	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-col.mkvi	2017-05-02 22:24:44 UTC (rev 44160)
@@ -34,7 +34,9 @@
 \unexpanded\def\resetfontfallback {\dodoubleempty   \font_fallbacks_reset }
 
 \def\font_fallbacks_define[#name][#font][#ranges][#settings]%
-  {\clf_fontcollectiondefine{#name}{#font}{#ranges}{#settings}}
+  {\let\mathsizesuffix\relax
+   \clf_fontcollectiondefine{#name}{#font}{#ranges}{#settings}%
+   \let\mathsizesuffix\empty}
 
 \def\font_fallbacks_reset[#name][#font]%
   {\clf_fontcollectionreset{#name}{#font}}
@@ -92,6 +94,17 @@
 \def\font_fallbacks_register_main        #name{\clf_fontcollectionregister{#name}}
 \def\font_fallbacks_prepare_clone_vectors#name{\clf_fontcollectionclone{#name}}
 
+% math (experiment, todo clf_)
+
+\def\font_fallbacks_register_math#1#2#3#4%
+  {\doifelsenothing{#3}%
+      {\definedfont[#2 at #4sp]}%
+      {\definedfont[#2*#3\space at #4\scaledpoint]}%
+   \ctxlua{mathematics.registerfallbackid(#1,\fontid\font)}}
+
+\def\font_fallbacks_finish_math
+  {\ctxlua{mathematics.finishfallbacks()}}
+
 % check : only replace when present in replacement font (default: no)
 % force : force replacent even when basefont has glyph  (default: yes)
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -2749,25 +2749,33 @@
 do
 
     local settings_to_array    = utilities.parsers.settings_to_array
-    local namedcolorattributes = attributes.colors.namedcolorattributes
-    local colorvalues          = attributes.colors.values
+ -- local namedcolorattributes = attributes.colors.namedcolorattributes
+ -- local colorvalues          = attributes.colors.values
 
+ -- implement {
+ --     name      = "definefontcolorpalette",
+ --     arguments = { "string", "string" },
+ --     actions   = function(name,set)
+ --         set = settings_to_array(set)
+ --         for i=1,#set do
+ --             local name = set[i]
+ --             local space, color = namedcolorattributes(name)
+ --             local values = colorvalues[color]
+ --             if values then
+ --                 set[i] = { r = values[3], g = values[4],  b = values[5] }
+ --             else
+ --                 set[i] = { r = 0, g = 0, b = 0 }
+ --             end
+ --         end
+ --         otf.registerpalette(name,set)
+ --     end
+ -- }
+
     implement {
         name      = "definefontcolorpalette",
         arguments = { "string", "string" },
         actions   = function(name,set)
-            set = settings_to_array(set)
-            for i=1,#set do
-                local name = set[i]
-                local space, color = namedcolorattributes(name)
-                local values = colorvalues[color]
-                if values then
-                    set[i] = { r = values[3], g = values[4],  b = values[5] }
-                else
-                    set[i] = { r = 0, g = 0, b = 0 }
-                end
-            end
-            otf.registerpalette(name,set)
+            otf.registerpalette(name,settings_to_array(set))
         end
     }
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -889,7 +889,13 @@
             if index > length then
                 length = index
             end
-            lookups[index] = readushort(f) + 1
+            local lookup = readushort(f) + 1
+            local list   = lookups[index]
+            if list then
+                list[#list+1] = lookup
+            else
+                lookups[index] = { lookup }
+            end
         end
         for index=1,length do
             if not lookups[index] then
@@ -2185,50 +2191,63 @@
                             report_issue(i,what,sequence,"empty")
                             rule.lookups = nil
                         else
-                            -- we can have holes in rlookups
+                            -- we can have holes in rlookups flagged false and we can have multiple lookups
+                            -- applied (first time seen in seguemj)
                             local length = #rlookups
                             for index=1,length do
-                                local lookupid = rlookups[index]
-                                if lookupid then
-                                    local h = sublookuphash[lookupid]
-                                    if not h then
-                                        -- here we have a lookup that is used independent as well
-                                        -- as in another one
-                                        local lookup = lookups[lookupid]
-                                        if lookup then
-                                            local d = lookup.done
-                                            if d then
-                                                nofsublookups = nofsublookups + 1
-                                             -- report("registering %i as sublookup %i",lookupid,nofsublookups)
-                                                h = {
-                                                    index     = nofsublookups, -- handy for tracing
-                                                    name      = f_lookupname(lookupprefix,"d",lookupid+lookupidoffset),
-                                                    derived   = true,          -- handy for tracing
-                                                    steps     = d.steps,
-                                                    nofsteps  = d.nofsteps,
-                                                    type      = d.lookuptype or "gsub_single", -- todo: check type
-                                                    markclass = d.markclass or nil,
-                                                    flags     = d.flags,
-                                                 -- chain     = d.chain,
-                                                }
-                                                sublookuplist[nofsublookups] = copy(h) -- we repack later
-                                                sublookuphash[lookupid] = nofsublookups
-                                                sublookupcheck[lookupid] = 1
-                                                h = nofsublookups
+                                local lookuplist = rlookups[index]
+                                if lookuplist then
+                                    local length   = #lookuplist
+                                    local found    = { }
+                                    local noffound = 0
+                                    for index=1,length do
+                                        local lookupid = lookuplist[index]
+                                        if lookupid then
+                                            local h = sublookuphash[lookupid]
+                                            if not h then
+                                                -- here we have a lookup that is used independent as well
+                                                -- as in another one
+                                                local lookup = lookups[lookupid]
+                                                if lookup then
+                                                    local d = lookup.done
+                                                    if d then
+                                                        nofsublookups = nofsublookups + 1
+                                                     -- report("registering %i as sublookup %i",lookupid,nofsublookups)
+                                                        h = {
+                                                            index     = nofsublookups, -- handy for tracing
+                                                            name      = f_lookupname(lookupprefix,"d",lookupid+lookupidoffset),
+                                                            derived   = true,          -- handy for tracing
+                                                            steps     = d.steps,
+                                                            nofsteps  = d.nofsteps,
+                                                            type      = d.lookuptype or "gsub_single", -- todo: check type
+                                                            markclass = d.markclass or nil,
+                                                            flags     = d.flags,
+                                                         -- chain     = d.chain,
+                                                        }
+                                                        sublookuplist[nofsublookups] = copy(h) -- we repack later
+                                                        sublookuphash[lookupid] = nofsublookups
+                                                        sublookupcheck[lookupid] = 1
+                                                        h = nofsublookups
+                                                    else
+                                                        report_issue(i,what,sequence,"missing")
+                                                        rule.lookups = nil
+                                                        break
+                                                    end
+                                                else
+                                                    report_issue(i,what,sequence,"bad")
+                                                    rule.lookups = nil
+                                                    break
+                                                end
                                             else
-                                                report_issue(i,what,sequence,"missing")
-                                                rule.lookups = nil
-                                                break
+                                                sublookupcheck[lookupid] = sublookupcheck[lookupid] + 1
                                             end
-                                        else
-                                            report_issue(i,what,sequence,"bad")
-                                            rule.lookups = nil
-                                            break
+                                            if h then
+                                                noffound = noffound + 1
+                                                found[noffound] = h
+                                            end
                                         end
-                                    else
-                                        sublookupcheck[lookupid] = sublookupcheck[lookupid] + 1
                                     end
-                                    rlookups[index] = h or false
+                                    rlookups[index] = noffound > 0 and found or false
                                 else
                                     rlookups[index] = false
                                 end
@@ -3388,7 +3407,7 @@
                 default = readfixed(f), -- idem
                 maximum = readfixed(f), -- idem
                 flags   = readushort(f),
-                name    = lower(extras[readushort(f)]),
+                name    = lower(extras[readushort(f)] or "bad name"),
             }
             local n = sizeofaxis - 20
             if n > 0 then

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-mat.mkvi
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-mat.mkvi	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-mat.mkvi	2017-05-02 22:24:44 UTC (rev 44160)
@@ -127,14 +127,16 @@
                                                                                                   \settrue \c_font_auto_size
    \fi\fi}
 
+\let\mathsizesuffix\empty
+
 \def\font_helpers_set_math_family_indeed#mrtag#family% \fontface etc are also used later on
   {\let\savedfontbody\fontbody
    \let\fontfamily#family%
    % the order is important as we depend on known id's when completing fonts
-   \let\fontface\!!plusthree\font_helpers_set_math_family_a\scriptscriptfont#mrtag\font
-   \let\fontface\!!plustwo  \font_helpers_set_math_family_a\scriptfont      #mrtag\font
-   \let\fontface\!!plusone  \font_helpers_set_math_family_a\textfont        #mrtag\font
-   \let\fontface\!!zerocount
+   \let\mathsizesuffix\mathtextsuffix        \let\fontface\!!plusthree\font_helpers_set_math_family_a\scriptscriptfont#mrtag\font
+   \let\mathsizesuffix\mathscriptsuffix      \let\fontface\!!plustwo  \font_helpers_set_math_family_a\scriptfont      #mrtag\font
+   \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusone  \font_helpers_set_math_family_a\textfont        #mrtag\font
+   \let\mathsizesuffix\empty                 \let\fontface\!!zerocount
    \let\fontbody\savedfontbody
    \setfalse\c_font_auto_size}
 
@@ -159,10 +161,10 @@
    \let\defaultfontclass\fontclass % else truefontname falls back on the wrong one
    \let\savedfontbody\fontbody
    \let\fontfamily#familytag%
-   \let\fontface\!!plusthree\font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam%
-   \let\fontface\!!plustwo  \font_helpers_set_math_family_bold_a\scriptfont      #mbfam#mrfam%
-   \let\fontface\!!plusone  \font_helpers_set_math_family_bold_a\textfont        #mbfam#mrfam%
-   \let\fontface\!!zerocount
+   \let\mathsizesuffix\mathtextsuffix        \let\fontface\!!plusthree\font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam%
+   \let\mathsizesuffix\mathscriptsuffix      \let\fontface\!!plustwo  \font_helpers_set_math_family_bold_a\scriptfont      #mbfam#mrfam%
+   \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusone  \font_helpers_set_math_family_bold_a\textfont        #mbfam#mrfam%
+   \let\mathsizesuffix\empty                 \let\fontface\!!zerocount
    \let\fontbody\savedfontbody
    \let\defaultfontclass\savedfontclass
    \setfalse\c_font_auto_size}

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -21,7 +21,7 @@
 
 if readers then
 
-    otf.version = otf.version or 3.027
+    otf.version = otf.version or 3.029
     otf.cache   = otf.cache   or containers.define("fonts", "otl", otf.version, true)
 
     function fonts.helpers.getfeatures(name,save)

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -439,7 +439,10 @@
         local n = copy_node_list(h)
         freeze(n,"check")
         injections.keepcounts(n) -- one-time
-        injections.handler(n,"trace")
+        local l = injections.handler(n,"trace")
+        if l then -- hm, can be false
+            n = tonut(l)
+        end
         protect_glyphs(n)
         collection[1] = n
     end
@@ -453,7 +456,10 @@
             local n = copy_node_list(h)
             freeze(n,"register")
             injections.keepcounts(n) -- one-time
-            injections.handler(n,"trace")
+            local l = injections.handler(n,"trace")
+            if l then -- hm, can be false
+                n = tonut(l)
+            end
             protect_glyphs(n)
             collection[nc] = n
         end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -19,7 +19,6 @@
 
 local f_color    = formatters["pdf:direct:%f %f %f rg"]
 local f_gray     = formatters["pdf:direct:%f g"]
-local s_black    = "pdf:direct:0 g"
 
 if context then
 
@@ -48,32 +47,40 @@
 
 local sharedpalettes = { }
 
+local hash = table.setmetatableindex(function(t,k)
+    local v = { "special", k }
+    t[k] = v
+    return v
+end)
+
 if context then
 
-    local graytorgb = attributes.colors.graytorgb
-    local cmyktorgb = attributes.colors.cmyktorgb
+    local colors          = attributes.list[attributes.private('color')] or { }
+    local transparencies  = attributes.list[attributes.private('transparency')] or { }
 
     function otf.registerpalette(name,values)
         sharedpalettes[name] = values
         for i=1,#values do
             local v = values[i]
-            local r, g, b
-            local s = v.s
-            if s then
-                r, g, b = graytorgb(s)
+            local c = nil
+            local t = nil
+            if type(v) == "table" then
+                c = colors.register(name,"rgb",
+                    max(round((v.r or 0)*255),255)/255,
+                    max(round((v.g or 0)*255),255)/255,
+                    max(round((v.b or 0)*255),255)/255
+                )
             else
-                local c, m, y, k = v.c, v.m, v.y, v.k
-                if c or m or y or k then
-                    r, g, b = cmyktorgb(c or 0,m or 0,y or 0,k or 0)
-                else
-                    r, g, b = v.r, v.g, v.b
-                end
+                c = colors[v]
+                t = transparencies[v]
             end
-            values[i] = {
-                max(r and round(r*255) or 0,255),
-                max(g and round(g*255) or 0,255),
-                max(b and round(b*255) or 0,255)
-            }
+            if c and t then
+                values[i] = hash["pdf:direct:" .. lpdf.color(1,c) .. " " .. lpdf.transparency(t)]
+            elseif c then
+                values[i] = hash["pdf:direct:" .. lpdf.color(1,c)]
+            elseif t then
+                values[i] = hash["pdf:direct:" .. lpdf.color(1,t)]
+            end
         end
     end
 
@@ -83,23 +90,51 @@
         sharedpalettes[name] = values
         for i=1,#values do
             local v = values[i]
-            values[i] = {
-                max(round((v.r or 0)*255),255),
-                max(round((v.g or 0)*255),255),
-                max(round((v.b or 0)*255),255)
-            }
+            values[i] = hash[f_color(
+                max(round((v.r or 0)*255),255)/255,
+                max(round((v.g or 0)*255),255)/255,
+                max(round((v.b or 0)*255),255)/255
+            )]
         end
     end
 
 end
 
+-- We need to force page first because otherwise the q's get outside
+-- the font switch and as a consequence the next character has no font
+-- set (well, it has: the preceding one). As a consequence these fonts
+-- are somewhat inefficient as each glyph gets the font set. It's a
+-- side effect of the fact that a font is handled when a character gets
+-- flushed.
+
+local function convert(t,k)
+    local v = { }
+    for i=1,#k do
+        local p = k[i]
+        local r, g, b = p[1], p[2], p[3]
+        if r == g and g == b then
+            v[i] = hash[f_gray(r/255)]
+        else
+            v[i] = hash[f_color(r/255,g/255,b/255)]
+        end
+    end
+    t[k] = v
+    return v
+end
+
 local function initializecolr(tfmdata,kind,value) -- hm, always value
     if value then
-        local palettes = tfmdata.resources.colorpalettes
+        local resources = tfmdata.resources
+        local palettes  = resources.colorpalettes
         if palettes then
             --
-            local palette = sharedpalettes[value] or palettes[tonumber(value) or 1] or palettes[1] or { }
-            local classes = #palette
+            local converted = resources.converted
+            if not converted then
+                converted = table.setmetatableindex(convert)
+                resources.converted = converted
+            end
+            local colorvalues = sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or { }
+            local classes     = #colorvalues
             if classes == 0 then
                 return
             end
@@ -107,24 +142,22 @@
             local characters   = tfmdata.characters
             local descriptions = tfmdata.descriptions
             local properties   = tfmdata.properties
-            local colorvalues  = { }
             --
             properties.virtualized = true
             tfmdata.fonts = {
                 { id = 0 }
             }
+            local widths = table.setmetatableindex(function(t,k)
+                local v = { "right", -k }
+                t[k] = v
+                return v
+            end)
             --
-            for i=1,classes do
-                local p = palette[i]
-                local r, g, b = p[1], p[2], p[3]
-                if r == g and g == b then
-                    colorvalues[i] = { "special", f_gray(r/255) }
-                else
-                    colorvalues[i] = { "special", f_color(r/255,g/255,b/255) }
-                end
-            end
-            --
             local getactualtext = otf.getactualtext
+            local default       = colorvalues[#colorvalues]
+            local endactual     = nil
+            local start         = { "special", "pdf:page:q" }
+            local stop          = { "special", "pdf:raw:Q" }
             --
             for unicode, character in next, characters do
                 local description = descriptions[unicode]
@@ -134,31 +167,30 @@
                         local b, e = getactualtext(tounicode(characters[unicode].unicode or 0xFFFD))
                         local w = character.width or 0
                         local s = #colorlist
+                        local goback = w ~= 0 and widths[w] or nil
                         local t = {
-                            -- We need to force page first because otherwise the q's get outside
-                            -- the font switch and as a consequence the next character has no font
-                            -- set (well, it has: the preceding one). As a consequence these fonts
-                            -- are somewhat inefficient as each glyph gets the font set. It's a
-                            -- side effect of the fact that a font is handled when a character gets
-                            -- flushed.
-                            { "special", "pdf:page:q" },
+                            start,
                             { "special", "pdf:raw:" .. b }
-                            -- This is not ok:
-                         -- { "special", "pdf:direct:q " .. b },
                         }
                         local n = #t
+                        local l = nil
                         for i=1,s do
                             local entry = colorlist[i]
-                            n = n + 1 t[n] = colorvalues[entry.class] or s_black
+                            local v = colorvalues[entry.class] or default
+                            if v and l ~= v then
+                                n = n + 1 t[n] = v
+                                l = v
+                            end
                             n = n + 1 t[n] = { "char", entry.slot }
-                            if s > 1 and i < s and w ~= 0 then
-                                n = n + 1 t[n] = { "right", -w }
+                            if s > 1 and i < s and goback then
+                                n = n + 1 t[n] = goback
                             end
                         end
-                        n = n + 1 t[n] = { "special", "pdf:page:" .. e }
-                        n = n + 1 t[n] = { "special", "pdf:raw:Q" }
-                        -- This is not ok:
-                     -- n = n + 1 t[n] = { "special", "pdf:direct:" .. e .. " Q"}
+                        if not endactual then
+                            endactual = { "special", "pdf:page:" .. e } -- saves tables
+                        end
+                        n = n + 1 t[n] = endactual
+                        n = n + 1 t[n] = stop
                         character.commands = t
                     end
                 end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -446,10 +446,16 @@
                         local t = type(v)
                         if t == "table" then
                             -- already ok
+                            for i=1,#v do
+                                local vi = v[i]
+                                if type(vi) ~= "table" then
+                                    v[i] = { vi }
+                                end
+                            end
                         elseif t == "number" then
                             local lookup = sublookups[v]
                             if lookup then
-                                lookups[k] = lookup
+                                lookups[k] = { lookup }
                                 if not subtype then
                                     subtype = lookup.type
                                 end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -575,7 +575,7 @@
                     -- left|glyph|right
                     local leftkern = i.leftkern
                     if leftkern and leftkern ~= 0 then
-                        insert_node_before(head,current,newkern(leftkern))
+                        head = insert_node_before(head,current,newkern(leftkern))
                     end
                 end
                 if prevdisc then
@@ -1007,7 +1007,7 @@
                         ox = px - pn.markx
                     end
                 else
-                    ox = px - pn.markx
+                    ox = px - pn.markx - rightkern -- seguiemj needs the rightkern
                 end
             end
         else
@@ -1032,6 +1032,7 @@
                     -- -- we're too late anyway as kerns are already injected so
                     -- -- we do it the ugly way (no checking if the previous is
                     -- -- already a kern) .. maybe we should fix the font instead
+                    -- hm, no head ?
                     insert_node_before(n,n,newkern(-wn))
                     insert_node_after(n,n,newkern(-wn))
                 end
@@ -1116,7 +1117,7 @@
                         -- left|glyph|right
                         local leftkern = i.leftkern
                         if leftkern and leftkern ~= 0 then
-                            insert_node_before(head,current,newkern(leftkern))
+                            head = insert_node_before(head,current,newkern(leftkern))
                         end
                         local rightkern = i.rightkern
                         if rightkern and rightkern ~= 0 then

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -52,7 +52,7 @@
 local fonts               = fonts
 local otf                 = fonts.handlers.otf
 
-otf.version               = 3.028 -- beware: also sync font-mis.lua and in mtx-fonts
+otf.version               = 3.029 -- beware: also sync font-mis.lua and in mtx-fonts
 otf.cache                 = containers.define("fonts", "otl",  otf.version, true)
 otf.svgcache              = containers.define("fonts", "svg",  otf.version, true)
 otf.sbixcache             = containers.define("fonts", "sbix", otf.version, true)

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -83,6 +83,9 @@
 local trace_cmap        = false -- only for checking issues
 local trace_cmap_detail = false -- only for checking issues
 
+-- local trace_cmap        = true
+-- local trace_cmap_detail = true
+
 fonts                   = fonts or { }
 local handlers          = fonts.handlers or { }
 fonts.handlers          = handlers
@@ -1275,6 +1278,7 @@
     -- variants
     { 0,  5, 14 },
     -- last resort ranges
+{ 0,  4, 12 },
     { 3, 10, 13 },
 }
 
@@ -2075,19 +2079,27 @@
             local instance = specification.instance
             if type(instance) == "string" then
                 local factors = helpers.getfactors(fontdata,instance)
-                specification.factors = factors
-                fontdata.factors  = factors
-                fontdata.instance = instance
-                report("user instance: %s, factors: % t",instance,factors)
+                if factors then
+                    specification.factors = factors
+                    fontdata.factors  = factors
+                    fontdata.instance = instance
+                    report("user instance: %s, factors: % t",instance,factors)
+                else
+                    report("user instance: %s, bad factors",instance)
+                end
             end
         end
         if not fontdata.factors then
             if fontdata.variabledata then
                 local factors = helpers.getfactors(fontdata,true)
-                specification.factors = factors
-                fontdata.factors  = factors
-                fontdata.instance = instance
-                report("font instance: %s, factors: % t",instance,factors)
+                if factors then
+                    specification.factors = factors
+                    fontdata.factors  = factors
+                    fontdata.instance = instance
+                    report("font instance: %s, factors: % t",instance,factors)
+                else
+                    report("user instance: %s, bad factors",instance)
+                end
             end
         end
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1943,16 +1943,19 @@
          --     -- bad rules
          -- end
             local chainlookup = chainlookups[1]
-            local chainkind   = chainlookup.type
-            local chainproc   = chainprocs[chainkind]
-            if chainproc then
-                local ok
-                head, start, ok = chainproc(head,start,last,dataset,sequence,chainlookup,rlmode,1)
-                if ok then
-                    done = true
+            for j=1,#chainlookup do
+                local chainstep = chainlookup[j]
+                local chainkind = chainstep.type
+                local chainproc = chainprocs[chainkind]
+                if chainproc then
+                    local ok
+                    head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,1)
+                    if ok then
+                        done = true
+                    end
+                else
+                    logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind)
                 end
-            else
-                logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind)
             end
          else
             -- See LookupType 5: Contextual Substitution Subtable. Now it becomes messy. The
@@ -1963,6 +1966,8 @@
             --
             -- U+1105 U+119E U+1105 U+119E : sourcehansansklight: script=hang ccmp=yes
             --
+            -- Even worse are these family emoji shapes as they can have multiple lookups
+            -- per slot (probably only for gpos).
             local i = 1
             while start do
                 if skipped then
@@ -1982,22 +1987,25 @@
                 end
                 local chainlookup = chainlookups[i]
                 if chainlookup then
-                    local chainkind = chainlookup.type
-                    local chainproc = chainprocs[chainkind]
-                    if chainproc then
-                        local ok, n
-                        head, start, ok, n = chainproc(head,start,last,dataset,sequence,chainlookup,rlmode,i)
-                        -- messy since last can be changed !
-                        if ok then
-                            done = true
-                            if n and n > 1 and i + n > nofchainlookups then
-                                -- this is a safeguard, we just ignore the rest of the lookups
-                                break
+                    for j=1,#chainlookup do
+                        local chainstep = chainlookup[j]
+                        local chainkind = chainstep.type
+                        local chainproc = chainprocs[chainkind]
+                        if chainproc then
+                            local ok, n
+                            head, start, ok, n = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,i)
+                            -- messy since last can be changed !
+                            if ok then
+                                done = true
+                                if n and n > 1 and i + n > nofchainlookups then
+                                    -- this is a safeguard, we just ignore the rest of the lookups
+                                    break
+                                end
                             end
+                        else
+                            -- actually an error
+                            logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind)
                         end
-                    else
-                        -- actually an error
-                        logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind)
                     end
                 end
                 i = i + 1

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -891,7 +891,7 @@
         unifymissing(fontdata)
      -- stripredundant(fontdata)
     else
-        fontdata.hashmethod = "unicode"
+        fontdata.hashmethod = "unicodes"
         local indices = unifyglyphs(fontdata)
         unifyresources(fontdata,indices)
         copyduplicates(fontdata)
@@ -908,10 +908,10 @@
     elseif hashmethod == "names" and fontdata.names then
         unifyresources(fontdata,fontdata.names)
         copyduplicates(fontdata)
-        fontdata.hashmethod = "unicode"
+        fontdata.hashmethod = "unicodes"
         fontdata.names = nil -- no need for it
     else
-        readers.rehash(fontdata,"unicode")
+        readers.rehash(fontdata,"unicodes")
     end
 end
 
@@ -1332,7 +1332,7 @@
                                     local r = rule.before       if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end
                                     local r = rule.after        if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end
                                     local r = rule.current      if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end
-                                    local r = rule.lookups      if r then rule.lookups       = pack_mixed  (r)    end
+                                 -- local r = rule.lookups      if r then rule.lookups       = pack_mixed  (r)    end
                                     local r = rule.replacements if r then rule.replacements  = pack_flat   (r)    end
                                 end
                             end
@@ -1795,13 +1795,13 @@
                                             end
                                         end
                                     end
-                                    local lookups = rule.lookups
-                                    if lookups then
-                                        local tv = tables[lookups]
-                                        if tv then
-                                            rule.lookups = tv
-                                        end
-                                    end
+                                 -- local lookups = rule.lookups
+                                 -- if lookups then
+                                 --     local tv = tables[lookups]
+                                 --     if tv then
+                                 --         rule.lookups = tv
+                                 --     end
+                                 -- end
                                     local replacements = rule.replacements
                                     if replacements then
                                         local tv = tables[replacements]
@@ -2334,16 +2334,20 @@
                                 local lookups = rule.lookups or false
                                 local subtype = nil
                                 if lookups then
-                                    -- is now indexed
-                                    for k, v in next, lookups do
-                                        local lookup = sublookups[v]
-                                        if lookup then
-                                            lookups[k] = lookup
-                                            if not subtype then
-                                                subtype = lookup.type
+                                    for i=1,#lookups do
+                                        local lookups = lookups[i]
+                                        if lookups then
+                                            for k, v in next, lookups do
+                                                local lookup = sublookups[v]
+                                                if lookup then
+                                                    lookups[k] = lookup
+                                                    if not subtype then
+                                                        subtype = lookup.type
+                                                    end
+                                                else
+                                                    -- already expanded
+                                                end
                                             end
-                                        else
-                                            -- already expanded
                                         end
                                     end
                                 end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv	2017-05-02 22:24:44 UTC (rev 44160)
@@ -336,6 +336,15 @@
   [boldened]
   [extend=1.2]
 
+%D Emoji:
+
+\definefontfeature[bandw:overlay][ccmp=yes,dist=yes]
+\definefontfeature[color:overlay][ccmp=yes,dist=yes,colr=yes]
+%definefontfeature[bandw:svg]    [ccmp=yes,dist=yes]
+\definefontfeature[color:svg]    [ccmp=yes,dist=yes,svg=yes]
+%definefontfeature[bandw:bitmap] [ccmp=yes,dist=yes,sbix=yes]
+\definefontfeature[color:bitmap] [ccmp=yes,dist=yes,sbix=yes]
+
 %D We define some colors that are used in tracing (for instance \OPENTYPE\
 %D features). We cannot yet inherit because no colors are predefined.
 

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/l-table.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/l-table.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/l-table.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -555,7 +555,7 @@
 --     return nil
 -- end
 
-local function is_simple_table(t) -- also used in util-tab so maybe public
+local function is_simple_table(t,hexify) -- also used in util-tab so maybe public
     local nt = #t
     if nt > 0 then
         local n = 0
@@ -699,7 +699,7 @@
                     if next(v) == nil then
                         handle(format("%s {},",depth))
                     elseif inline then -- and #t > 0
-                        local st = is_simple_table(v)
+                        local st = is_simple_table(v,hexify)
                         if st then
                             handle(format("%s { %s },",depth,concat(st,", ")))
                         else
@@ -785,7 +785,7 @@
                         handle(format("%s [%q]={},",depth,k))
                     end
                 elseif inline then
-                    local st = is_simple_table(v)
+                    local st = is_simple_table(v,hexify)
                     if st then
                         if tk == "number" then
                             if hexify then

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -421,7 +421,7 @@
 
 -- transparency
 
-local transparencies = { [0] =
+local pdftransparencies = { [0] =
     pdfconstant("Normal"),
     pdfconstant("Normal"),
     pdfconstant("Multiply"),
@@ -453,7 +453,7 @@
               Type = pdf_extgstate,
               ca   = 1,
               CA   = 1,
-              BM   = transparencies[1],
+              BM   = pdftransparencies[1],
               AIS  = false,
             }
         local m = pdfflushobject(d)
@@ -468,7 +468,7 @@
               Type = pdf_extgstate,
               ca   = tonumber(t),
               CA   = tonumber(t),
-              BM   = transparencies[tonumber(a)] or transparencies[0],
+              BM   = pdftransparencies[tonumber(a)] or pdftransparencies[0],
               AIS  = false,
             }
         local m = pdfflushobject(d)

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/math-act.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/math-act.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/math-act.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -590,7 +590,92 @@
 
 -- todo: tounicode
 
+-- function mathematics.injectfallbacks(target,original)
+--     local properties = original.properties
+--     if properties and properties.hasmath then
+--         local specification = target.specification
+--         if specification then
+--             local fallbacks = specification.fallbacks
+--             if fallbacks then
+--                 local definitions = fonts.collections.definitions[fallbacks]
+--                 if definitions then
+--                     if trace_collecting then
+--                         report_math("adding fallback characters to font %a",specification.hash)
+--                     end
+--                     local definedfont = fonts.definers.internal
+--                     local copiedglyph = fonts.handlers.vf.math.copy_glyph
+--                     local fonts       = target.fonts
+--                     local size        = specification.size -- target.size
+--                     local characters  = target.characters
+--                     if not fonts then
+--                         fonts = { }
+--                         target.fonts = fonts
+--                         target.type = "virtual"
+--                         target.properties.virtualized = true
+--                     end
+--                     if #fonts == 0 then
+--                         fonts[1] = { id = 0, size = size } -- sel, will be resolved later
+--                     end
+--                     local done = { }
+--                     for i=1,#definitions do
+--                         local definition = definitions[i]
+--                         local name   = definition.font
+--                         local start  = definition.start
+--                         local stop   = definition.stop
+--                         local gaps   = definition.gaps
+--                         local check  = definition.check
+--                         local force  = definition.force
+--                         local rscale = definition.rscale or 1
+--                         local offset = definition.offset or start
+--                         local id     = definedfont { name = name, size = size * rscale }
+--                         local index  = #fonts + 1
+--                         fonts[index] = { id = id, size = size }
+--                         local chars  = fontchars[id]
+--                         local function remap(unic,unicode,gap)
+--                             local unic = unicode + offset - start
+--                             if check and not chars[unicode] then
+--                                 -- not in font
+--                             elseif force or (not done[unic] and not characters[unic]) then
+--                                 if trace_collecting then
+--                                     report_math("remapping math character, vector %a, font %a, character %C%s%s",
+--                                         fallbacks,name,unic,check and ", checked",gap and ", gap plugged")
+--                                 end
+--                                 characters[unic] = copiedglyph(target,characters,chars,unicode,index)
+--                                 done[unic] = true
+--                             end
+--                         end
+--                         for unicode = start, stop do
+--                             local unic = unicode + offset - start
+--                             remap(unic,unicode,false)
+--                         end
+--                         if gaps then
+--                             for unic, unicode in next, gaps do
+--                                 remap(unic,unicode,true)
+--                             end
+--                         end
+--                     end
+--                 end
+--             end
+--         end
+--     end
+-- end
+
+local stack = { }
+
+function mathematics.registerfallbackid(n,id)
+    local top = stack[#stack]
+    if top then
+        top.list[n] = id
+    else
+        report_math("stack underrun in math fallbacks")
+    end
+end
+
 function mathematics.injectfallbacks(target,original)
+    if #stack > 0 then
+        -- for now
+        return
+    end
     local properties = original.properties
     if properties and properties.hasmath then
         local specification = target.specification
@@ -599,9 +684,51 @@
             if fallbacks then
                 local definitions = fonts.collections.definitions[fallbacks]
                 if definitions then
+                    table.insert(stack, {
+                        target   = target,
+                        original = original,
+                        list     = { },
+                    })
                     if trace_collecting then
                         report_math("adding fallback characters to font %a",specification.hash)
                     end
+                    local size = specification.size -- target.size
+                    context.pushcatcodes("prt") -- context.unprotect()
+                    for i=1,#definitions do
+                        local definition = definitions[i]
+                        local name       = definition.font
+                        local features   = definition.features or ""
+                        local size       = size * (definition.rscale or 1)
+                        context.font_fallbacks_register_math(i,name,features,size)
+                    end
+                    context.font_fallbacks_finish_math()
+                    context.popcatcodes()
+                end
+            end
+        end
+    end
+end
+
+function mathematics.finishfallbacks()
+    local top      = table.remove(stack)
+    if not top then
+        report_math("finish error in math fallbacks")
+        return
+    end
+    local target   = top.target
+    local original = top.original
+    local list     = top.list
+    local properties = original.properties
+    if properties and properties.hasmath then
+        local specification = target.specification
+        if specification then
+            local fallbacks = specification.fallbacks
+            if fallbacks then
+                local definitions = fonts.collections.definitions[fallbacks]
+                if definitions then
+                    if trace_collecting then
+                        report_math("adding fallback characters to font %a",specification.hash)
+                    end
                     local definedfont = fonts.definers.internal
                     local copiedglyph = fonts.handlers.vf.math.copy_glyph
                     local fonts       = target.fonts
@@ -627,33 +754,38 @@
                         local force  = definition.force
                         local rscale = definition.rscale or 1
                         local offset = definition.offset or start
-                        local id     = definedfont { name = name, size = size * rscale }
-                        local index  = #fonts + 1
-                        fonts[index] = { id = id, size = size }
-                        local chars  = fontchars[id]
-                        local function remap(unic,unicode,gap)
-                            local unic = unicode + offset - start
-                            if check and not chars[unicode] then
-                                -- not in font
-                            elseif force or (not done[unic] and not characters[unic]) then
-                                if trace_collecting then
-                                    report_math("remapping math character, vector %a, font %a, character %C%s%s",
-                                        fallbacks,name,unic,check and ", checked",gap and ", gap plugged")
+                        local id     = list[i]
+                        if id then
+                            local index  = #fonts + 1
+                            fonts[index] = { id = id, size = size }
+                            local chars  = fontchars[id]
+                            local function remap(unic,unicode,gap)
+                                local unic = unicode + offset - start
+                                if check and not chars[unicode] then
+                                    -- not in font
+                                elseif force or (not done[unic] and not characters[unic]) then
+                                    if trace_collecting then
+                                        report_math("remapping math character, vector %a, font %a, character %C%s%s",
+                                            fallbacks,name,unic,check and ", checked",gap and ", gap plugged")
+                                    end
+                                    characters[unic] = copiedglyph(target,characters,chars,unicode,index)
+                                    done[unic] = true
                                 end
-                                characters[unic] = copiedglyph(target,characters,chars,unicode,index)
-                                done[unic] = true
                             end
-                        end
-                        for unicode = start, stop do
-                            local unic = unicode + offset - start
-                            remap(unic,unicode,false)
-                        end
-                        if gaps then
-                            for unic, unicode in next, gaps do
-                                remap(unic,unicode,true)
+                            for unicode = start, stop do
+                                local unic = unicode + offset - start
+                                remap(unic,unicode,false)
                             end
+                            if gaps then
+                                for unic, unicode in next, gaps do
+                                    remap(unic,unicode,true)
+                                end
+                            end
                         end
                     end
+                    xlist     = nil
+                    xtarget   = nil
+                    xoriginal = nil
                 end
             end
         end

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/node-typ.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/node-typ.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/node-typ.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -18,10 +18,11 @@
 local setfield        = nuts.setfield
 local setlink         = nuts.setlink
 local setchar         = nuts.setchar
------ setattrlist     = nuts.setattrlist
+local setattrlist     = nuts.setattrlist
 
 local getfield        = nuts.getfield
 local getfont         = nuts.getfont
+local getattrlist     = nuts.getattrlist
 
 local hpack_node_list = nuts.hpack
 local vpack_node_list = nuts.vpack
@@ -33,22 +34,28 @@
 
 local utfvalues       = utf.values
 
-local currentfont     = font.current
------ current_attr    = node.current_attr
+local currentfont     = font.current      -- mabe nicer is fonts     .current
+local currentattr     = node.current_attr -- mabe nicer is attributes.current
 local fontparameters  = fonts.hashes.parameters
 
-local function tonodes(str,fontid,spacing,templateglyph) -- quick and dirty
+-- when attrid == true then take from glyph or current else use the given value
+
+local function tonodes(str,fontid,spacing,templateglyph,attrid) -- quick and dirty
     local head, prev = nil, nil
- -- local attrid = nil
     if not fontid then
         if templateglyph then
             fontid = getfont(templateglyph)
-         -- attrid = setattrlist(templateglyph)
         else
             fontid = currentfont()
-         -- attrid = current_attr()
         end
     end
+    if attrid == true then
+        if templateglyph then
+            attrid = false -- we copy with the glyph
+        else
+            attrid = currentattr()
+        end
+    end
     local fp = fontparameters[fontid]
     local s, p, m
     if spacing then
@@ -75,10 +82,14 @@
         if not next then
             -- nothing
         elseif not head then
-         -- setattrlist(next,attrid)
+            if attrid then
+                setattrlist(next,attrid)
+            end
             head = next
         else
-         -- setattrlist(next,attrid)
+            if attrid then
+                setattrlist(next,attrid)
+            end
             setlink(prev,next)
         end
         prev = next

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/status-files.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/status-lua.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -0,0 +1,82 @@
+if not modules then modules = { } end modules ['symb-emj'] = {
+    version   = 1.001,
+    comment   = "companion to symb-emj.mkiv",
+    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+    copyright = "PRAGMA ADE / ConTeXt Development Team",
+    license   = "see context related readme files"
+}
+
+local symbols        = fonts.symbols
+
+-- emoji
+
+-- processors.hpack_filter does it all
+
+local resolvedemoji   = characters.emoji.resolve
+local processfeatures = fonts.handlers.otf.featuresprocessor
+local injectspacing   = nodes.injections.handler
+local protectglyphs   = nodes.handlers.protectglyphs
+local tonodes         = nodes.tonodes
+local currentfont     = font.current
+
+-- fast enough, no need to memoize
+
+local glyph_code   = nodes.nodecodes.glyph
+local remove_node  = nodes.remove
+local getid        = nodes.getid
+local getnext      = nodes.getnext
+local getchar      = nodes.getchar
+
+local function removemodifiers(head)
+    local current = head
+    while current do
+        if getid(current) == glyph_code then
+            local char = getchar(current) -- using categories is too much
+            if char == 0x200D or (char >= 0x1F3FB and char <= 0x1F3FF) then
+                head, current = remove_node(head,current,true)
+            else
+                current = getnext(current)
+            end
+        else
+            current = getnext(current)
+        end
+    end
+    return head
+end
+
+-- attributes
+
+local function checkedemoji(name,id)
+    local str = resolvedemoji(name)
+    if str then
+        if not id then
+            id = currentfont()
+        end
+        local head = tonodes(str,id,nil,nil,true) -- use current attributes
+        head = processfeatures(head,id,false)
+        if head then
+            head = injectspacing(head)
+            protectglyphs(head)
+            return removemodifiers(head)
+        end
+    end
+end
+
+symbols.emoji = {
+    resolved = resolvedemoji,
+    checked  = checkedemoji,
+}
+
+interfaces.implement {
+    name      = "resolvedemoji",
+    actions   = { resolvedemoji, context.escaped },
+    arguments = "string",
+}
+
+interfaces.implement {
+    name      = "checkedemoji",
+    actions   = { checkedemoji, context },
+    arguments = "string",
+}
+
+


Property changes on: trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.mkiv	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/symb-emj.mkiv	2017-05-02 22:24:44 UTC (rev 44160)
@@ -0,0 +1,27 @@
+%D \module
+%D   [       file=symb-emj,
+%D        version=2017.04.21,
+%D          title=\CONTEXT\ Symbol Libraries,
+%D       subtitle=Emoji,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Symbol Libraries / Emoji}
+
+\registerctxluafile{symb-emj}{1.001}
+
+\unprotect
+
+           \def\expandedemoji#1{\clf_resolvedemoji{#1}}
+\unexpanded\def\resolvedemoji#1{\clf_resolvedemoji{#1}}
+\unexpanded\def\checkedemoji #1{\clf_checkedemoji {#1}}
+\unexpanded\def\emoji        #1{\dontleavehmode{\setdirectsymbolicfont{emoji}\clf_resolvedemoji{#1}}}
+\unexpanded\def\robustemoji  #1{\dontleavehmode{\setdirectsymbolicfont{emoji}\clf_checkedemoji {#1}}}
+
+
+\protect \endinput

Modified: trunk/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -575,7 +575,8 @@
             local baseline, baseskip
             if dp ~= 0 and ht ~= 0 then
                 if wd > 20*linewidth then
-                    baseline = b_cache[size]
+                    local targetsize = wd - size
+                    baseline = b_cache[targetsize]
                     if not baseline then
                         -- due to an optimized leader color/transparency we need to set the glue node in order
                         -- to trigger this mechanism
@@ -585,8 +586,8 @@
                         setleader(baseline,leader)
                         setsubtype(baseline,cleaders_code)
                         setlisttransparency(baseline,c_text)
-                        baseline = hpack_nodes(baseline,wd-size)
-                        b_cache[size] = baseline
+                        baseline = hpack_nodes(baseline,targetsize)
+                        b_cache[targetsize] = baseline
                     end
                     baseline = copy_list(baseline)
                     baseskip = new_kern(-wd+linewidth)

Modified: trunk/Master/texmf-dist/tex/context/interface/mkiv/i-context.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-emoji.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-emoji.mkiv	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-emoji.mkiv	2017-05-02 22:24:44 UTC (rev 44160)
@@ -0,0 +1,331 @@
+%D \module
+%D   [      file=s-fonts-emoji,
+%D        version=2017.04.26,
+%D          title=\CONTEXT\ Style File,
+%D       subtitle=Emoji Helpers,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+moduledata.emoji    = moduledata.emoji or { }
+
+local find          = string.find
+local sortedhash    = table.sortedhash
+local utfvalues     = string.utfvalues
+
+local context       = context
+
+local traverse_id   = node.traverse_id
+local glyph_code    = nodes.nodecodes.glyph
+
+local descriptions  = fonts.hashes.descriptions
+local checkedemoji  = fonts.symbols.emoji.checked
+local compactemoji  = characters.emoji.compact
+local resolvedemoji = characters.emoji.resolve
+local knownemoji    = characters.emoji.known
+
+local function emojisnippets(name)
+    local d = descriptions[true]
+    if d then
+        local e = resolvedemoji(name)
+        local s = { }
+        for b in utfvalues(e) do
+            if not (b == 0x200D or (b >= 0x1F3FB and b <= 0x1F3FF)) then
+                local t = { }
+                s[#s+1] = t
+                local c = d[b]
+                if c then
+                    c = c.colors
+                    if c then
+                        for i=1,#c do
+                            t[#t+1] = c[i].slot
+                        end
+                    else
+                        t[#t+1] = b
+                    end
+                end
+            end
+        end
+        return #s > 0 and s or nil
+    end
+end
+
+local function emojiglyphs(name)
+    local d = descriptions[true]
+    if d then
+        local e = checkedemoji(name)
+        local s = { }
+        for n in traverse_id(glyph_code,e) do
+            local b = n.char
+            if not (b == 0x200D or (b >= 0x1F3FB and b <= 0x1F3FF)) then
+                local t = { }
+                s[#s+1] = t
+                local c = d[b]
+                if c then
+                    c = c.colors
+                    if c then
+                        for i=1,#c do
+                            t[#t+1] = c[i].slot
+                        end
+                    else
+                        t[#t+1] = b
+                    end
+                end
+            end
+        end
+        nodes.flush_list(e)
+        return #s > 0 and s or nil
+    end
+end
+
+characters.emojisnippets  = emojisnippets
+fonts.symbols.emojiglyphs = emojiglyphs
+
+function moduledata.emoji.showsnippets(name)
+    local s = emojisnippets(name)
+    if s then
+        local ni = #s
+        for i=1,ni do
+            local si = s[i]
+            local nj = #si
+            for j=1,nj do
+                context.WrapEmojiSnippet(i,ni,j,nj,si[j])
+            end
+        end
+    end
+end
+
+function moduledata.emoji.showglyphs(name)
+    local s = emojiglyphs(name)
+    if s then
+        local ni = #s
+        for i=1,ni do
+            local si = s[i]
+            local nj = #si
+            for j=1,nj do
+                context.WrapEmojiSnippet(i,ni,j,nj,si[j])
+            end
+        end
+    end
+end
+
+function moduledata.emoji.showknown(list)
+    local hash = knownemoji()
+    local size = 0
+    if list then
+        list = utilities.parsers.settings_to_array(list)
+        size = #list
+        if size == 0 then
+            list = false
+        else
+            for i=1,size do
+                list[i] = string.escapedpattern(list[i])
+            end
+        end
+    end
+    for k, v in sortedhash(hash) do
+        local okay = true
+        if find(compactemoji(k),"%-s%-t") then
+            okay = false
+        elseif list then
+            okay = false
+            for i=1,size do
+                if find(k,list[i]) then
+                    okay = true
+                    break
+                end
+            end
+        end
+        if okay then
+            context("\\WrapEmojiPlusText{%s}{%!tex!}",k,v)
+        end
+    end
+end
+
+local function convert(t,k)
+    local v = { }
+    for i=1,#k do
+        local p = k[i]
+    end
+    return v
+end
+
+function moduledata.emoji.showpalette(list)
+    local colorpalettes = fonts.hashes.resources[true].colorpalettes
+    if colorpalettes then
+        if list then
+            list = utilities.parsers.settings_to_hash(list)
+            if not next(list) then
+                list = false
+            end
+        end
+        context.starttabulate { "||lp|" }
+        for i=1,#colorpalettes do
+            if not list or list[tostring(i)] then
+                local palette = colorpalettes[i]
+                context.BC()
+                context.type(i)
+                context.NC()
+                for j=1,#palette do
+                    local p = palette[j]
+                    local r, g, b = p[1]/255, p[2]/255, p[3]/255
+                    local s = attributes.colors.rgbtogray(r,g,b)
+                    context.WrapEmojiColorEntry(j,s,r,g,b)
+                end
+                context.NC()
+                context.NR()
+            end
+        end
+        context.stoptabulate()
+    end
+end
+
+\stopluacode
+
+\unexpanded\def\WrapEmojiPlusText#1#2%
+  {\dontleavehmode\hbox\bgroup
+     \tttf % determines em
+     \hpack to 8\emwidth{\setfontid\scratchcounter#2\hss}%
+     \hpack to 8\emwidth{\setfontid\scratchcounter\checkedemoji{#1}\hss}%
+     #1%
+   \egroup\par}
+
+\unexpanded\def\ShowEmoji
+  {\dosingleempty\doShowEmoji}
+
+\unexpanded\def\doShowEmoji[#1]%
+  {\begingroup
+   \scratchcounter\fontid\font
+   \ctxlua{moduledata.emoji.showknown([[#1]])}%
+   \endgroup}
+
+\unexpanded\def\WrapEmojiSnippet#1#2#3#4#5%
+  {\ifnum#3=\plusone
+     \par
+     \dontleavehmode\ruledhbox\bgroup
+   \fi
+   \ruledhbox to 2\emwidth{\hss\char#5\hss}%
+   \ifnum#3=#4\relax
+     \egroup
+     \par
+   \fi}
+
+\unexpanded\def\ShowEmojiSnippets[#1]%
+  {\ctxlua{moduledata.emoji.showsnippets("#1")}}
+
+\unexpanded\def\ShowEmojiGlyphs[#1]%
+  {\ctxlua{moduledata.emoji.showglyphs("#1")}}
+
+\unexpanded\def\OverlayEmojiSnippet#1#2#3#4#5%
+  {\setbox\scratchbox\hbox{\color[trace:#3]{\char#5}}%
+   \ifnum#3=\plusone
+     \ifnum#1=\plusone
+       \dontleavehmode\ruledhbox\bgroup
+     \fi
+     \hbox\bgroup
+   \else
+     \hskip-\wd\scratchbox
+   \fi
+   \box\scratchbox
+   \ifnum#3=#4\relax
+     \egroup
+     \ifnum#1=#2\relax
+       \egroup
+     \fi
+   \fi}
+
+\unexpanded\def\ShowEmojiSnippetsOverlay[#1]%
+  {\begingroup
+   \let\WrapEmojiSnippet\OverlayEmojiSnippet
+   \ctxlua{moduledata.emoji.showsnippets("#1")}%
+   \endgroup}
+
+\unexpanded\def\WrapEmojiColorEntry#1#2#3#4#5%
+  {\dontleavehmode\hpack\bgroup
+     \definecolor
+        [dummy]
+        [r=#3,g=#4,b=#5]%
+     \backgroundline
+        [dummy]
+        {\setbox\scratchbox\hpack to 2\emwidth{\hss\ifdim#2pt<.5pt\white\fi\ttx#1\hss}%
+         \ht\scratchbox.8\strutht\dp\scratchbox.6\strutdp\box\scratchbox}%
+   \egroup
+   \quad}
+
+\unexpanded\def\ShowEmojiPalettes
+  {\dosingleempty\doShowEmojiPalettes}
+
+\unexpanded\def\doShowEmojiPalettes[#1]%
+  {\ctxlua{moduledata.emoji.showpalette([[#1]])}}
+
+% \definefontfeature[bandw:overlay][ccmp=yes,dist=yes]
+% \definefontfeature[color:overlay][ccmp=yes,dist=yes,colr=yes]
+% %definefontfeature[bandw:svg]    [ccmp=yes,dist=yes]
+% \definefontfeature[color:svg]    [ccmp=yes,dist=yes,svg=yes]
+% %definefontfeature[bandw:bitmap] [ccmp=yes,dist=yes,sbix=yes]
+% \definefontfeature[color:bitmap] [ccmp=yes,dist=yes,sbix=yes]
+
+\definefontfeature[seguiemj-cl][color:overlay]
+\definefontfeature[seguiemj-bw][bandw:overlay]
+
+% \definefont[MyEmoji] [seguiemj*seguiemj-bw]
+% \definefont[MyEmoji] [seguiemj*seguiemj-cl]
+% \definefont[MyEmoji] [emojionecolor-svginot*default,svg]
+% \definefont[MyEmoji] [emojionemozilla*default,overlay]
+% \definefont[MyEmoji] [applecoloremoji*default,bitmap]
+
+% \definecolor[trace:1][s=0,t=.5,a=1]
+% \definecolor[trace:2][s=0,t=.5,a=1]
+% \definecolor[trace:3][s=0,t=.5,a=1]
+% \definecolor[trace:4][s=0,t=.5,a=1]
+% \definecolor[trace:5][s=0,t=.5,a=1]
+% \definecolor[trace:6][s=0,t=.5,a=1]
+
+\continueifinputfile{s-fonts-emoji.mkiv}
+
+\starttext
+
+\start
+
+\definedfont[seguiemj*seguiemj-cl]
+
+\ShowEmojiSnippets
+  [family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone]
+
+\ShowEmojiSnippetsOverlay
+  [family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone]
+
+\ShowEmojiGlyphs
+  [family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone]
+
+\page
+
+\ShowEmoji[^man]
+
+\page
+
+\definecolor[emoji-base][r=.4]
+\definecolor[emoji-gray][s=.5,t=.5,a=1]
+
+\definefontcolorpalette
+  [emoji-gray]
+  [emoji-base,emoji-gray]
+
+\definefontfeature[seguiemj-cl][ccmp=yes,dist=yes,colr=emoji-gray]
+
+\definedfont[seguiemj*seguiemj-cl]
+
+\ShowEmoji
+
+\page
+
+\ShowEmojiPalettes[1]
+
+\stop
+
+\stoptext

Modified: trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.lua
===================================================================
--- trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -28,7 +28,6 @@
     if not fontfile then
         return
     end
-
     local id, fontdata = fonts.definers.define {
         name = fontfile,
      -- size = fontsize,
@@ -36,7 +35,7 @@
     }
 
     if not fontdata then
-        context("no font with name %a found",fontname)
+        context.type("no font with name %a found",fontname)
     end
 
     local resources = fontdata.resources
@@ -45,11 +44,11 @@
         return
     end
 
-    local variabledata = resources.variabledata
+    local variabledata = resources.variabledata or { }
 
-    if not variabledata then
-        return
-    end
+--     if not variabledata then
+--         return
+--     end
 
     context.starttitle { title = fontdata.shared.rawdata.metadata.fullname }
 

Modified: trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv	2017-05-02 22:24:44 UTC (rev 44160)
@@ -43,4 +43,7 @@
 %     \showfontvariations
 %       [font=file:kairossansvariable.ttf]
 
+    \showfontvariations
+      [font=file:sourcecode-regular.otf]
+
 \stoptext

Modified: trunk/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua	2017-05-02 22:09:49 UTC (rev 44159)
+++ trunk/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua	2017-05-02 22:24:44 UTC (rev 44160)
@@ -1,6 +1,6 @@
 -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua
 -- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date  : 04/20/17 21:31:47
+-- merge date  : 04/27/17 01:00:26
 
 do -- begin closure to overcome local limits and interference
 
@@ -1372,7 +1372,7 @@
   'in','local','nil','not','or','repeat','return','then','true','until','while',
   'NaN','goto',
 }
-local function is_simple_table(t) 
+local function is_simple_table(t,hexify) 
   local nt=#t
   if nt>0 then
     local n=0
@@ -1490,7 +1490,7 @@
           if next(v)==nil then
             handle(format("%s {},",depth))
           elseif inline then 
-            local st=is_simple_table(v)
+            local st=is_simple_table(v,hexify)
             if st then
               handle(format("%s { %s },",depth,concat(st,", ")))
             else
@@ -1573,7 +1573,7 @@
             handle(format("%s [%q]={},",depth,k))
           end
         elseif inline then
-          local st=is_simple_table(v)
+          local st=is_simple_table(v,hexify)
           if st then
             if tk=="number" then
               if hexify then
@@ -8149,7 +8149,7 @@
 local utf16_to_utf8_be=utf.utf16_to_utf8_be
 local report=logs.reporter("otf reader")
 local trace_cmap=false 
-local trace_cmap_detail=false 
+local trace_cmap_detail=false
 fonts=fonts or {}
 local handlers=fonts.handlers or {}
 fonts.handlers=handlers
@@ -8854,6 +8854,7 @@
   { 0,0,6 },
   { 3,0,6 },
   { 0,5,14 },
+{ 0,4,12 },
   { 3,10,13 },
 }
 local supported={}
@@ -9538,19 +9539,27 @@
       local instance=specification.instance
       if type(instance)=="string" then
         local factors=helpers.getfactors(fontdata,instance)
-        specification.factors=factors
-        fontdata.factors=factors
-        fontdata.instance=instance
-        report("user instance: %s, factors: % t",instance,factors)
+        if factors then
+          specification.factors=factors
+          fontdata.factors=factors
+          fontdata.instance=instance
+          report("user instance: %s, factors: % t",instance,factors)
+        else
+          report("user instance: %s, bad factors",instance)
+        end
       end
     end
     if not fontdata.factors then
       if fontdata.variabledata then
         local factors=helpers.getfactors(fontdata,true)
-        specification.factors=factors
-        fontdata.factors=factors
-        fontdata.instance=instance
-        report("font instance: %s, factors: % t",instance,factors)
+        if factors then
+          specification.factors=factors
+          fontdata.factors=factors
+          fontdata.instance=instance
+          report("font instance: %s, factors: % t",instance,factors)
+        else
+          report("user instance: %s, bad factors",instance)
+        end
       end
     end
   end
@@ -11508,7 +11517,9 @@
   local dictionary=dictionaries[1]
   readglobals(f,data)
   readcharstrings(f,data,version)
-  if version~="cff2" then
+  if version=="cff2" then
+    dictionary.charset=nil
+  else
     readencodings(f,data)
     readcharsets(f,data,dictionary)
   end
@@ -11653,10 +11664,16 @@
       nofglyphs=fontdata.nofglyphs,
     }
     parsedictionaries(data,dictionaries,"cff2")
-    local storeoffset=dictionaries[1].vstore+data.header.offset+2 
-    local regions,deltas=readers.helpers.readvariationdata(f,storeoffset,factors)
-    data.regions=regions
-    data.deltas=deltas
+    local offset=dictionaries[1].vstore
+    if offset>0 then
+      local storeoffset=dictionaries[1].vstore+data.header.offset+2 
+      local regions,deltas=readers.helpers.readvariationdata(f,storeoffset,factors)
+      data.regions=regions
+      data.deltas=deltas
+    else
+      data.regions={}
+      data.deltas={}
+    end
     data.factors=specification.factors
     local cid=data.dictionaries[1].cid
     local all=specification.shapes or false
@@ -13368,7 +13385,13 @@
       if index>length then
         length=index
       end
-      lookups[index]=readushort(f)+1
+      local lookup=readushort(f)+1
+      local list=lookups[index]
+      if list then
+        list[#list+1]=lookup
+      else
+        lookups[index]={ lookup }
+      end
     end
     for index=1,length do
       if not lookups[index] then
@@ -14528,43 +14551,55 @@
             else
               local length=#rlookups
               for index=1,length do
-                local lookupid=rlookups[index]
-                if lookupid then
-                  local h=sublookuphash[lookupid]
-                  if not h then
-                    local lookup=lookups[lookupid]
-                    if lookup then
-                      local d=lookup.done
-                      if d then
-                        nofsublookups=nofsublookups+1
-                        h={
-                          index=nofsublookups,
-                          name=f_lookupname(lookupprefix,"d",lookupid+lookupidoffset),
-                          derived=true,
-                          steps=d.steps,
-                          nofsteps=d.nofsteps,
-                          type=d.lookuptype or "gsub_single",
-                          markclass=d.markclass or nil,
-                          flags=d.flags,
-                        }
-                        sublookuplist[nofsublookups]=copy(h) 
-                        sublookuphash[lookupid]=nofsublookups
-                        sublookupcheck[lookupid]=1
-                        h=nofsublookups
+                local lookuplist=rlookups[index]
+                if lookuplist then
+                  local length=#lookuplist
+                  local found={}
+                  local noffound=0
+                  for index=1,length do
+                    local lookupid=lookuplist[index]
+                    if lookupid then
+                      local h=sublookuphash[lookupid]
+                      if not h then
+                        local lookup=lookups[lookupid]
+                        if lookup then
+                          local d=lookup.done
+                          if d then
+                            nofsublookups=nofsublookups+1
+                            h={
+                              index=nofsublookups,
+                              name=f_lookupname(lookupprefix,"d",lookupid+lookupidoffset),
+                              derived=true,
+                              steps=d.steps,
+                              nofsteps=d.nofsteps,
+                              type=d.lookuptype or "gsub_single",
+                              markclass=d.markclass or nil,
+                              flags=d.flags,
+                            }
+                            sublookuplist[nofsublookups]=copy(h) 
+                            sublookuphash[lookupid]=nofsublookups
+                            sublookupcheck[lookupid]=1
+                            h=nofsublookups
+                          else
+                            report_issue(i,what,sequence,"missing")
+                            rule.lookups=nil
+                            break
+                          end
+                        else
+                          report_issue(i,what,sequence,"bad")
+                          rule.lookups=nil
+                          break
+                        end
                       else
-                        report_issue(i,what,sequence,"missing")
-                        rule.lookups=nil
-                        break
+                        sublookupcheck[lookupid]=sublookupcheck[lookupid]+1
                       end
-                    else
-                      report_issue(i,what,sequence,"bad")
-                      rule.lookups=nil
-                      break
+                      if h then
+                        noffound=noffound+1
+                        found[noffound]=h
+                      end
                     end
-                  else
-                    sublookupcheck[lookupid]=sublookupcheck[lookupid]+1
                   end
-                  rlookups[index]=h or false
+                  rlookups[index]=noffound>0 and found or false
                 else
                   rlookups[index]=false
                 end
@@ -15493,7 +15528,7 @@
         default=readfixed(f),
         maximum=readfixed(f),
         flags=readushort(f),
-        name=lower(extras[readushort(f)]),
+        name=lower(extras[readushort(f)] or "bad name"),
       }
       local n=sizeofaxis-20
       if n>0 then
@@ -16469,7 +16504,7 @@
     copyduplicates(fontdata)
     unifymissing(fontdata)
   else
-    fontdata.hashmethod="unicode"
+    fontdata.hashmethod="unicodes"
     local indices=unifyglyphs(fontdata)
     unifyresources(fontdata,indices)
     copyduplicates(fontdata)
@@ -16484,10 +16519,10 @@
   elseif hashmethod=="names" and fontdata.names then
     unifyresources(fontdata,fontdata.names)
     copyduplicates(fontdata)
-    fontdata.hashmethod="unicode"
+    fontdata.hashmethod="unicodes"
     fontdata.names=nil 
   else
-    readers.rehash(fontdata,"unicode")
+    readers.rehash(fontdata,"unicodes")
   end
 end
 function readers.addunicodetable(fontdata)
@@ -16860,7 +16895,6 @@
                   local r=rule.before    if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
                   local r=rule.after    if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
                   local r=rule.current   if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
-                  local r=rule.lookups   if r then rule.lookups=pack_mixed (r)  end
                   local r=rule.replacements if r then rule.replacements=pack_flat  (r)  end
                 end
               end
@@ -17258,13 +17292,6 @@
                       end
                     end
                   end
-                  local lookups=rule.lookups
-                  if lookups then
-                    local tv=tables[lookups]
-                    if tv then
-                      rule.lookups=tv
-                    end
-                  end
                   local replacements=rule.replacements
                   if replacements then
                     local tv=tables[replacements]
@@ -17768,14 +17795,19 @@
                 local lookups=rule.lookups or false
                 local subtype=nil
                 if lookups then
-                  for k,v in next,lookups do
-                    local lookup=sublookups[v]
-                    if lookup then
-                      lookups[k]=lookup
-                      if not subtype then
-                        subtype=lookup.type
+                  for i=1,#lookups do
+                    local lookups=lookups[i]
+                    if lookups then
+                      for k,v in next,lookups do
+                        local lookup=sublookups[v]
+                        if lookup then
+                          lookups[k]=lookup
+                          if not subtype then
+                            subtype=lookup.type
+                          end
+                        else
+                        end
                       end
-                    else
                     end
                   end
                 end
@@ -17839,7 +17871,7 @@
 local report_otf=logs.reporter("fonts","otf loading")
 local fonts=fonts
 local otf=fonts.handlers.otf
-otf.version=3.028 
+otf.version=3.029 
 otf.cache=containers.define("fonts","otl",otf.version,true)
 otf.svgcache=containers.define("fonts","svg",otf.version,true)
 otf.sbixcache=containers.define("fonts","sbix",otf.version,true)
@@ -19308,7 +19340,7 @@
         if i then
           local leftkern=i.leftkern
           if leftkern and leftkern~=0 then
-            insert_node_before(head,current,newkern(leftkern))
+            head=insert_node_before(head,current,newkern(leftkern))
           end
         end
         if prevdisc then
@@ -19689,7 +19721,7 @@
             ox=px-pn.markx
           end
         else
-          ox=px-pn.markx
+          ox=px-pn.markx-rightkern 
         end
       end
     else
@@ -19782,7 +19814,7 @@
             end
             local leftkern=i.leftkern
             if leftkern and leftkern~=0 then
-              insert_node_before(head,current,newkern(leftkern))
+              head=insert_node_before(head,current,newkern(leftkern))
             end
             local rightkern=i.rightkern
             if rightkern and rightkern~=0 then
@@ -22016,16 +22048,19 @@
     local nofchainlookups=#chainlookups
     if size==1 then
       local chainlookup=chainlookups[1]
-      local chainkind=chainlookup.type
-      local chainproc=chainprocs[chainkind]
-      if chainproc then
-        local ok
-        head,start,ok=chainproc(head,start,last,dataset,sequence,chainlookup,rlmode,1)
-        if ok then
-          done=true
+      for j=1,#chainlookup do
+        local chainstep=chainlookup[j]
+        local chainkind=chainstep.type
+        local chainproc=chainprocs[chainkind]
+        if chainproc then
+          local ok
+          head,start,ok=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,1)
+          if ok then
+            done=true
+          end
+        else
+          logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind)
         end
-      else
-        logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind)
       end
      else
       local i=1
@@ -22047,19 +22082,22 @@
         end
         local chainlookup=chainlookups[i]
         if chainlookup then
-          local chainkind=chainlookup.type
-          local chainproc=chainprocs[chainkind]
-          if chainproc then
-            local ok,n
-            head,start,ok,n=chainproc(head,start,last,dataset,sequence,chainlookup,rlmode,i)
-            if ok then
-              done=true
-              if n and n>1 and i+n>nofchainlookups then
-                break
+          for j=1,#chainlookup do
+            local chainstep=chainlookup[j]
+            local chainkind=chainstep.type
+            local chainproc=chainprocs[chainkind]
+            if chainproc then
+              local ok,n
+              head,start,ok,n=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,i)
+              if ok then
+                done=true
+                if n and n>1 and i+n>nofchainlookups then
+                  break
+                end
               end
+            else
+              logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind)
             end
-          else
-            logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind)
           end
         end
         i=i+1
@@ -25927,7 +25965,6 @@
 local otf=fonts.handlers.otf
 local f_color=formatters["pdf:direct:%f %f %f rg"]
 local f_gray=formatters["pdf:direct:%f g"]
-local s_black="pdf:direct:0 g"
 if context then
   local startactualtext=nil
   local stopactualtext=nil
@@ -25947,30 +25984,37 @@
   end
 end
 local sharedpalettes={}
+local hash=table.setmetatableindex(function(t,k)
+  local v={ "special",k }
+  t[k]=v
+  return v
+end)
 if context then
-  local graytorgb=attributes.colors.graytorgb
-  local cmyktorgb=attributes.colors.cmyktorgb
+  local colors=attributes.list[attributes.private('color')] or {}
+  local transparencies=attributes.list[attributes.private('transparency')] or {}
   function otf.registerpalette(name,values)
     sharedpalettes[name]=values
     for i=1,#values do
       local v=values[i]
-      local r,g,b
-      local s=v.s
-      if s then
-        r,g,b=graytorgb(s)
+      local c=nil
+      local t=nil
+      if type(v)=="table" then
+        c=colors.register(name,"rgb",
+          max(round((v.r or 0)*255),255)/255,
+          max(round((v.g or 0)*255),255)/255,
+          max(round((v.b or 0)*255),255)/255
+        )
       else
-        local c,m,y,k=v.c,v.m,v.y,v.k
-        if c or m or y or k then
-          r,g,b=cmyktorgb(c or 0,m or 0,y or 0,k or 0)
-        else
-          r,g,b=v.r,v.g,v.b
-        end
+        c=colors[v]
+        t=transparencies[v]
       end
-      values[i]={
-        max(r and round(r*255) or 0,255),
-        max(g and round(g*255) or 0,255),
-        max(b and round(b*255) or 0,255)
-      }
+      if c and t then
+        values[i]=hash["pdf:direct:"..lpdf.color(1,c).." "..lpdf.transparency(t)]
+      elseif c then
+        values[i]=hash["pdf:direct:"..lpdf.color(1,c)]
+      elseif t then
+        values[i]=hash["pdf:direct:"..lpdf.color(1,t)]
+      end
     end
   end
 else 
@@ -25978,20 +26022,40 @@
     sharedpalettes[name]=values
     for i=1,#values do
       local v=values[i]
-      values[i]={
-        max(round((v.r or 0)*255),255),
-        max(round((v.g or 0)*255),255),
-        max(round((v.b or 0)*255),255)
-      }
+      values[i]=hash[f_color(
+        max(round((v.r or 0)*255),255)/255,
+        max(round((v.g or 0)*255),255)/255,
+        max(round((v.b or 0)*255),255)/255
+      )]
     end
   end
 end
+local function convert(t,k)
+  local v={}
+  for i=1,#k do
+    local p=k[i]
+    local r,g,b=p[1],p[2],p[3]
+    if r==g and g==b then
+      v[i]=hash[f_gray(r/255)]
+    else
+      v[i]=hash[f_color(r/255,g/255,b/255)]
+    end
+  end
+  t[k]=v
+  return v
+end
 local function initializecolr(tfmdata,kind,value) 
   if value then
-    local palettes=tfmdata.resources.colorpalettes
+    local resources=tfmdata.resources
+    local palettes=resources.colorpalettes
     if palettes then
-      local palette=sharedpalettes[value] or palettes[tonumber(value) or 1] or palettes[1] or {}
-      local classes=#palette
+      local converted=resources.converted
+      if not converted then
+        converted=table.setmetatableindex(convert)
+        resources.converted=converted
+      end
+      local colorvalues=sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or {}
+      local classes=#colorvalues
       if classes==0 then
         return
       end
@@ -25998,21 +26062,20 @@
       local characters=tfmdata.characters
       local descriptions=tfmdata.descriptions
       local properties=tfmdata.properties
-      local colorvalues={}
       properties.virtualized=true
       tfmdata.fonts={
         { id=0 }
       }
-      for i=1,classes do
-        local p=palette[i]
-        local r,g,b=p[1],p[2],p[3]
-        if r==g and g==b then
-          colorvalues[i]={ "special",f_gray(r/255) }
-        else
-          colorvalues[i]={ "special",f_color(r/255,g/255,b/255) }
-        end
-      end
+      local widths=table.setmetatableindex(function(t,k)
+        local v={ "right",-k }
+        t[k]=v
+        return v
+      end)
       local getactualtext=otf.getactualtext
+      local default=colorvalues[#colorvalues]
+      local endactual=nil
+      local start={ "special","pdf:page:q" }
+      local stop={ "special","pdf:raw:Q" }
       for unicode,character in next,characters do
         local description=descriptions[unicode]
         if description then
@@ -26021,21 +26084,30 @@
             local b,e=getactualtext(tounicode(characters[unicode].unicode or 0xFFFD))
             local w=character.width or 0
             local s=#colorlist
+            local goback=w~=0 and widths[w] or nil
             local t={
-              { "special","pdf:page:q" },
+              start,
               { "special","pdf:raw:"..b }
             }
             local n=#t
+            local l=nil
             for i=1,s do
               local entry=colorlist[i]
-              n=n+1 t[n]=colorvalues[entry.class] or s_black
+              local v=colorvalues[entry.class] or default
+              if v and l~=v then
+                n=n+1 t[n]=v
+                l=v
+              end
               n=n+1 t[n]={ "char",entry.slot }
-              if s>1 and i<s and w~=0 then
-                n=n+1 t[n]={ "right",-w }
+              if s>1 and i<s and goback then
+                n=n+1 t[n]=goback
               end
             end
-            n=n+1 t[n]={ "special","pdf:page:"..e }
-            n=n+1 t[n]={ "special","pdf:raw:Q" }
+            if not endactual then
+              endactual={ "special","pdf:page:"..e } 
+            end
+            n=n+1 t[n]=endactual
+            n=n+1 t[n]=stop
             character.commands=t
           end
         end
@@ -26726,10 +26798,16 @@
           for k,v in next,lookups do
             local t=type(v)
             if t=="table" then
+              for i=1,#v do
+                local vi=v[i]
+                if type(vi)~="table" then
+                  v[i]={ vi }
+                end
+              end
             elseif t=="number" then
               local lookup=sublookups[v]
               if lookup then
-                lookups[k]=lookup
+                lookups[k]={ lookup }
                 if not subtype then
                   subtype=lookup.type
                 end



More information about the tex-live-commits mailing list