]> git.sur5r.net Git - i3/i3/commitdiff
Merge i3bar into next
authorMichael Stapelberg <michael@stapelberg.de>
Mon, 1 Aug 2011 13:55:21 +0000 (15:55 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 1 Aug 2011 13:55:27 +0000 (15:55 +0200)
248 files changed:
.gitignore [new file with mode: 0644]
CMDMODE [new file with mode: 0644]
DEPENDS [new file with mode: 0644]
GOALS [new file with mode: 0644]
LICENSE [new file with mode: 0644]
Makefile [new file with mode: 0644]
PACKAGE-MAINTAINER [new file with mode: 0644]
RELEASE-NOTES-4.0 [new file with mode: 0644]
TODO [new file with mode: 0644]
common.mk [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/i3-wm.doc-base [new file with mode: 0644]
debian/i3-wm.docs [new file with mode: 0644]
debian/i3-wm.wm [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/watch [new file with mode: 0644]
docs/GPN-2009-06-27/i3.tex [new file with mode: 0644]
docs/GPN-2009-06-27/reparenting.dia [new file with mode: 0644]
docs/GPN-2009-06-27/reparenting.eps [new file with mode: 0644]
docs/GPN-2009-06-27/screenshot.png [new file with mode: 0644]
docs/GPN-2009-06-27/screenshot.ps [new file with mode: 0644]
docs/GPN-2009-06-27/xft.eps [new file with mode: 0644]
docs/GPN-2009-06-27/xft.jpg [new file with mode: 0644]
docs/GPN-2009-06-27/xserver_konzept.dia [new file with mode: 0644]
docs/GPN-2009-06-27/xserver_konzept.eps [new file with mode: 0644]
docs/Makefile [new file with mode: 0644]
docs/NoName-2009-03-12/i3.tex [new file with mode: 0644]
docs/bigpicture.png [new file with mode: 0644]
docs/bigpicture.xcf [new file with mode: 0644]
docs/debugging [new file with mode: 0644]
docs/hacking-howto [new file with mode: 0644]
docs/ipc [new file with mode: 0644]
docs/keyboard-layer1.png [new file with mode: 0644]
docs/keyboard-layer1.svg [new file with mode: 0644]
docs/keyboard-layer2.png [new file with mode: 0644]
docs/keyboard-layer2.svg [new file with mode: 0644]
docs/modes.png [new file with mode: 0644]
docs/multi-monitor [new file with mode: 0644]
docs/refcard.tex [new file with mode: 0644]
docs/single_terminal.png [new file with mode: 0644]
docs/snapping.png [new file with mode: 0644]
docs/stacklimit.png [new file with mode: 0644]
docs/tree-layout1.png [new file with mode: 0644]
docs/tree-layout2.png [new file with mode: 0644]
docs/tree-shot1.png [new file with mode: 0644]
docs/tree-shot2.png [new file with mode: 0644]
docs/tree-shot3.png [new file with mode: 0644]
docs/tree-shot4.png [new file with mode: 0644]
docs/two_columns.png [new file with mode: 0644]
docs/two_terminals.png [new file with mode: 0644]
docs/userguide [new file with mode: 0644]
docs/wsbar [new file with mode: 0644]
docs/wsbar.dia [new file with mode: 0644]
docs/wsbar.png [new file with mode: 0644]
dump-asy.pl [new file with mode: 0755]
gtk-tree-watch.pl [new file with mode: 0755]
i3-config-wizard/Makefile [new file with mode: 0644]
i3-config-wizard/atoms.xmacro [new file with mode: 0644]
i3-config-wizard/cfgparse.l [new file with mode: 0644]
i3-config-wizard/cfgparse.y [new file with mode: 0644]
i3-config-wizard/ipc.c [new file with mode: 0644]
i3-config-wizard/ipc.h [new file with mode: 0644]
i3-config-wizard/main.c [new file with mode: 0644]
i3-config-wizard/xcb.c [new file with mode: 0644]
i3-config-wizard/xcb.h [new file with mode: 0644]
i3-input/Makefile [new file with mode: 0644]
i3-input/UnicodeData.txt [new file with mode: 0644]
i3-input/convmap.pl [new file with mode: 0755]
i3-input/i3-input.h [new file with mode: 0644]
i3-input/ipc.c [new file with mode: 0644]
i3-input/keysym.map [new file with mode: 0644]
i3-input/keysym2ucs.c [new file with mode: 0644]
i3-input/keysym2ucs.h [new file with mode: 0644]
i3-input/main.c [new file with mode: 0644]
i3-input/ucs2_to_utf8.c [new file with mode: 0644]
i3-input/xcb.c [new file with mode: 0644]
i3-migrate-config-to-v4 [new file with mode: 0755]
i3-msg/Makefile [new file with mode: 0644]
i3-msg/main.c [new file with mode: 0644]
i3-nagbar/Makefile [new file with mode: 0644]
i3-nagbar/atoms.xmacro [new file with mode: 0644]
i3-nagbar/i3-nagbar.h [new file with mode: 0644]
i3-nagbar/main.c [new file with mode: 0644]
i3-nagbar/xcb.c [new file with mode: 0644]
i3-wsbar [new file with mode: 0755]
i3.config [new file with mode: 0644]
i3.config.keycodes [new file with mode: 0644]
i3.desktop [new file with mode: 0644]
i3.welcome [new file with mode: 0644]
include/all.h [new file with mode: 0644]
include/assignments.h [new file with mode: 0644]
include/atoms.xmacro [new file with mode: 0644]
include/click.h [new file with mode: 0644]
include/cmdparse.h [new file with mode: 0644]
include/con.h [new file with mode: 0644]
include/config.h [new file with mode: 0644]
include/data.h [new file with mode: 0644]
include/debug.h [new file with mode: 0644]
include/ewmh.h [new file with mode: 0644]
include/floating.h [new file with mode: 0644]
include/handlers.h [new file with mode: 0644]
include/i3.h [new file with mode: 0644]
include/i3/ipc.h [new file with mode: 0644]
include/ipc.h [new file with mode: 0644]
include/load_layout.h [new file with mode: 0644]
include/log.h [new file with mode: 0644]
include/manage.h [new file with mode: 0644]
include/match.h [new file with mode: 0644]
include/move.h [new file with mode: 0644]
include/output.h [new file with mode: 0644]
include/queue.h [new file with mode: 0644]
include/randr.h [new file with mode: 0644]
include/render.h [new file with mode: 0644]
include/resize.h [new file with mode: 0644]
include/sighandler.h [new file with mode: 0644]
include/tree.h [new file with mode: 0644]
include/util.h [new file with mode: 0644]
include/window.h [new file with mode: 0644]
include/workspace.h [new file with mode: 0644]
include/x.h [new file with mode: 0644]
include/xcb.h [new file with mode: 0644]
include/xcb_compat.h [new file with mode: 0644]
include/xcursor.h [new file with mode: 0644]
include/xinerama.h [new file with mode: 0644]
logo.svg [new file with mode: 0644]
man/Makefile [new file with mode: 0644]
man/asciidoc.conf [new file with mode: 0644]
man/i3-config-wizard.man [new file with mode: 0644]
man/i3-input.man [new file with mode: 0644]
man/i3-migrate-config-to-v4.man [new file with mode: 0644]
man/i3-msg.man [new file with mode: 0644]
man/i3-nagbar.man [new file with mode: 0644]
man/i3.man [new file with mode: 0644]
pseudo-doc.doxygen [new file with mode: 0644]
render-tree/Con.pm [new file with mode: 0644]
render-tree/render.pl [new file with mode: 0755]
src/assignments.c [new file with mode: 0644]
src/cfgparse.l [new file with mode: 0644]
src/cfgparse.y [new file with mode: 0644]
src/click.c [new file with mode: 0644]
src/cmdparse.l [new file with mode: 0644]
src/cmdparse.y [new file with mode: 0644]
src/con.c [new file with mode: 0644]
src/config.c [new file with mode: 0644]
src/debug.c [new file with mode: 0644]
src/ewmh.c [new file with mode: 0644]
src/floating.c [new file with mode: 0644]
src/handlers.c [new file with mode: 0644]
src/ipc.c [new file with mode: 0644]
src/load_layout.c [new file with mode: 0644]
src/log.c [new file with mode: 0644]
src/main.c [new file with mode: 0644]
src/manage.c [new file with mode: 0644]
src/match.c [new file with mode: 0644]
src/move.c [new file with mode: 0644]
src/output.c [new file with mode: 0644]
src/randr.c [new file with mode: 0644]
src/render.c [new file with mode: 0644]
src/resize.c [new file with mode: 0644]
src/sighandler.c [new file with mode: 0644]
src/tree.c [new file with mode: 0644]
src/util.c [new file with mode: 0644]
src/window.c [new file with mode: 0644]
src/workspace.c [new file with mode: 0644]
src/x.c [new file with mode: 0644]
src/xcb.c [new file with mode: 0644]
src/xcursor.c [new file with mode: 0644]
src/xinerama.c [new file with mode: 0644]
testcases/Makefile [new file with mode: 0644]
testcases/Xdummy [new file with mode: 0755]
testcases/complete-run.pl [new file with mode: 0755]
testcases/i3-test.config [new file with mode: 0644]
testcases/t/00-load.t [new file with mode: 0644]
testcases/t/01-tile.t [new file with mode: 0644]
testcases/t/02-fullscreen.t [new file with mode: 0644]
testcases/t/03-unmanaged.t [new file with mode: 0644]
testcases/t/04-floating.t [new file with mode: 0644]
testcases/t/05-ipc.t [new file with mode: 0644]
testcases/t/06-focus.t [new file with mode: 0644]
testcases/t/07-move.t [new file with mode: 0644]
testcases/t/08-focus-stack.t [new file with mode: 0644]
testcases/t/09-stacking.t [new file with mode: 0644]
testcases/t/10-dock.t [new file with mode: 0644]
testcases/t/11-goto.t [new file with mode: 0644]
testcases/t/12-floating-resize.t [new file with mode: 0644]
testcases/t/13-urgent.t [new file with mode: 0644]
testcases/t/14-client-leader.t [new file with mode: 0644]
testcases/t/15-ipc-workspaces.t [new file with mode: 0644]
testcases/t/16-nestedcons.t [new file with mode: 0644]
testcases/t/17-workspace.t [new file with mode: 0644]
testcases/t/18-openkill.t [new file with mode: 0644]
testcases/t/19-match.t [new file with mode: 0644]
testcases/t/20-multiple-cmds.t [new file with mode: 0644]
testcases/t/21-next-prev.t [new file with mode: 0644]
testcases/t/22-split.t [new file with mode: 0644]
testcases/t/24-move.t [new file with mode: 0644]
testcases/t/26-regress-close.t [new file with mode: 0644]
testcases/t/27-regress-floating-parent.t [new file with mode: 0644]
testcases/t/28-open-order.t [new file with mode: 0644]
testcases/t/29-focus-after-close.t [new file with mode: 0644]
testcases/t/30-close-empty-split.t [new file with mode: 0644]
testcases/t/31-stacking-order.t [new file with mode: 0644]
testcases/t/32-move-workspace.t [new file with mode: 0644]
testcases/t/33-size-hints.t [new file with mode: 0644]
testcases/t/34-invalid-command.t [new file with mode: 0644]
testcases/t/35-floating-focus.t [new file with mode: 0644]
testcases/t/36-floating-ws-empty.t [new file with mode: 0644]
testcases/t/37-floating-unmap.t [new file with mode: 0644]
testcases/t/38-floating-attach.t [new file with mode: 0644]
testcases/t/39-ws-numbers.t [new file with mode: 0644]
testcases/t/40-focus-lost.t [new file with mode: 0644]
testcases/t/41-resize.t [new file with mode: 0644]
testcases/t/42-regress-move-floating.t [new file with mode: 0644]
testcases/t/43-regress-floating-restart.t [new file with mode: 0644]
testcases/t/44-regress-floating-resize.t [new file with mode: 0644]
testcases/t/45-flattening.t [new file with mode: 0644]
testcases/t/46-floating-reinsert.t [new file with mode: 0644]
testcases/t/47-regress-floatingmove.t [new file with mode: 0644]
testcases/t/48-regress-floatingmovews.t [new file with mode: 0644]
testcases/t/50-regress-dock-restart.t [new file with mode: 0644]
testcases/t/51-regress-float-size.t [new file with mode: 0644]
testcases/t/52-regress-level-up.t [new file with mode: 0644]
testcases/t/53-floating-originalsize.t [new file with mode: 0644]
testcases/t/54-regress-multiple-dock.t [new file with mode: 0644]
testcases/t/55-floating-split-size.t [new file with mode: 0644]
testcases/t/56-fullscreen-focus.t [new file with mode: 0644]
testcases/t/57-regress-fullscreen-level-up.t [new file with mode: 0644]
testcases/t/58-wm_take_focus.t [new file with mode: 0644]
testcases/t/59-socketpaths.t [new file with mode: 0644]
testcases/t/61-regress-borders-restart.t [new file with mode: 0644]
testcases/t/62-regress-dock-urgent.t [new file with mode: 0644]
testcases/t/63-wm-state.t [new file with mode: 0644]
testcases/t/64-kill-win-vs-client.t [new file with mode: 0644]
testcases/t/65-for_window.t [new file with mode: 0644]
testcases/t/66-assign.t [new file with mode: 0644]
testcases/t/67-workspace_layout.t [new file with mode: 0644]
testcases/t/68-regress-fullscreen-restart.t [new file with mode: 0644]
testcases/t/69-border-toggle.t [new file with mode: 0644]
testcases/t/70-force_focus_wrapping.t [new file with mode: 0644]
testcases/t/71-config-migrate.t [new file with mode: 0644]
testcases/t/lib/i3test.pm [new file with mode: 0644]
tests/queue.h [new file with mode: 0644]
tests/swap.c [new file with mode: 0644]
tests/test_table.c [new file with mode: 0644]
yajl-fallback/yajl/yajl_version.h [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..454b2e3
--- /dev/null
@@ -0,0 +1,37 @@
+*.o
+tags
+include/loglevels.h
+loglevels.tmp
+*.swp
+*.gcda
+*.gcno
+testcases/testsuite-*
+testcases/latest
+*.output
+*.tab.*
+*.yy.c
+man/i3-msg.1
+man/i3-msg.xml
+man/i3-msg.html
+man/i3-nagbar.1
+man/i3-nagbar.xml
+man/i3-nagbar.html
+man/i3-wsbar.1
+man/i3-wsbar.xml
+man/i3-wsbar.html
+man/i3-input.1
+man/i3-input.xml
+man/i3-input.html
+man/i3.1
+man/i3.xml
+man/i3.html
+*.tar.bz2*
+i3
+i3-input/i3-input
+i3-nagbar/i3-nagbar
+i3-msg/i3-msg
+i3-config-wizard/i3-config-wizard
+docs/*.html
+docs/*.aux
+docs/*.out
+docs/*.pdf
diff --git a/CMDMODE b/CMDMODE
new file mode 100644 (file)
index 0000000..95cb5bc
--- /dev/null
+++ b/CMDMODE
@@ -0,0 +1,47 @@
+---------------------
+- Command mode
+---------------------
+
+This is the grammar for the 'command mode' (your configuration file
+uses these commands, too).
+
+left  := <h> | <cursor-left>
+right := <l> | <cursor-right>
+up    := <j> | <cursor-up>
+down  := <k> | <cursor-down>
+
+where := <left|right|up|down> | <tag>
+move  := <m>
+snap  := <s>
+
+cmd     := [ <times> ] [ <move> | <snap> ] <where>
+with    := <w> { [ <times> ] <where> }+ <space> <cmd>
+jump    := [ "<window class>[/<window title>]" | <workspace> [ <column> <row> ] ]
+focus   := focus [ <times> | floating | tiling | ft ]
+  (travels the focus stack backwards, <times> number of times (by default 1).
+   So by specifying "focus 1" it selects the window which last had the focus
+   before you focused the current one window.
+   The following 3 special values are also valid:
+    'floating' (select the next floating window).
+      'tiling' (select the next tiling window).
+          'ft' (toggle tiling/floating: if the current window is floating,
+                select the next tiling window and vice-versa)
+special := [ exec <path> | kill | exit | restart ]
+
+input   := [ <cmd> | <with> | <jump> | <focus> | <special> ]
+
+you can cancel command mode by pressing escape anytime.
+
+Some examples:
+
+Select the window on the left:
+h
+
+Select the window two places on the left:
+2h
+
+Move window to the right:
+ml
+
+Move window and window on the bottom to the right:
+wk ml
diff --git a/DEPENDS b/DEPENDS
new file mode 100644 (file)
index 0000000..ea7133a
--- /dev/null
+++ b/DEPENDS
@@ -0,0 +1,39 @@
+
+ i3 has the following dependencies:
+
+   "min" means minimum required version
+   "lkgv" means last known good version
+
+┌─────────────┬────────┬────────┬────────────────────────────────────────┐
+│ dependency  │ min.   │ lkgv   │ URL                                    │
+├─────────────┼────────┼────────┼────────────────────────────────────────┤
+│ pkg-config  │ 0.25   │ 0.26   │ http://pkgconfig.freedesktop.org/      │
+│ xcb-proto   │ 1.3    │ 1.6    │ http://xcb.freedesktop.org/dist/       │
+│ libxcb      │ 1.1.93 │ 1.7    │ http://xcb.freedesktop.org/dist/       │
+│ xcb-util    │ 0.3.3  │ 0.3.8  │ http://xcb.freedesktop.org/dist/       │
+│ libev       │ 3.0    │ 4.04   │ http://libev.schmorp.de/               │
+│ flex        │ 2.5.35 │ 2.5.35 │ http://flex.sourceforge.net/           │
+│ bison       │ 2.4.1  │ 2.4.1  │ http://www.gnu.org/software/bison/     │
+│ yajl        │ 1.0.8  │ 2.0.1  │ http://lloyd.github.com/yajl/          │
+│ asciidoc    │ 8.3.0  │ 8.6.4  │ http://www.methods.co.nz/asciidoc/     │
+│ xmlto       │ 0.0.23 │ 0.0.23 │ http://www.methods.co.nz/asciidoc/     │
+│ docbook-xml │ 4.5    │ 4.5    │ http://www.methods.co.nz/asciidoc/     │
+│ libxcursor  │ 1.1.11 │ 1.1.11 │ http://ftp.x.org/pub/current/src/lib/  │
+│ Xlib        │ 1.3.3  │ 1.4.3  │ http://ftp.x.org/pub/current/src/lib/  │
+└─────────────┴────────┴────────┴────────────────────────────────────────┘
+
+ i3-msg, i3-input, i3-nagbar and i3-config-wizard do not introduce any new
+ dependencies.
+
+ i3-wsbar is implemented in Perl and has the following dependencies:
+
+   • IPC::Run
+   • Try::Tiny
+   • AnyEvent
+   • AnyEvent::I3
+
+ All of them are available at CPAN, see http://search.cpan.org/
+ Use your distribution’s packages or cpan(1) to install them.
+
+ i3-migrate-config-to-v4 is implemented in Perl, but it has no dependencies
+ besides Perl 5.10.
diff --git a/GOALS b/GOALS
new file mode 100644 (file)
index 0000000..40d548f
--- /dev/null
+++ b/GOALS
@@ -0,0 +1,6 @@
+GOALS (these have to be fullfilled all the time):
+
+ * Do _NOT_ use autotools or a similar mechanism. Instead, document all
+   requirements properly so that packagers for every plattform can easily
+   provide users with a package. Those who build software for themselves
+   do know how to install requirements, if they are documented.
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..5771597
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2009, Michael Stapelberg
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of Michael Stapelberg nor the
+      names of contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY Michael Stapelberg ''AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Michael Stapelberg BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..3bdffbb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,138 @@
+TOPDIR=$(shell pwd)
+
+include $(TOPDIR)/common.mk
+
+# Depend on the object files of all source-files in src/*.c and on all header files
+AUTOGENERATED:=src/cfgparse.tab.c src/cfgparse.yy.c src/cmdparse.tab.c src/cmdparse.yy.c
+FILES:=$(filter-out $(AUTOGENERATED),$(wildcard src/*.c))
+FILES:=$(FILES:.c=.o)
+HEADERS:=$(filter-out include/loglevels.h,$(wildcard include/*.h))
+
+# Recursively generate loglevels.h by explicitly calling make
+# We need this step because we need to ensure that loglevels.h will be
+# updated if necessary, but we also want to save rebuilds of the object
+# files, so we cannot let the object files depend on loglevels.h.
+ifeq ($(MAKECMDGOALS),loglevels.h)
+#UNUSED:=$(warning Generating loglevels.h)
+else
+UNUSED:=$(shell $(MAKE) loglevels.h)
+endif
+
+SUBDIRS=i3-msg i3-input i3-nagbar i3-config-wizard
+
+# Depend on the specific file (.c for each .o) and on all headers
+src/%.o: src/%.c ${HEADERS}
+       echo "CC $<"
+       $(CC) $(CPPFLAGS) $(CFLAGS) -DLOGLEVEL="((uint64_t)1 << $(shell awk '/$(shell basename $< .c)/ { print NR; exit 0; }' loglevels.tmp))" -c -o $@ $<
+
+all: i3 subdirs
+
+i3: src/cfgparse.y.o src/cfgparse.yy.o src/cmdparse.y.o src/cmdparse.yy.o ${FILES}
+       echo "LINK i3"
+       $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+subdirs:
+       for dir in $(SUBDIRS); do \
+               echo ""; \
+               echo "MAKE $$dir"; \
+               $(MAKE) -C $$dir; \
+       done
+
+loglevels.h:
+       echo "LOGLEVELS"
+       for file in $$(ls src/*.c src/*.y src/*.l | grep -v 'cfgparse.\(tab\|yy\).c'); \
+       do \
+               echo $$(basename $$file .c); \
+       done > loglevels.tmp
+       (echo "char *loglevels[] = {"; for file in $$(cat loglevels.tmp); \
+       do \
+               echo "\"$$file\", "; \
+       done; \
+       echo "};") > include/loglevels.h;
+
+src/cfgparse.yy.o: src/cfgparse.l src/cfgparse.y.o ${HEADERS}
+       echo "LEX $<"
+       flex -i -o$(@:.o=.c) $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) -DLOGLEVEL="(1 << $(shell awk '/cfgparse.l/ { print NR }' loglevels.tmp))" -c -o $@ $(@:.o=.c)
+
+src/cmdparse.yy.o: src/cmdparse.l src/cmdparse.y.o ${HEADERS}
+       echo "LEX $<"
+       flex -Pcmdyy -i -o$(@:.o=.c) $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) -DLOGLEVEL="(1 << $(shell awk '/cmdparse.l/ { print NR }' loglevels.tmp))" -c -o $@ $(@:.o=.c)
+
+
+src/cfgparse.y.o: src/cfgparse.y ${HEADERS}
+       echo "YACC $<"
+       bison --debug --verbose -b $(basename $< .y) -d $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) -DLOGLEVEL="(1 << $(shell awk '/cfgparse.y/ { print NR }' loglevels.tmp))" -c -o $@ $(<:.y=.tab.c)
+
+src/cmdparse.y.o: src/cmdparse.y ${HEADERS}
+       echo "YACC $<"
+       bison -p cmdyy --debug --verbose -b $(basename $< .y) -d $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) -DLOGLEVEL="(1 << $(shell awk '/cmdparse.y/ { print NR }' loglevels.tmp))" -c -o $@ $(<:.y=.tab.c)
+
+
+install: all
+       echo "INSTALL"
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/bin
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(SYSCONFDIR)/i3
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/include/i3
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/share/xsessions
+       $(INSTALL) -m 0755 i3 $(DESTDIR)$(PREFIX)/bin/
+       $(INSTALL) -m 0755 i3-migrate-config-to-v4 $(DESTDIR)$(PREFIX)/bin/
+       test -e $(DESTDIR)$(SYSCONFDIR)/i3/config || $(INSTALL) -m 0644 i3.config $(DESTDIR)$(SYSCONFDIR)/i3/config
+       test -e $(DESTDIR)$(SYSCONFDIR)/i3/config.keycodes || $(INSTALL) -m 0644 i3.config.keycodes $(DESTDIR)$(SYSCONFDIR)/i3/config.keycodes
+       $(INSTALL) -m 0644 i3.welcome $(DESTDIR)$(SYSCONFDIR)/i3/welcome
+       $(INSTALL) -m 0644 i3.desktop $(DESTDIR)$(PREFIX)/share/xsessions/
+       $(INSTALL) -m 0644 include/i3/ipc.h $(DESTDIR)$(PREFIX)/include/i3/
+       for dir in $(SUBDIRS); do \
+               $(MAKE) -C $$dir install; \
+       done
+
+dist: distclean
+       [ ! -d i3-${VERSION} ] || rm -rf i3-${VERSION}
+       [ ! -e i3-${VERSION}.tar.bz2 ] || rm i3-${VERSION}.tar.bz2
+       mkdir i3-${VERSION}
+       cp i3-migrate-config-to-v4 i3.config.keycodes DEPENDS GOALS LICENSE PACKAGE-MAINTAINER TODO RELEASE-NOTES-${VERSION} i3.config i3.desktop i3.welcome pseudo-doc.doxygen i3-wsbar Makefile i3-${VERSION}
+       cp -r src i3-msg i3-nagbar i3-config-wizard yajl-fallback include man i3-${VERSION}
+       # Only copy toplevel documentation (important stuff)
+       mkdir i3-${VERSION}/docs
+       # Pre-generate documentation
+       make -C docs
+       # Cleanup τεχ output files
+       find docs -regex ".*\.\(aux\|out\|log\|toc\|bm\|dvi\|log\)" -exec rm '{}' \;
+       find docs -maxdepth 1 -type f ! \( -name "*.xcf" -or -name "*.svg" \) -exec cp '{}' i3-${VERSION}/docs \;
+       # Only copy source code from i3-input
+       mkdir i3-${VERSION}/i3-input
+       find i3-input -maxdepth 1 -type f \( -name "*.c" -or -name "*.h" -or -name "Makefile" \) -exec cp '{}' i3-${VERSION}/i3-input \;
+       sed -e 's/^GIT_VERSION:=\(.*\)/GIT_VERSION:=$(shell echo '${GIT_VERSION}' | sed 's/\\/\\\\/g')/g;s/^VERSION:=\(.*\)/VERSION:=${VERSION}/g' common.mk > i3-${VERSION}/common.mk
+       # Pre-generate a manpage to allow distributors to skip this step and save some dependencies
+       $(MAKE) -C man
+       cp man/*.1 i3-${VERSION}/man/
+       tar cfj i3-${VERSION}.tar.bz2 i3-${VERSION}
+       rm -rf i3-${VERSION}
+
+clean:
+       rm -f src/*.o src/*.gcno src/cfgparse.tab.{c,h} src/cfgparse.yy.c src/cfgparse.{output,dot} src/cmdparse.tab.{c,h} src/cmdparse.yy.c src/cmdparse.{output,dot} loglevels.tmp include/loglevels.h
+       (which lcov >/dev/null && lcov -d . --zerocounters) || true
+       $(MAKE) -C docs clean
+       $(MAKE) -C man clean
+       for dir in $(SUBDIRS); do \
+               echo ""; \
+               echo "CLEAN $$dir"; \
+               $(MAKE) TOPDIR=$(TOPDIR) -C $$dir distclean; \
+       done
+
+distclean: clean
+       rm -f i3
+       for dir in $(SUBDIRS); do \
+               echo ""; \
+               echo "DISTCLEAN $$dir"; \
+               $(MAKE) TOPDIR=$(TOPDIR) -C $$dir distclean; \
+       done
+
+coverage:
+       rm -f /tmp/i3-coverage.info
+       rm -rf /tmp/i3-coverage
+       lcov -d . -b . --capture -o /tmp/i3-coverage.info
+       genhtml -o /tmp/i3-coverage/ /tmp/i3-coverage.info
diff --git a/PACKAGE-MAINTAINER b/PACKAGE-MAINTAINER
new file mode 100644 (file)
index 0000000..3d9a8e1
--- /dev/null
@@ -0,0 +1,42 @@
+Dear package maintainer,
+
+thanks for packaging i3. By doing so, you are improving your distribution
+and i3 in general.
+
+Please read the file DEPENDS now, so you know which libraries are necessary
+and where to get them from if your distribution does not already have
+packages for them.
+
+Please make sure the manpage for i3 will be properly created and installed
+in your package.
+
+Also please provide the path to a suitable terminal emulator which is installed
+as a dependency of your package (e.g. urxvt). On systems which have a special
+commend to launch the best available terminal emulator, please use this one
+(e.g. x-terminal-emulator on debian).
+
+On debian, this looks like this:
+
+       # Compilation
+       $(MAKE) TERM_EMU=x-terminal-emulator
+       $(MAKE) -C man
+
+       # Installation
+       $(MAKE) DESTDIR=$(CURDIR)/debian/i3-wm/ install
+       mkdir -p $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/*.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+
+Please make sure that i3-migrate-config-to-v4 and i3-config-wizard are
+installed with i3. The Perl script is necessary to (automatically) convert v3
+configs to v4. The wizard provides the possibility to create a keysym-based
+config with the user’s preferred modifier and should be started on the first
+start of i3 (it will automatically exit if it finds a config file).
+
+If you have any questions, ideas, hints, problems or whatever, please do not
+hesitate to contact me. I will help you out. Just drop me an E-Mail (find the
+address at http://michael.stapelberg.de/Kontakt, scroll down to bottom),
+contact me using the same address in jabber or ask on our IRC channel:
+(#i3 on irc.twice-irc.de).
+
+Thanks again for your efforts,
+Michael
diff --git a/RELEASE-NOTES-4.0 b/RELEASE-NOTES-4.0
new file mode 100644 (file)
index 0000000..14ecbfa
--- /dev/null
@@ -0,0 +1,135 @@
+
+ ┌────────────────────────────┐
+ │ Release notes for i3 v4.0  │
+ └────────────────────────────┘
+
+This is the first release of the new major version of i3, v4.0. It has been a
+long time since v3.ε was released (over one year). A lot has been happening
+since then, we made 736 commits – compare that to the total number of 1664
+commits for i3.
+
+The reason for the high number of commits and long time for this release is the
+big refactoring we have been doing. Instead of using several lists and a table
+as data structures, we now use a single tree of containers. These containers
+represent invisible entities like your X11 root window, your different monitors
+and workspaces, but also visible entities like actual windows.
+
+Using a tree has made a lot of things cleaner and easier – in the code *and* in
+the user interface. Admittedly though, you will probably need a day or two to
+get used to a few more advanced movement commands if you are used to v3.ε right
+now.
+
+ ┌────────────────────────────┐
+ │ New features               │
+ └────────────────────────────┘
+
+ • In addition to the proper flex/bison based parser for the config file
+   introduced in 3.δ, we now also have a flex/bison parser for commands. What
+   this means is that we can have more human-readable, beautiful command names
+   instead of cryptic commands like 'f' for fullscreen or 'mh' for move left.
+   In fact, the commands for the aforementioned functions *are* 'fullscreen'
+   and 'move left'!
+
+ • You can now chain commands using ';' (a semicolon). One example for that is
+   'workspace 3 ; exec /usr/bin/urxvt' to switch to a new workspace and open a
+   terminal.
+
+ • You can specify which windows should be affected by your command by using
+   different criteria. A good example is '[class="Firefox"] kill' to get rid
+   of all Firefox windows.
+
+ • As the configuration file needs new commands (and a few options are
+   obsolete), you need to change it. To make this process a little bit easier
+   for you, this release comes with the script i3-migrate-config-to-v4. Just
+   run it on your current config file and it will spit out a v4 config file to
+   stdout. To make things even better, i3 automatically detects v3 config files
+   and calls that script, so you never end up with a non-working config :).
+
+ • Similarly to the criteria when using commands, we now have a 'for_window'
+   configuration directive, which lets you automatically apply certain commands
+   to certain windows. Use it to set border styles per window, for example with
+   'for_window [class="XTerm"] border 1pixel'.
+
+ • Since dock clients (like dzen2) are now part of the layout tree (as opposed
+   to a custom data structure as before), it was easy to implement top and
+   bottom dock areas. Programs which properly specify the dock hint get placed
+   on the edge of the screen they request. i3bar has the -dtop and -dbottom
+   parameters, for example.
+
+ • The internal workspace bar is obsolete. Use i3bar instead.
+
+ • Resizing now works between all windows!
+
+ • Fullscreen now works for everything!
+
+ • Floating now works for everything!
+
+ • Your layout is now preserved when doing an inplace restart.
+
+ • When you have an error in your config file, a new program called i3-nagbar
+   will tell you so. It offers you two buttons: One to view the error in your
+   $PAGER and one to edit your config in your $EDITOR.
+
+ • The default config used key symbols (like 'bind Mod1+f fullscreen') instead
+   of key codes. If you use a non-qwerty layout, the program i3-config-wizard
+   can create a key symbol based config file based on your current layout. You
+   can also chose between Windows (Mod4) and Alt (Mod1) as your default
+   modifier. i3-config-wizard will automatically be started as long as you
+   don’t have a configuration file for i3.
+
+ • Custom X cursor themes are now supported.
+
+ • The RandR backend now respects the primary output.
+
+ • A wrong 'font' configuration in your config file will no longer make i3
+   exit. Instead, it will fall back to a different font and tell you about the
+   error in its log.
+
+ • The default split direction (whether a new window gets placed right next to
+   the current one or below the current one) is now automatically set to
+   horizontal if you have a monitor that is wider than high or vertical if you
+   a monitor which is higher than wide. This works great with rotated monitors.
+
+ • Sockets and temporary files are now placed in XDG_RUNTIME_DIR, if set (this
+   is used on systemd based systems).
+
+ • Tools like i3bar, i3-msg etc. use the I3_SOCKET_PATH property which is set
+   to the X11 root window, so you don’t have to configure your socket path
+   anywhere.
+
+ • The kill command kills single windows by default now. To kill a whole
+   application, use 'kill client'.
+
+ • IPC: Commands can now have custom replies. When the parser encounters an
+   error, a proper error reply is sent.
+
+ • There is now an 'exec_always' configuration directive which works like
+   'exec' but will also be run when restarting.
+
+ ┌────────────────────────────┐
+ │ Future features            │
+ └────────────────────────────┘
+
+Our plans were big but our time and manpower is limited. Therefore, the
+following features did not make it into this release. However, the foundation
+is now in place and implementing them is possible, so stay tuned!
+
+ • Saving/Restoring specific parts of your layout
+
+ • Session saving
+
+ • Sticky windows
+
+ ┌────────────────────────────┐
+ │ Thanks!                    │
+ └────────────────────────────┘
+
+Thanks for testing, bugfixes, discussions and everything I forgot go out to:
+
+  aniou, artoj, badboy, cloud, cradle, David Coppa, dbp, dothebart, eeemsi,
+  eelvex, f8l, fernando, jan, jimdigriz, jon, julien, kacper, ktosiek,
+  lexszero, litemotiv, lourens, madroach, marcus, merovius, mike, mirko, mseed,
+  mxf, phnom, quaec, rogutes, sardemff7, smartass, thepub, tiago, tucos,
+  woddf2, xpt, ys
+
+-- Michael Stapelberg, 2011-07-31
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..8775e14
--- /dev/null
+++ b/TODO
@@ -0,0 +1,7 @@
+
+Please see http://i3.zekjur.net/ for our bugtracker.
+
+Some old notes, just to not lose them:
+ * was passiert, wenn zwei fenster fullscreen wollen auf dem selben workspace?
+ * OpenOffice
+ * funktioniert xinerama etc. mit --below? insbesondere das fokus-verschieben in andere screens
diff --git a/common.mk b/common.mk
new file mode 100644 (file)
index 0000000..0a695e7
--- /dev/null
+++ b/common.mk
@@ -0,0 +1,121 @@
+UNAME=$(shell uname)
+DEBUG=1
+COVERAGE=0
+INSTALL=install
+ifndef PREFIX
+  PREFIX=/usr
+endif
+ifndef SYSCONFDIR
+  ifeq ($(PREFIX),/usr)
+    SYSCONFDIR=/etc
+  else
+    SYSCONFDIR=$(PREFIX)/etc
+  endif
+endif
+TERM_EMU=xterm
+# The escaping is absurd, but we need to escape for shell, sed, make, define
+GIT_VERSION:="$(shell git describe --tags --always) ($(shell git log --pretty=format:%cd --date=short -n1), branch $(shell [ -f $(TOPDIR)/.git/HEAD ] && sed 's/ref: refs\/heads\/\(.*\)/\\\\\\"\1\\\\\\"/g' $(TOPDIR)/.git/HEAD || echo 'unknown'))"
+VERSION:=$(shell git describe --tags --abbrev=0)
+
+ifeq ($(shell which pkg-config 2>/dev/null 1>/dev/null || echo 1),1)
+$(error "pkg-config was not found")
+endif
+
+# An easier way to get CFLAGS and LDFLAGS falling back in case there's
+# no pkg-config support for certain libraries
+cflags_for_lib = $(shell pkg-config --silence-errors --cflags $(1))
+ldflags_for_lib = $(shell pkg-config --exists $(1) && pkg-config --libs $(1) || echo -l$(2))
+
+CFLAGS += -std=c99
+CFLAGS += -pipe
+CFLAGS += -Wall
+# unused-function, unused-label, unused-variable are turned on by -Wall
+# We don’t want unused-parameter because of the use of many callbacks
+CFLAGS += -Wunused-value
+CFLAGS += -Iinclude
+CFLAGS += $(call cflags_for_lib, xcb-keysyms)
+ifeq ($(shell pkg-config --exists xcb-util || echo 1),1)
+CPPFLAGS += -DXCB_COMPAT
+CFLAGS += $(call cflags_for_lib, xcb-atom)
+CFLAGS += $(call cflags_for_lib, xcb-aux)
+else
+CFLAGS += $(call cflags_for_lib, xcb-util)
+endif
+CFLAGS += $(call cflags_for_lib, xcb-icccm)
+CFLAGS += $(call cflags_for_lib, xcb-xinerama)
+CFLAGS += $(call cflags_for_lib, xcb-randr)
+CFLAGS += $(call cflags_for_lib, xcb)
+CFLAGS += $(call cflags_for_lib, xcursor)
+CFLAGS += $(call cflags_for_lib, x11)
+CFLAGS += $(call cflags_for_lib, yajl)
+CFLAGS += $(call cflags_for_lib, libev)
+CPPFLAGS += -DI3_VERSION=\"${GIT_VERSION}\"
+CPPFLAGS += -DSYSCONFDIR=\"${SYSCONFDIR}\"
+CPPFLAGS += -DTERM_EMU=\"$(TERM_EMU)\"
+
+LIBS += -lm
+LIBS += $(call ldflags_for_lib, xcb-event, xcb-event)
+LIBS += $(call ldflags_for_lib, xcb-keysyms, xcb-keysyms)
+ifeq ($(shell pkg-config --exists xcb-util || echo 1),1)
+LIBS += $(call ldflags_for_lib, xcb-atom, xcb-atom)
+LIBS += $(call ldflags_for_lib, xcb-aux, xcb-aux)
+else
+LIBS += $(call ldflags_for_lib, xcb-util)
+endif
+LIBS += $(call ldflags_for_lib, xcb-icccm, xcb-icccm)
+LIBS += $(call ldflags_for_lib, xcb-xinerama, xcb-xinerama)
+LIBS += $(call ldflags_for_lib, xcb-randr, xcb-randr)
+LIBS += $(call ldflags_for_lib, xcb, xcb)
+LIBS += $(call ldflags_for_lib, xcursor, Xcursor)
+LIBS += $(call ldflags_for_lib, x11, X11)
+LIBS += $(call ldflags_for_lib, yajl, yajl)
+LIBS += $(call ldflags_for_lib, libev, ev)
+
+ifeq ($(UNAME),NetBSD)
+# We need -idirafter instead of -I to prefer the system’s iconv over GNU libiconv
+CFLAGS += -idirafter /usr/pkg/include
+LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib
+endif
+
+ifeq ($(UNAME),OpenBSD)
+CFLAGS += -I${X11BASE}/include
+LIBS += -liconv
+LDFLAGS += -L${X11BASE}/lib
+endif
+
+ifeq ($(UNAME),FreeBSD)
+LIBS += -liconv
+endif
+
+ifeq ($(UNAME),Darwin)
+LIBS += -liconv
+endif
+
+# Fallback for libyajl 1 which did not include yajl_version.h. We need
+# YAJL_MAJOR from that file to decide which code path should be used.
+CFLAGS += -idirafter yajl-fallback
+
+ifneq (,$(filter Linux GNU GNU/%, $(UNAME)))
+CPPFLAGS += -D_GNU_SOURCE
+endif
+
+ifeq ($(DEBUG),1)
+# Extended debugging flags, macros shall be available in gcc
+CFLAGS += -gdwarf-2
+CFLAGS += -g3
+else
+CFLAGS += -O2
+CFLAGS += -freorder-blocks-and-partition
+endif
+
+ifeq ($(COVERAGE),1)
+CFLAGS += -fprofile-arcs -ftest-coverage
+LIBS += -lgcov
+endif
+
+# Don’t print command lines which are run
+.SILENT:
+
+# Always remake the following targets
+.PHONY: install clean dist distclean
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..aeca9a2
--- /dev/null
@@ -0,0 +1,353 @@
+i3-wm (4.0-1) unstable; urgency=low
+
+  * In addition to the proper flex/bison based parser for the config file
+    introduced in 3.δ, we now also have a flex/bison parser for commands. What
+    this means is that we can have more human-readable, beautiful command names
+    instead of cryptic commands like 'f' for fullscreen or 'mh' for move left.
+    In fact, the commands for the aforementioned functions *are* 'fullscreen'
+    and 'move left'!
+  * You can now chain commands using ';' (a semicolon). One example for that is
+    'workspace 3 ; exec /usr/bin/urxvt' to switch to a new workspace and open a
+    terminal.
+  * You can specify which windows should be affected by your command by using
+    different criteria. A good example is '[class="Firefox"] kill' to get rid
+    of all Firefox windows.
+  * As the configuration file needs new commands (and a few options are
+    obsolete), you need to change it. To make this process a little bit easier
+    for you, this release comes with the script i3-migrate-config-to-v4. Just
+    run it on your current config file and it will spit out a v4 config file to
+    stdout. To make things even better, i3 automatically detects v3 config files
+    and calls that script, so you never end up with a non-working config :).
+  * Similarly to the criteria when using commands, we now have a 'for_window'
+    configuration directive, which lets you automatically apply certain commands
+    to certain windows. Use it to set border styles per window, for example with
+    'for_window [class="XTerm"] border 1pixel'.
+  * Since dock clients (like dzen2) are now part of the layout tree (as opposed
+    to a custom data structure as before), it was easy to implement top and
+    bottom dock areas. Programs which properly specify the dock hint get placed
+    on the edge of the screen they request. i3bar has the -dtop and -dbottom
+    parameters, for example.
+  * The internal workspace bar is obsolete. Use i3bar instead.
+  * Resizing now works between all windows!
+  * Fullscreen now works for everything!
+  * Floating now works for everything!
+  * Your layout is now preserved when doing an inplace restart.
+  * When you have an error in your config file, a new program called i3-nagbar
+    will tell you so. It offers you two buttons: One to view the error in your
+    $PAGER and one to edit your config in your $EDITOR.
+  * The default config used key symbols (like 'bind Mod1+f fullscreen') instead
+    of key codes. If you use a non-qwerty layout, the program i3-config-wizard
+    can create a key symbol based config file based on your current layout. You
+    can also chose between Windows (Mod4) and Alt (Mod1) as your default
+    modifier. i3-config-wizard will automatically be started as long as you
+    don’t have a configuration file for i3.
+  * Custom X cursor themes are now supported.
+  * The RandR backend now respects the primary output.
+  * A wrong 'font' configuration in your config file will no longer make i3
+    exit. Instead, it will fall back to a different font and tell you about the
+    error in its log.
+  * The default split direction (whether a new window gets placed right next to
+    the current one or below the current one) is now automatically set to
+    horizontal if you have a monitor that is wider than high or vertical if you
+    a monitor which is higher than wide. This works great with rotated monitors.
+  * Sockets and temporary files are now placed in XDG_RUNTIME_DIR, if set (this
+    is used on systemd based systems).
+  * Tools like i3bar, i3-msg etc. use the I3_SOCKET_PATH property which is set
+    to the X11 root window, so you don’t have to configure your socket path
+    anywhere.
+  * The kill command kills single windows by default now. To kill a whole
+    application, use 'kill client'.
+  * IPC: Commands can now have custom replies. When the parser encounters an
+    error, a proper error reply is sent.
+  * There is now an 'exec_always' configuration directive which works like
+    'exec' but will also be run when restarting.
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Sun, 31 Jul 2011 22:34:26 +0200
+
+i3-wm (3.e-bf1-3) unstable; urgency=low
+
+  * include keyboard-layer{1,2}.png in docs (Closes: #595295)
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Wed, 03 Nov 2010 20:32:42 +0100
+
+i3-wm (3.e-bf1-2) unstable; urgency=low
+
+  * debian: call dh_installwm to register as alternative for x-window-manager
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Wed, 23 Jun 2010 18:23:10 +0200
+
+i3-wm (3.e-bf1-1) unstable; urgency=low
+
+  * Bugfix: Correctly initialize workspaces if RandR is not available
+  * Bugfix: Correctly handle asprintf() return value
+  * Bugfix: Update _NET_WM_STATE when clients request changes via ClientMessage
+  * Bugfix: Don’t invert directions when resizing floating clients (top/left)
+  * Bugfix: Don’t leak file descriptors
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Wed, 09 Jun 2010 09:51:10 +0200
+
+i3-wm (3.e-3) unstable; urgency=low
+
+  * Bump debian policy version
+  * Add Recommends: libanyevent-i3-perl, libanyevent-perl, libipc-run-perl
+    which are necessary to use i3-wsbar (which is not core functionality,
+    thus no Depends:) (Closes: #577287)
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Sat, 24 Apr 2010 11:20:19 +0200
+
+i3-wm (3.e-2) unstable; urgency=low
+
+  * Use x-terminal-emulator instead of hard-coded urxvt
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Sun, 04 Apr 2010 19:30:46 +0200
+
+i3-wm (3.e-1) unstable; urgency=low
+
+  * Implement RandR instead of Xinerama
+  * Obey the XDG Base Directory Specification for config file paths
+  * lexer/parser: proper error messages
+  * Add new options -V for verbose mode and -d <loglevel> for debug log levels
+  * Implement resize command for floating clients
+  * Include date of the last commit in version string
+  * Fixed cursor orientation when resizing
+  * Added focus_follows_mouse config option
+  * Feature: Cycle through workspaces
+  * Fix bindings using the cursor keys in default config
+  * added popup for handling SIGSEGV or SIGFPE
+  * Correctly exit when another window manager is already running
+  * Take into account the window’s base_{width,height} when resizing
+  * Disable XKB instead of quitting with an error
+  * Make containers containing exactly one window behave like default containers
+  * Also warp the pointer when moving a window to a another visible workspace
+  * work around clients setting 0xFFFF as resize increments
+  * Move autostart after creating the IPC socket in start process
+  * Restore geometry of all windows before exiting/restarting
+  * When in fullscreen mode, focus whole screens instead of denying to focus
+  * draw consistent borders for each frame in a tabbed/stacked container
+  * Update fullscreen client position/size when an output changes
+  * i3-input: Bugfix: repeatedly grab the keyboard if it does not succeed
+  * put windows with WM_CLIENT_LEADER on the workspace of their leader
+  * use real functions instead of nested functions (enables compilation with
+    llvm-clang)
+  * implement screen-spanning fullscreen mode
+  * floating resize now uses arbitrary corners
+  * floating resize now works proportionally when pressing shift
+  * Don’t use SYNC key bindings for mode_switch but re-grab keys
+  * support PREFIX and SYSCONFDIR in Makefile
+  * make pointer follow the focus when moving to a different screen also for
+    floating clients
+  * start dock clients on the output they request to be started on according
+    to their geometry
+  * handle destroy notify events like unmap notify events
+  * ewmh: correctly set _NET_CURRENT_DESKTOP to the number of the active
+    workspace
+  * ewmh: correctly set _NET_ACTIVE_WINDOW
+  * ewmh: implement support for _NET_WORKAREA (rdesktop can use that)
+  * default ipc-socket path is now ~/.i3/ipc.sock, enabled in the default config
+  * Bugfix: Containers could lose their snap state
+  * Bugfix: Use ev_loop_new to not block SIGCHLD
+  * Bugfix: if a font provides no per-char info for width, fall back to default
+  * Bugfix: lexer: return to INITIAL state after floating_modifier
+  * Bugfix: Don’t leak IPC socket to launched processes
+  * Bugfix: Use both parts of WM_CLASS (it contains instance and class)
+  * Bugfix: Correctly do boundary checking/moving to other workspaces when
+    moving floating clients via keyboard
+  * Bugfix: checked for wrong flag in size hints
+  * Bugfix: Correctly render workspace names containing some non-ascii chars
+  * Bugfix: Correctly position floating windows sending configure requests
+  * Bugfix: Don’t remap stack windows errnously when changing workspaces
+  * Bugfix: configure floating windows above tiling windows when moving them
+    to another workspace
+  * Bugfix: Take window out of fullscreen mode before entering floating mode
+  * Bugfix: Don’t enter BIND_A2WS_COND state too early
+  * Bugfix: only restore focus if the workspace is focused, not if it is visible
+  * Bugfix: numlock state will now be filtered in i3-input and signal handler
+  * Bugfix: Don’t unmap windows when current workspace gets reassigned
+  * Bugfix: correctly translate coordinates for floating windows when outputs
+    change
+  * Bugfix: Correctly switch workspace when using the "jump" command
+  * Bugfix: Fix rendering of workspace names after "reload"
+  * Bugfix: Correctly ignore clicks when in fullscreen mode
+  * Bugfix: Don’t allow fullscreen floating windows to be moved
+  * Bugfix: Don’t render containers which are not visible on hint changes
+  * Some memory leaks/invalid accesses have been fixed
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Tue, 30 Mar 2010 13:11:50 +0200
+
+i3-wm (3.d-bf1-1) unstable; urgency=low
+
+  * Bugfix: Don’t draw window title when titlebar is disabled
+  * Bugfix: Correctly switch border types for floating windows
+  * Bugfix: Correctly replay pointer if the click handler does not trigger
+  * Bugfix: Also allow WORDs as workspace names
+  * Bugfix: Correctly clear the urgency hint if a window gets unmapped without
+    clearing it
+  * Bugfix: Fix resizing of floating windows in borderless/1-px-border mode
+  * Bugfix: Accept underscores in bindsym
+  * Bugfix: Don’t set the urgency flag if the window is focused
+  * Bugfix: Handle stack-limit cols on tabbed containers
+  * Bugfix: Resize client after updating base_width/base_height
+  * Bugfix: Force render containers after setting the client active
+  * Bugfix: Fix two problems in resizing floating windows with right mouse
+  * Bugfix: Use more precise floating point arithmetics
+  * Bugfix: Correctly place new windows below fullscreen windows
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Mon, 21 Dec 2009 22:33:02 +0100
+
+i3-wm (3.d-2) unstable; urgency=low
+
+  * debian: register in doc-base
+  * debian: add watchfile
+  * debian: remove unnecessary priority-field from binary packages
+  * debian: add missing images to documentation
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Mon, 23 Nov 2009 21:56:04 +0100
+
+i3-wm (3.d-1) unstable; urgency=low
+
+  * Implement tabbing (command "T")
+  * Implement horizontal resize of containers (containers! not windows)
+  * Implement the urgency hint for windows/workspaces
+  * Implement vim-like marks (mark/goto command)
+  * Implement stack-limit for further defining how stack windows should look
+  * Implement modes which allow you to use a different set of keybindings
+    when inside a specific mode
+  * Implement changing the default mode of containers
+  * Implement long options (--version, --no-autostart, --help, --config)
+  * Implement 'bt' to toggle between the different border styles
+  * Implement an option to specify the default border style
+  * Use a yacc/lex parser/lexer for the configuration file
+  * The number of workspaces is now dynamic instead of limited to 10
+  * Floating windows (and tiled containers) can now be resized using
+    floating_modifier and right mouse button
+  * Dock windows can now reconfigure their height
+  * Bugfix: Correctly handle multiple messages on the IPC socket
+  * Bugfix: Correctly use base_width, base_height and size increment hints
+  * Bugfix: Correctly send fake configure_notify events
+  * Bugfix: Don’t crash if the numlock symbol cannot be found
+  * Bugfix: Don’t display a colon after unnamed workspaces
+  * Bugfix: If the pointer is outside of the screen when starting, fall back to
+    the first screen.
+  * Bugfix: Initialize screens correctly when not using Xinerama
+  * Bugfix: Correctly handle unmap_notify events when resizing
+  * Bugfix: Correctly warp pointer after rendering the layout
+  * Bugfix: Fix NULL pointer dereference when reconfiguring screens
+  * Explicitly specify -lxcb when linking (Closes: #554860)
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Mon, 09 Nov 2009 20:53:43 +0100
+
+i3-wm (3.c-2) unstable; urgency=low
+
+  * Fix FTBFS on GNU/kFreeBSD and possibly GNU/Hurd (Closes: #542877)
+  * Add manpage for i3-msg
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Mon, 24 Aug 2009 12:23:18 +0200
+
+i3-wm (3.c-1) unstable; urgency=low
+
+  * Implement a reload command
+  * Implement keysymbols in configuration file
+  * Implement assignments of workspaces to screens
+  * Implement named workspaces
+  * Implement borderless/1-px-border windows
+  * Implement command to focus screens
+  * Implement IPC via unix sockets
+  * Correctly render decoration of floating windows
+  * Map floating windows requesting (0x0) to center of their leader/workspace
+  * Optimization: Render stack windows on pixmaps to reduce flickering
+  * Optimization: Directly position new windows to their final position
+  * Bugfix: Repeatedly try to find screens if none are available
+  * Bugfix: Correctly redecorate clients when changing focus
+  * Bugfix: Don’t crash when clients reconfigure themselves
+  * Bugfix: Fix screen wrapping
+  * Bugfix: Fix selecting a different screen with your mouse when not having
+    any windows on the current workspace
+  * Bugfix: Correctly unmap stack windows and don’t re-map them too early
+  * Bugfix: Allow switching layout if there are no clients in the this container
+  * Bugfix: Set WM_STATE_WITHDRAWN when unmapping, unmap windows when
+    destroying
+  * Bugfix: Don’t hide assigned clients to inactive but visible workspaces
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Wed, 19 Aug 2009 13:07:58 +0200
+
+i3-wm (3.b-1) unstable; urgency=low
+
+  * Bugfix: Correctly handle col-/rowspanned containers when setting focus.
+  * Bugfix: Correctly handle col-/rowspanned containers when snapping.
+  * Bugfix: Force reconfiguration of all windows on workspaces which are
+    re-assigned because a screen was detached.
+  * Bugfix: Several bugs in resizing table columns fixed.
+  * Bugfix: Resizing should now work correctly in all cases.
+  * Bugfix: Correctly re-assign dock windows when workspace is destroyed.
+  * Bugfix: Correctly handle Mode_switch modifier.
+  * Bugfix: Don't raise clients in fullscreen mode.
+  * Bugfix: Re-assign dock windows to different workspaces when a workspace
+    is detached.
+  * Bugfix: Fix crash because of workspace-pointer which did not get updated
+  * Bugfix: Correctly initialize screen when Xinerama is disabled.
+  * Bugfix: Fullscreen window movement and focus problems fixed
+  * Implement jumping to other windows by specifying their position or
+    window class/title.
+  * Implement jumping back by using the focus stack.
+  * Implement autostart (exec-command in configuration file).
+  * Implement floating.
+  * Implement automatically assigning clients on specific workspaces.
+  * Implement variables in configfile.
+  * Colors are now configurable.
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Fri, 26 Jun 2009 04:42:23 +0200
+
+i3-wm (3.a-bf2-1) unstable; urgency=low
+
+  * Bugfix: Don't crash when setting focus
+  * Bugfix: Reconfigure bar window when changing resolutions
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Sun, 03 May 2009 23:02:24 +0200
+
+i3-wm (3.a-bf1-1) unstable; urgency=low
+
+  * Bugfix: When entering a stack window with the mouse, set focus to the
+    active client in the container the stack window belongs to.
+  * Bugfix: Correctly filter out the numlock bit. This fixes i3 not reacting
+    to any keybindings after pressing numlock once.
+  * Bugfix: Don't crash when Xinerama is disabled.
+  * Bugfix: Correctly remove client from container when moving to another
+    workspace.
+  * Bugfix: Set focus to the client which was previously focused instead of
+    the next client in container when moving windows out of a container.
+  * Bugfix: Correctly set focus when switching between screens.
+  * Bugfix: Don't crash anymore moving focus to another screen under the
+    following conditions: The screen you switch to has a lower number of cells
+    and/or rows than the current one, you switch focus using your mouse, you
+    previously were in a column/row which is not available on the destination
+    screen.
+  * Bugfix: When switching screens, warp the pointer to the correct
+    destination window.
+  * Bugfix: Store dock clients per screen, not per workspace.
+  * Bugfix: Perform bounds checking for snapped containers.
+  * Bugfix: Send clients their absolute position/size (on the root window) in
+    generated configure events. This fixes problems with xfontsel, xmaple,
+    etc.
+  * Bugfix: Correctly update state when moving fullscreen windows across
+    workspaces.
+  * Bugfix: Correctly restart i3 when not using its absolute path
+  * Bugfix: Drag & Drop in GTK applications works now
+  * Bugfix: Don't hide non-managed windows (libnotify-popups for example)
+    when raising clients in stacked containers.
+  * Bugfix: Correctly restore focus when leaving fullscreen mode
+  * Bugfix: Re-distribute free space when closing customly resized containers,
+    re-evaluate for other containers
+  * Bugfix: When moving windows into different containers, insert them at the
+    correct position.
+  * Bugfix: Correctly set focus when moving windows into other containers
+  * Implement scrolling on stack windows and on the bottom bar.
+  * Create i3-wm-dbg with debug symbols
+  * Don't rely on libxcb-wm any longer, as it got removed in libxcb 0.3.4.
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Sat, 02 May 2009 20:55:46 +0200
+
+i3-wm (3.a-1) unstable; urgency=low
+
+  * First release (Closes: #521709)
+
+ -- Michael Stapelberg <michael@stapelberg.de>  Sun, 29 Mar 2009 18:21:30 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..1e8b314
--- /dev/null
@@ -0,0 +1 @@
+6
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..7c5b462
--- /dev/null
@@ -0,0 +1,45 @@
+Source: i3-wm
+Section: utils
+Priority: extra
+Maintainer: Michael Stapelberg <michael@stapelberg.de>
+DM-Upload-Allowed: yes
+Build-Depends: debhelper (>= 6), libx11-dev, libxcb-util0-dev (>= 0.3.8), libxcb-keysyms1-dev, libxcb-xinerama0-dev (>= 1.1), libxcb-randr0-dev, libxcb-icccm4-dev, libxcursor-dev, asciidoc (>= 8.4.4), xmlto, docbook-xml, pkg-config, libev-dev, flex, bison, libyajl-dev, perl, texlive-latex-base, texlive-latex-recommended, texlive-latex-extra
+Standards-Version: 3.9.2
+Homepage: http://i3wm.org/
+
+Package: i3
+Architecture: any
+Section: x11
+Depends: i3-wm, ${misc:Depends}
+Recommends: i3lock, dwm-tools, i3status
+Description: metapackage (i3 window manager, screen locker, menu, statusbar)
+ This metapackage installs the i3 window manager (i3-wm), the i3lock screen
+ locker (slightly improved version of slock), dwm-tools which contains dmenu
+ and i3status, which displays useful information about your system in
+ combination with dzen2. These are all the tools you need to use the i3 window
+ manager efficiently.
+
+Package: i3-wm
+Architecture: any
+Section: x11
+Depends: ${shlibs:Depends}, ${misc:Depends}, x11-utils
+Provides: x-window-manager
+Suggests: rxvt-unicode | x-terminal-emulator
+Recommends: xfonts-base, libanyevent-i3-perl, libanyevent-perl, libipc-run-perl
+Description: improved dynamic tiling window manager
+ Key features of i3 are correct implementation of Xinerama (workspaces are
+ assigned to virtual screens, i3 does the right thing when attaching new
+ monitors), XrandR support (not done yet), horizontal and vertical columns
+ (think of a table) in tiling. Also, special focus is on writing clean,
+ readable and well documented code. i3 uses xcb for asynchronous
+ communication with X11, and has several measures to be very fast.
+ .
+ Please be aware i3 is primarily targeted at advanced users and developers.
+
+Package: i3-wm-dbg
+Architecture: any
+Section: debug
+Depends: i3-wm (=${binary:Version}), ${misc:Depends}
+Description: Debugging symbols for the i3 window manager
+ Debugging symbols for the i3 window manager. Please install this to produce
+ useful backtraces before creating new tickets.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..46a3d79
--- /dev/null
@@ -0,0 +1,30 @@
+This Debian package is based on a tarball downloaded from
+http://i3wm.org/
+
+Copyright: (C) 2009-2011 Michael Stapelberg <michael+i3 at stapelberg dot de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+  list of conditions and the following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of Michael Stapelberg, i3 nor the names of its contributors
+  may be used to endorse or promote products derived from this software without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/debian/i3-wm.doc-base b/debian/i3-wm.doc-base
new file mode 100644 (file)
index 0000000..8e24720
--- /dev/null
@@ -0,0 +1,10 @@
+Document: i3-wm
+Title: i3 documentation
+Author: Michael Stapelberg
+Abstract: The documentation explains how to use and modify the i3 window
+ manager.
+Section: Window Managers
+
+Format: HTML
+Files: /usr/share/doc/i3-wm/*.html
+Index: /usr/share/doc/i3-wm/userguide.html
diff --git a/debian/i3-wm.docs b/debian/i3-wm.docs
new file mode 100644 (file)
index 0000000..d59c573
--- /dev/null
@@ -0,0 +1,16 @@
+docs/debugging.html
+docs/hacking-howto.html
+docs/userguide.html
+docs/bigpicture.png
+docs/single_terminal.png
+docs/snapping.png
+docs/two_columns.png
+docs/two_terminals.png
+docs/modes.png
+docs/stacklimit.png
+docs/ipc.html
+docs/multi-monitor.html
+docs/wsbar.html
+docs/wsbar.png
+docs/keyboard-layer1.png
+docs/keyboard-layer2.png
diff --git a/debian/i3-wm.wm b/debian/i3-wm.wm
new file mode 100644 (file)
index 0000000..179b073
--- /dev/null
@@ -0,0 +1 @@
+/usr/bin/i3
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..c392f71
--- /dev/null
@@ -0,0 +1,84 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+config.status: configure
+       dh_testdir
+       touch $@
+
+build: build-arch build-indep
+
+build-arch: build-stamp
+build-indep: build-stamp
+
+build-stamp:
+       dh_testdir
+
+       # Add here commands to compile the package.
+       $(MAKE) TERM_EMU=x-terminal-emulator
+       $(MAKE) -C man
+       $(MAKE) -C docs
+
+       touch $@
+
+clean: 
+       dh_testdir
+       dh_testroot
+       rm -f build
+
+       # Add here commands to clean up after the build process.
+       [ ! -f Makefile ] || $(MAKE) distclean
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/i3-wm
+       $(MAKE) DESTDIR=$(CURDIR)/debian/i3-wm/ install
+       mkdir -p $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/i3.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/i3-msg.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/i3-input.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/i3-nagbar.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/i3-config-wizard.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+       cp man/i3-migrate-config-to-v4.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+       dh_installdebconf       
+       dh_installinit
+       dh_installman
+       dh_installwm
+       dh_link
+       dh_strip --dbg-package=i3-wm-dbg
+       dh_compress
+       dh_fixperms
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install 
diff --git a/debian/watch b/debian/watch
new file mode 100644 (file)
index 0000000..ab71a19
--- /dev/null
@@ -0,0 +1,2 @@
+version=3
+http://i3wm.org/downloads/ /downloads/i3-(.*)\.tar\.bz2
diff --git a/docs/GPN-2009-06-27/i3.tex b/docs/GPN-2009-06-27/i3.tex
new file mode 100644 (file)
index 0000000..60a0113
--- /dev/null
@@ -0,0 +1,510 @@
+%
+% © 2009 Michael Stapelberg
+%
+% 2009-06-24
+%
+\documentclass[mode=print,paper=screen,style=jefka]{powerdot}
+\usepackage[utf8]{inputenc}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{ngerman}
+\usepackage{url}
+\usepackage{listings}
+\newcommand{\bs}{\textbackslash}
+\pdsetup{palette=white}
+\definecolor{darkblue}{rgb}{0,0,.6}
+\definecolor{darkred}{rgb}{.6,0,0}
+\definecolor{darkgreen}{rgb}{0,.6,0}
+\definecolor{darkgray}{gray}{.3}
+\definecolor{lightblue}{rgb}{0.97,0.99,1}
+
+\lstloadlanguages{C}
+\lstdefinestyle{colors}{keywordstyle={\bf\color{darkblue}}, commentstyle={\em\color{magenta}}, stringstyle={\color{darkred}},%
+                        emphstyle={\color{darkgray}}}
+\lstnewenvironment{code}{%
+        \lstset{frame=single, basicstyle=\footnotesize\ttfamily, language=C, showstringspaces=false,%
+                style=colors, numbers=left, morekeywords={xcb_get_window_attributes_cookie_t, xcb_map_request_event_t,%
+                xcb_connection_t, xcb_get_window_attributes_reply_t, window_attributes_t, xcb_intern_atom_cookie_t,%
+                xcb_intern_atom_reply_t, xcb_atom_t, uint32_t, uint16_t, foreach, UINT_MAX, NULL},%
+                moreemph={xcb_get_window_attributes_reply, xcb_get_window_attributes_unchecked, manage_window,%
+                add_ignore_event, xcb_intern_atom, xcb_intern_atom_reply, fprintf, printf, free, load_configuration,%
+                XInternAtom, exit, strlen, xcb_change_window_attributes, xcb_event_wait_for_event_loop,%
+                xcb_event_set_key_press_handler, xcb_property_set_handler}}
+}{}
+
+\newcommand{\isrc}[1]{\begin{center} \footnotesize\ttfamily Siehe auch: #1 \end{center}}
+
+\title{Hacking your own window manager}
+\author{sECuRE auf der GPN 8\\
+~\\
+powered by \LaTeX, of course}
+\begin{document}
+\maketitle
+
+\begin{slide}{Dieser Vortrag}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Geschichte/Einführung in Window Manager
+        \item Merkmale von i3
+        \item Window Manager und X11
+        %
+        % zuerst: wie funktioniert ein client?
+        %
+        % WM ist nur ein weiterer Client
+        % Keine Rechteverwaltung, prinzipiell darf jeder Fenster schubsen
+        % Clients können Events abfangen, der WM macht das halt für das root-fenster
+        \item Arbeitsumgebung
+        \item XCB
+        \item Setup
+        \item Reparenting (Window Decorations)
+        %\item fake\_configure\_notify
+        %\item Colorpixel
+        %\item UTF-8
+        % irgendwo da erwähnen: fenster in eine hashtable aufnehmen
+
+        \item Events
+        % (die kriegt man natürlich nur wenn man redirectmask gesetzt hat:)
+        % MapRequest
+        % ConfigureRequest
+        \item Hints (Titel, Klassen, Größen, …)
+        % Atoms
+        % NetWM
+        % - NET_WM_WINDOW_TYPE
+        % - NET_WM_NAME
+        %   - in kombination mit NET_SUPPORTING_WM_CHECK auf dem rootfenster
+        % - NET_WM_STRUT_PARTIAL
+        % ICCCM
+        % - Normal hints / size hints (warum zwei namen?)
+        %   - Aspect ratio, wichtig z.B. für mplayer
+        %   - min/max size, interessant primär für floating
+        % - WM_NAME
+        % - WM_TRANSIENT_FOR
+        % - WM_CLASS
+        \item Gotchas
+        % flush()
+        % WM_STATE_NORMAL und drag&drop in gtk-apps
+        \item Zusammenfassung
+        % TODO
+\end{list}
+\end{slide}
+
+\begin{slide}{Geschichte/Einführung}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item<1-> „All window managers suck, this one just sucks less”?
+        \item<2-> Desktop environment vs. window manager (GNOME, KDE, Xfce, …)
+        \item<3-> Stacking (e17, fluxbox, IceWM, fvwm, …) vs Tiling (dwm, wmii, xmonad, …)
+        \item<4-> dwm, awesome, xmonad, …: statisches Layout
+        % gedanke: man braucht sich nicht mal mehr um das layout kümmern
+        \item<5-> wmii, ion: dynamisches layout
+        \item<6-> Probleme an ion: tuomov (Lizenz, Kommunikation), Config, Look and feel, Code
+        \item<7-> Probleme an wmii: Xinerama-support, Xlib, undokumentierter Code, nur Spalten, keine Reihen, Kleinigkeiten (titellose Fenster)
+\end{list}
+\end{slide}
+
+\begin{slide}{Merkmale von i3}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item<1-> gut lesbarer, dokumentierter Code. Dokumentation.
+        \item<2-> XCB anstelle von Xlib
+        \item<3-> Xinerama done right™
+        \item<4-> Spalten und Zeilen, Tabelle als Basis
+        \item<5-> command-mode, wie in vim
+        \item<6-> UTF-8 clean
+        \item<7-> kein Antialiasing, schlank und schnell bleiben
+\end{list}
+\end{slide}
+
+\begin{slide}{Typische Kommunikation mit X}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item<1-> Verbindung aufbauen
+        \item<2-> Requests über die Leitung schicken (Fenster erzeugen)
+        \begin{list}{$\bullet$}{\itemsep=1em}
+                \item Cookie für jeden Request
+                \item Antwort für spezifisches Cookie abholen
+                \item $\Rightarrow$ Asynchronität nutzbar
+        \end{list}
+        \item<3-> Eventloop starten, reagieren (Fenster zeichnen, Eingaben, …)
+\end{list}
+\end{slide}
+
+\begin{slide}{Was genau macht ein WM?}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item<1-> Events umlenken
+        \item<2-> Neue Fenster anzeigen/positionieren (MapRequest)
+        \item<3-> Titelleisten malen (reparenting)
+        \item<4-> Den Fokus verwalten
+        \item<5-> Mit Hints umgehen (Fenstertitel, Fullscreen, Dock, …)
+        \item<6-> Auf Benutzereingaben reagieren
+\end{list}
+\end{slide}
+
+
+\begin{slide}[method=direct]{Window Manager und X11 (1)}
+\includegraphics[width=1\textwidth]{xserver_konzept.eps}
+\end{slide}
+
+\begin{slide}{Window Manager und X11 (2)}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item<1-> Keine Rechteaufteilung, prinzipiell kann jeder Fenster managen
+        \item<2-> Window Manager verantwortlich für alle Kinder das Root-Fensters
+        \item<3-> RedirectMask, lässt sich Events des Root-Fensters schicken
+        \item<4-> Setzt hints auf dem Root-Fenster
+\end{list}
+\end{slide}
+
+\begin{slide}{Arbeitsumgebung}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item X sinnvoll beim Entwickeln $\Rightarrow$ anderen Computer verwenden oder Xephyr
+        \item xtrace dazwischenschalten (sowohl zwischen WM und X11 als auch zwischen Clients und X11 sinnvoll)\\
+\texttt{DISPLAY=:1 xtrace -o /tmp/xtrace.log -n :9}
+        \item \texttt{xprop} zeigt Hints an, \texttt{xwininfo} gibt Struktur aus
+        \item als ersten Client ein Terminal starten $\Rightarrow$ wenn der WM crashed lebt
+        die X-Session noch\\
+\texttt{DISPLAY=:1 urxvt \&}
+        \item Debugger, strace, logfiles, core-dumps aktivieren\\
+        (Siehe auch \url{http://i3.zekjur.net/docs/debugging.html})
+\end{list}
+\end{slide}
+
+\begin{slide}{XCB}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item \url{http://xcb.freedesktop.org/}
+        \item<1-> „X-protocol C-language Binding”
+        \item<2-> Klein, wartbar (aus einer Protokollbeschreibung auto-generiert)
+        \item<3-> Sinnvoll benannte Funktionsnamen und Datentypen
+        \item<4-> Nutzt die Asynchronität von X aus
+        \item<5-> Allerdings: Sehr spärlich dokumentiert, man muss mit Xlib-Doku arbeiten
+        \item<6-> xcb-util: XCB noch mal ein bisschen gekapselt, nützliche Funktionen abstrahiert
+\end{list}
+\end{slide}
+
+\begin{slide}[method=direct]{Xlib-Beispielcode}
+\begin{code}
+  char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE",
+  "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */};
+  Atom atoms[10];
+
+  /* Get atoms */
+  for (int i = 0; i < 10; i++) {
+    atoms[i] = XInternAtom(display, names[i], 0);
+  }
+\end{code}
+\end{slide}
+
+\begin{slide}[method=direct]{XCB-Beispielcode}
+\begin{code}
+char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE",
+  "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */};
+xcb_intern_atom_cookie_t cookies[10];
+
+/* Place requests for atoms as soon as possible */
+for (int c = 0; c < 10; c++)
+  cookies[c] = xcb_intern_atom(connection, 0,
+                               strlen(names[c]), names[c]);
+
+/* Do other stuff here */
+load_configuration();
+
+/* Get atoms */
+for (int c = 0; c < 10; c++) {
+  xcb_intern_atom_reply_t *reply =
+    xcb_intern_atom_reply(connection, cookies[c], NULL);
+  if (!reply) {
+    fprintf(stderr, "Could not get atom\n");
+    exit(-1);
+  }
+  printf("atom has ID %d\n", reply->atom);
+  free(reply);
+}
+\end{code}
+\end{slide}
+
+\begin{slide}[method=direct]{Setup}
+\begin{code}
+get_atoms();
+
+xcb_event_set_key_press_handler(&evenths, handle_key_press, NULL);
+xcb_property_set_handler(&prophs, WM_TRANSIENT_FOR, UINT_MAX,
+                         handle_transient_for, NULL);
+
+xcb_grab_key(conn, 0, root, modifier, keycode,
+             XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC);
+xcb_grab_key(conn, 0, root, modifier | xcb_numlock_mask, keycode,
+             XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC);
+
+uint32_t values[] = { XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                      XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+                      XCB_EVENT_MASK_PROPERTY_CHANGE |
+                      XCB_EVENT_MASK_ENTER_WINDOW };
+xcb_change_window_attributes(conn, root, XCB_CW_EVENT_MASK, values);
+
+manage_existing_windows();
+
+xcb_event_wait_for_event_loop(&evenths);
+\end{code}
+
+\isrc{i3/src/mainx.c:370ff}
+\end{slide}
+
+\begin{slide}[method=direct]{Reparenting}
+\includegraphics[width=1\textwidth]{reparenting.eps}
+\begin{enumerate}
+        \item (App) Fenster wird konfiguriert (Position, Größe, …)
+        \item (App) MapRequest
+        \item (WM) Window Manager erstellt eigenes Fenster
+        \item (WM) Reparent = neues Fenster kriegt statt root das WM-Fenster als parent
+        \item (WM) Mappen des neuen Fensters
+\end{enumerate}
+\end{slide}
+
+\begin{slide}[method=direct]{fake\_configure\_notify}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item (Alte) Reparented clients kriegen nichts mit, denken relativ zum root-Fenster
+        \item $\Rightarrow$ Window Manager tut so, als würde das Fenster neu konfiguriert, sendet den Event mit absoluten statt relativen Koordinaten
+        \item Sieht man sehr gut an \texttt{xfontsel} und anderen Anwendungen, die Xaw (X Athena widget set) verwenden
+\end{list}
+\begin{code}
+        xcb_configure_notify_event_t generated_event;
+        generated_event.window = window;
+        generated_event.response_type = XCB_CONFIGURE_NOTIFY;
+        generated_event.x = r.x;
+        /* ... */
+        generated_event.override_redirect = false;
+        xcb_send_event(conn, false, window,
+                       XCB_EVENT_MASK_STRUCTURE_NOTIFY,
+                       (char*)&generated_event);
+\end{code}
+\isrc{i3/src/xcb.c:193ff}
+\end{slide}
+
+
+\begin{slide}[method=direct]{Events: button\_press}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Aktiv grabben, die Anwendung soll keinen Klick bekommen, wenn der Nutzer das Fenster verschiebt
+\end{list}
+\begin{code}
+int handle_button_press(void *ignored, xcb_connection_t *conn,
+                        xcb_button_press_event_t *event) {
+        /* ... */
+        if ((event->state & XCB_MOD_MASK_1) != 0)
+                floating_drag_window(conn, client, event);
+
+        /* ... */
+        if (event->detail == XCB_BUTTON_INDEX_4 ||
+            event->detail == XCB_BUTTON_INDEX_5) {
+                LOG("User scrolled\n");
+                return 1;
+        }
+        /* if unhandled, forward the click to the application */
+        xcb_allow_events(conn, XCB_ALLOW_REPLAY_POINTER, event->time);
+        return 1;
+}
+\end{code}
+\isrc{i3/src/handlers.c:148ff}
+\end{slide}
+
+
+\begin{slide}[method=direct]{Events: enter\_notify}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Der Mauszeiger ist über dem Fenster gelandet
+        \item Auch unabsichtlich: Wenn das Fenster unter den Mauszeiger konfiguriert wird
+        \item $\Rightarrow$ Blacklist an Events, die man ignorieren muss
+\end{list}
+
+\begin{code}
+int handle_enter_notify(void *ignored, xcb_connection_t *conn,
+                        xcb_enter_notify_event_t *event) {
+        if (event_is_ignored(event->sequence))
+                return 1;
+
+        Client *client = table_get(&by_parent, event->event);
+        if (client == NULL) {
+                return 1; /* user moved cursor to another screen */
+        }
+
+        set_focus(conn, client, false);
+        return 1;
+}
+\end{code}
+\isrc{i3/src/handlers.c:148ff}
+\end{slide}
+
+
+\begin{slide}[method=direct]{Events: key\_press }
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Aktives key grabbing: WM entscheidet, ob Tastendruck weitergeht, also bei der Anwendung ankommt (kann abfangen)
+        \item Passives key grabbing: WM kriegt einen event
+\end{list}
+
+\begin{code}
+uint16_t state_filtered =
+         event->state & ~(xcb_numlock_mask | XCB_MOD_MASK_LOCK);
+state_filtered &= 0xFF; /* filter mouse buttons */
+foreach (binding) {
+        if (binding->keycode == event->detail &&
+            binding->mods == state_filtered) {
+                /* do fancy stuff here */
+                break;
+        }
+}
+\end{code}
+\isrc{i3/src/handlers.c:100ff}
+\end{slide}
+
+\begin{slide}[method=direct]{Events: key\_press (2), Mode\_switch }
+\begin{list}{$\bullet$}{\itemsep=.25em}
+        \item \texttt{event->state} enthält nie das Mode\_switch-Bit, Bug in X
+        \item XKB hilft, den korrekten state zu ermitteln
+        \item $\Rightarrow$ Mode\_switch nicht als modifier in \texttt{xcb\_grab\_key} verwendbar
+        \item $\Rightarrow$ wir grabben alle keys aktiv (!) und filtern selbst nach Mode\_switch
+\end{list}
+
+\begin{code}
+/* ... state_filtered is already cleaned */
+XkbStateRec state;
+if (XkbGetState(xkbdpy, XkbUseCoreKbd, &state) == Success &&
+    (state.group+1) == 2)
+        state_filtered |= BIND_MODE_SWITCH;
+foreach (binding)
+        if (binding->keycode == event->detail &&
+            binding->mods == state_filtered) {
+                xcb_allow_events(conn, SyncKeyboard, event->time);
+                return; /* after doing actual stuff, of course */
+        }
+xcb_allow_events(conn, ReplayKeyboard, event->time);
+\end{code}
+\isrc{i3/src/handlers.c:100ff}
+\end{slide}
+
+
+\begin{slide}[method=direct]{Umlaute und Sonderzeichen}
+\includegraphics[width=.5\textwidth]{xft.eps}
+\begin{list}{$\bullet$}{\itemsep=.1em}
+        \item Verschiedene APIs fürs Rendern von Text: X Core Fonts und xft
+        \item xft = X FreeType, antialiased fonts, Pango, GTK
+        \item Problem mit X Core Fonts: keine Sonderzeichen
+        \item …oder? \texttt{misc-fixed-*-iso10646}, also X Core Fonts mit Universal Character Set (= Unicode-Zeichen). Nicht 100\% vollständig
+        \item urxvt: benutzt beide APIs, pro Glyph unterschiedlich
+        \item Trend geht leider zu fontconfig/xft :-(
+\end{list}
+\end{slide}
+
+\begin{slide}[method=direct]{Umlaute und Sonderzeichen (2)}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item X hat eigenes Encoding: Compound Text
+        \item Früher ICCCM (Compound text, z.B. Atom WM\_NAME)\\
+        ICCCM = Inter-Client Communication Conventions Manual
+        \item heute EWMH (UTF-8, z.B. Atom \_NET\_WM\_NAME)\\
+        EWMH = Extended Window Manager Hints (= NetWM)
+        \item XImageText16 (bzw xcb\_image\_text\_16) erwartet UCS-2\\
+        $\Rightarrow$ \texttt{iconv\_open(UCS2\_BE, UTF-8)}
+\end{list}
+\isrc{i3/src/util.c:191ff, i3/src/handlers.c:663ff}
+\end{slide}
+
+
+\begin{slide}[method=direct]{Colorpixel}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Heutzutage: TrueColor. Früher: 8 bit o.ä.
+        \item Colormaps: Geben an welche Farben die Hardware kann
+        \item Colorpixel: Ein Wert aus der Colormap, der der gewünschten Farbe am nähesten kommt
+        \item Bei TrueColor: \texttt{return (red << 16) + (green << 8) + blue;}
+        \item Alles andere: Round-Trip zum X-Server:
+\end{list}
+\begin{code}
+        #define RGB_8_TO_16(i) (65535 * ((i) & 0xFF) / 255)
+        xcb_alloc_color_reply_t *reply;
+        reply = xcb_alloc_color_reply(conn, xcb_alloc_color(conn,
+                root_screen->default_colormap, RGB_8_TO_16(red),
+                RGB_8_TO_16(green), RGB_8_TO_16(blue)), NULL);
+        if (!reply)
+                die("Could not allocate color\n");
+        return reply->pixel;
+\end{code}
+\isrc{i3/src/xcb.c:76ff}
+\end{slide}
+
+\begin{slide}[method=direct]{Hints}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item NetWM
+        \begin{description}
+                \item[NET\_WM\_WINDOW\_TYPE] dock, dialog, utility, toolbar, splashscreen
+                \item[NET\_WM\_NAME] Fenstertitel (UTF-8), auch auf dem root-Fenster
+                \item[NET\_WM\_STRUT\_PARTIAL] Reservierter Bereich am Bildschirmrand (Docks), z.B. für dzen2
+        \end{description}
+        \item ICCCM
+        \begin{description}
+                \item[WM\_NAME] Fenstertitel (Compound Text)
+                \item[WM\_TRANSIENT\_FOR] Zugehöriges, "`temporäres"' Fenster für Anwendung X ($\Rightarrow$ floating)
+                \item[WM\_CLASS] Fensterklasse (z.B. "`urxvt"'), praktisch zum identifizieren
+                \item[WM\_NORMAL\_HINTS] (Size hints), beinhaltet Aspect Ratio (mplayer!), minimale und maximale Größe
+        \end{description}
+\end{list}
+\end{slide}
+
+\begin{slide}[method=direct]{Hints (2)}
+\begin{code}
+int handle_transient_for(void *data, xcb_connection_t *conn,
+           uint8_t state, xcb_window_t window,
+           xcb_atom_t name, xcb_get_property_reply_t *reply)
+{
+  xcb_window_t transient_for;
+  if (reply != NULL) {
+    if (!xcb_get_wm_transient_for_from_reply(&transient_for, reply)) {
+      LOG("Not transient for any window\n");
+      return 1;
+    }
+  } else {
+    if (!xcb_get_wm_transient_for_reply(conn,
+        xcb_get_wm_transient_for_unchecked(conn, window),
+        &transient_for, NULL)) {
+      LOG("Not transient for any window\n");
+      return 1;
+    }
+  }
+  if (client->floating == FLOATING_AUTO_OFF)
+    toggle_floating_mode(conn, client, true);
+  return 1;
+}
+\end{code}
+\end{slide}
+
+\begin{slide}[method=direct]{Gotchas}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Flushing (\texttt{xcb\_flush(connection);})
+        \item \texttt{WM\_STATE} != \texttt{WM\_STATE\_NORMAL}
+        \item Eventloops / Caching von xcb (GIMP splash screen)
+\end{list}
+\end{slide}
+
+
+\begin{slide}{Zusammenfassung}
+\begin{list}{$\bullet$}{\itemsep=.5em}
+        \item Bindings aufsetzen, Eventmask konfigurieren
+        \item Events/Hints abarbeiten
+        \item Decorations zeichnen
+\end{list}
+\end{slide}
+
+\begin{slide}{Lust bekommen?}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item git clone \url{git://code.stapelberg.de/i3}
+        \item development branch: \texttt{git checkout --track -b next origin/next}
+        \item Debian: \texttt{apt-get install i3-wm/unstable}
+        \item non-Debian: \texttt{cd i3; cat DEPENDS; make \&\& sudo make install}
+        \item in \~{}/.xsession: \texttt{exec /usr/bin/i3}
+        \item Siehe manpage \texttt{i3(1)}, user’s guide, how to hack
+\end{list}
+\end{slide}
+
+\begin{slide}{exit(0);}
+\begin{list}{$\bullet$}{\itemsep=1em}
+        \item git-webinterface: \url{http://code.stapelberg.de/git/i3}
+        \item Website: \url{http://i3.zekjur.net}
+        \item IRC: \#i3 auf irc.twice-irc.de
+        \item xcb: \url{http://xcb.freedesktop.org/}
+        \item 50-Zeilen-WM: \url{http://incise.org/tinywm.html}
+        \item „Why X is not our ideal window system”: \url{http://www.std.org/~msm/common/WhyX.pdf}
+        \item …noch Fragen?
+\end{list}
+\end{slide}
+
+\end{document}
diff --git a/docs/GPN-2009-06-27/reparenting.dia b/docs/GPN-2009-06-27/reparenting.dia
new file mode 100644 (file)
index 0000000..7a68515
Binary files /dev/null and b/docs/GPN-2009-06-27/reparenting.dia differ
diff --git a/docs/GPN-2009-06-27/reparenting.eps b/docs/GPN-2009-06-27/reparenting.eps
new file mode 100644 (file)
index 0000000..0e74d06
--- /dev/null
@@ -0,0 +1,1799 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/michael/GPN-2009-06-27/reparenting.dia
+%%Creator: Dia v0.96.1
+%%CreationDate: Sat Jun 20 18:53:49 2009
+%%For: michael
+%%Orientation: Portrait
+%%Magnification: 1.0000
+%%BoundingBox: 0 0 793 295
+%%BeginSetup
+%%EndSetup
+%%EndComments
+%%BeginProlog
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+   /endangle exch def
+   /startangle exch def
+   /yrad exch def
+   /xrad exch def
+   /y exch def
+   /x exch def   /savematrix mtrx currentmatrix def
+   x y tr xrad yrad sc
+   0 0 1 startangle endangle arc
+   savematrix setmatrix
+   end
+} def
+
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/dpi_x 300 def
+/dpi_y 300 def
+/conicto {
+    /to_y exch def
+    /to_x exch def
+    /conic_cntrl_y exch def
+    /conic_cntrl_x exch def
+    currentpoint
+    /p0_y exch def
+    /p0_x exch def
+    /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def
+    /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def
+    /p2_x p1_x to_x p0_x sub 1 3 div mul add def
+    /p2_y p1_y to_y p0_y sub 1 3 div mul add def
+    p1_x p1_y p2_x p2_y to_x to_y curveto
+} bind def
+/start_ol { gsave 1.1 dpi_x div dup scale} bind def
+/end_ol { closepath fill grestore } bind def
+28.346000 -28.346000 scale
+-15.600000 -20.279125 translate
+%%EndProlog
+
+
+0.100000 slw
+[0.200000] 0 sd
+[0.200000] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 16.850000 12.250000 m 16.850000 18.000000 l 26.050000 18.000000 l 26.050000 12.250000 l f
+n 16.850000 12.250000 m 16.850000 12.250000 0.000000 0.000000 180.000000 270.000000 ellipse f
+n 26.050000 12.250000 m 26.050000 12.250000 0.000000 0.000000 270.000000 360.000000 ellipse f
+n 16.850000 12.250000 m 16.850000 18.000000 l 26.050000 18.000000 l 26.050000 12.250000 l f
+n 16.850000 18.000000 m 16.850000 18.000000 0.000000 0.000000 90.000000 180.000000 ellipse f
+n 26.050000 18.000000 m 26.050000 18.000000 0.000000 0.000000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 16.850000 12.250000 m 26.050000 12.250000 l s
+n 16.850000 18.000000 m 26.050000 18.000000 l s
+n 16.850000 12.250000 0.000000 0.000000 180.000000 270.000000 ellipse s
+n 26.050000 12.250000 0.000000 0.000000 270.000000 360.000000 ellipse s
+n 16.850000 12.250000 m 16.850000 18.000000 l s
+n 26.050000 12.250000 m 26.050000 18.000000 l s
+n 16.850000 18.000000 0.000000 0.000000 90.000000 180.000000 ellipse s
+n 26.050000 18.000000 0.000000 0.000000 0.000000 90.000000 ellipse s
+gsave 18.550000 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+640 4800 moveto
+1524 4800 lineto
+3648 784 lineto
+3648 4800 lineto
+4288 4800 lineto
+4288 0 lineto
+3404 0 lineto
+1280 4016 lineto
+1280 0 lineto
+640 0 lineto
+640 4800 lineto
+end_ol grestore 
+gsave 19.204381 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 19.741377 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+576 1433 moveto
+576 3584 lineto
+1152 3584 lineto
+1152 1455 lineto
+1152 952 1354 700 conicto
+1556 448 1960 448 conicto
+2445 448 2726 749 conicto
+3008 1050 3008 1569 conicto
+3008 3584 lineto
+3584 3584 lineto
+3584 0 lineto
+3008 0 lineto
+3008 576 lineto
+2792 251 2506 93 conicto
+2221 -64 1844 -64 conicto
+1221 -64 898 317 conicto
+576 699 576 1433 conicto
+end_ol grestore 
+gsave 20.295853 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 20.832850 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+gsave 21.287421 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+end_ol grestore 
+gsave 21.564654 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+640 4800 moveto
+3392 4800 lineto
+3392 4288 lineto
+1280 4288 lineto
+1280 2816 lineto
+3200 2816 lineto
+3200 2304 lineto
+1280 2304 lineto
+1280 0 lineto
+640 0 lineto
+640 4800 lineto
+end_ol grestore 
+gsave 22.019225 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 22.556222 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+3584 2195 moveto
+3584 0 lineto
+3008 0 lineto
+3008 2176 lineto
+3008 2690 2806 2945 conicto
+2604 3200 2199 3200 conicto
+1713 3200 1432 2893 conicto
+1152 2586 1152 2056 conicto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+1152 3584 lineto
+1152 3072 lineto
+1365 3394 1654 3553 conicto
+1943 3712 2321 3712 conicto
+2945 3712 3264 3327 conicto
+3584 2942 3584 2195 conicto
+end_ol grestore 
+gsave 23.110697 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+gsave 23.565268 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+1152 4608 moveto
+1152 3584 lineto
+2368 3584 lineto
+2368 3136 lineto
+1152 3136 lineto
+1152 1197 lineto
+1152 761 1272 636 conicto
+1393 512 1762 512 conicto
+2368 512 lineto
+2368 0 lineto
+1762 0 lineto
+1088 0 832 258 conicto
+576 516 576 1197 conicto
+576 3136 lineto
+128 3136 lineto
+128 3584 lineto
+576 3584 lineto
+576 4608 lineto
+1152 4608 lineto
+end_ol grestore 
+gsave 23.907440 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 24.444437 15.375000 translate 0.035278 -0.035278 scale
+start_ol
+2688 3008 moveto
+2587 3107 2468 3153 conicto
+2349 3200 2205 3200 conicto
+1697 3200 1424 2868 conicto
+1152 2537 1152 1916 conicto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+1152 3584 lineto
+1152 3072 lineto
+1341 3397 1644 3554 conicto
+1948 3712 2381 3712 conicto
+2443 3712 2518 3696 conicto
+2593 3680 2685 3648 conicto
+2688 3008 lineto
+end_ol grestore 
+gsave 15.600000 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+1344 3328 moveto
+1084 2828 958 2338 conicto
+832 1849 832 1346 conicto
+832 844 959 351 conicto
+1086 -142 1344 -640 conicto
+1034 -640 lineto
+708 -129 546 365 conicto
+384 859 384 1346 conicto
+384 1831 545 2323 conicto
+706 2815 1034 3328 conicto
+1344 3328 lineto
+end_ol grestore 
+gsave 15.827285 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+833 320 moveto
+2385 320 lineto
+2385 0 lineto
+320 0 lineto
+320 320 lineto
+570 585 1001 1030 conicto
+1432 1476 1542 1605 conicto
+1753 1848 1836 2015 conicto
+1920 2183 1920 2346 conicto
+1920 2610 1736 2777 conicto
+1552 2944 1258 2944 conicto
+1048 2944 816 2864 conicto
+584 2785 320 2624 conicto
+320 3072 lineto
+589 3167 822 3215 conicto
+1056 3264 1249 3264 conicto
+1760 3264 2064 3011 conicto
+2368 2758 2368 2335 conicto
+2368 2134 2292 1954 conicto
+2216 1775 2016 1530 conicto
+1961 1467 1665 1165 conicto
+1370 863 833 320 conicto
+end_ol grestore 
+gsave 16.196933 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 16.566581 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+512 576 moveto
+960 576 lineto
+960 196 lineto
+576 -512 lineto
+320 -512 lineto
+512 196 lineto
+512 576 lineto
+end_ol grestore 
+gsave 16.751401 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+end_ol grestore 
+gsave 16.936220 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+833 320 moveto
+2385 320 lineto
+2385 0 lineto
+320 0 lineto
+320 320 lineto
+570 585 1001 1030 conicto
+1432 1476 1542 1605 conicto
+1753 1848 1836 2015 conicto
+1920 2183 1920 2346 conicto
+1920 2610 1736 2777 conicto
+1552 2944 1258 2944 conicto
+1048 2944 816 2864 conicto
+584 2785 320 2624 conicto
+320 3072 lineto
+589 3167 822 3215 conicto
+1056 3264 1249 3264 conicto
+1760 3264 2064 3011 conicto
+2368 2758 2368 2335 conicto
+2368 2134 2292 1954 conicto
+2216 1775 2016 1530 conicto
+1961 1467 1665 1165 conicto
+1370 863 833 320 conicto
+end_ol grestore 
+gsave 17.305868 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 17.675516 11.550000 translate 0.035278 -0.035278 scale
+start_ol
+384 3328 moveto
+694 3328 lineto
+1020 2815 1182 2323 conicto
+1344 1831 1344 1346 conicto
+1344 859 1182 365 conicto
+1020 -129 694 -640 conicto
+384 -640 lineto
+642 -142 769 351 conicto
+896 844 896 1346 conicto
+896 1849 769 2338 conicto
+642 2828 384 3328 conicto
+end_ol grestore 
+gsave 20.350000 19.000000 translate 0.035278 -0.035278 scale
+start_ol
+833 320 moveto
+2385 320 lineto
+2385 0 lineto
+320 0 lineto
+320 320 lineto
+570 585 1001 1030 conicto
+1432 1476 1542 1605 conicto
+1753 1848 1836 2015 conicto
+1920 2183 1920 2346 conicto
+1920 2610 1736 2777 conicto
+1552 2944 1258 2944 conicto
+1048 2944 816 2864 conicto
+584 2785 320 2624 conicto
+320 3072 lineto
+589 3167 822 3215 conicto
+1056 3264 1249 3264 conicto
+1760 3264 2064 3011 conicto
+2368 2758 2368 2335 conicto
+2368 2134 2292 1954 conicto
+2216 1775 2016 1530 conicto
+1961 1467 1665 1165 conicto
+1370 863 833 320 conicto
+end_ol grestore 
+gsave 20.719648 19.000000 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 21.089295 19.000000 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 21.458943 19.000000 translate 0.035278 -0.035278 scale
+start_ol
+768 384 moveto
+768 -896 lineto
+384 -896 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+895 2275 1089 2385 conicto
+1283 2496 1553 2496 conicto
+2001 2496 2280 2143 conicto
+2560 1791 2560 1216 conicto
+2560 641 2280 288 conicto
+2001 -64 1553 -64 conicto
+1283 -64 1089 46 conicto
+895 157 768 384 conicto
+2112 1216 moveto
+2112 1665 1932 1920 conicto
+1753 2176 1440 2176 conicto
+1127 2176 947 1920 conicto
+768 1665 768 1216 conicto
+768 767 947 511 conicto
+1127 256 1440 256 conicto
+1753 256 1932 511 conicto
+2112 767 2112 1216 conicto
+end_ol grestore 
+gsave 21.828591 19.000000 translate 0.035278 -0.035278 scale
+start_ol
+2432 2432 moveto
+1550 1249 lineto
+2496 0 lineto
+2016 0 lineto
+1295 955 lineto
+594 0 lineto
+128 0 lineto
+1059 1272 lineto
+192 2432 lineto
+665 2432 lineto
+1312 1566 lineto
+1959 2432 lineto
+2432 2432 lineto
+end_ol grestore 
+gsave 26.500000 15.850000 translate 0.035278 -0.035278 scale
+start_ol
+576 320 moveto
+1280 320 lineto
+1280 2880 lineto
+512 2752 lineto
+512 3072 lineto
+1289 3200 lineto
+1728 3200 lineto
+1728 320 lineto
+2432 320 lineto
+2432 0 lineto
+576 0 lineto
+576 320 lineto
+end_ol grestore 
+gsave 26.869648 15.850000 translate 0.035278 -0.035278 scale
+start_ol
+448 3200 moveto
+2176 3200 lineto
+2176 2880 lineto
+896 2880 lineto
+896 2056 lineto
+990 2084 1084 2098 conicto
+1178 2112 1273 2112 conicto
+1807 2112 2119 1818 conicto
+2432 1525 2432 1024 conicto
+2432 508 2104 222 conicto
+1776 -64 1179 -64 conicto
+974 -64 760 -32 conicto
+547 0 320 64 conicto
+320 512 lineto
+516 383 725 319 conicto
+934 256 1167 256 conicto
+1544 256 1764 463 conicto
+1984 670 1984 1024 conicto
+1984 1378 1762 1585 conicto
+1541 1792 1162 1792 conicto
+985 1792 808 1745 conicto
+632 1699 448 1600 conicto
+448 3200 lineto
+end_ol grestore 
+gsave 27.239295 15.850000 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 27.608943 15.850000 translate 0.035278 -0.035278 scale
+start_ol
+768 384 moveto
+768 -896 lineto
+384 -896 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+895 2275 1089 2385 conicto
+1283 2496 1553 2496 conicto
+2001 2496 2280 2143 conicto
+2560 1791 2560 1216 conicto
+2560 641 2280 288 conicto
+2001 -64 1553 -64 conicto
+1283 -64 1089 46 conicto
+895 157 768 384 conicto
+2112 1216 moveto
+2112 1665 1932 1920 conicto
+1753 2176 1440 2176 conicto
+1127 2176 947 1920 conicto
+768 1665 768 1216 conicto
+768 767 947 511 conicto
+1127 256 1440 256 conicto
+1753 256 1932 511 conicto
+2112 767 2112 1216 conicto
+end_ol grestore 
+gsave 27.978591 15.850000 translate 0.035278 -0.035278 scale
+start_ol
+2432 2432 moveto
+1550 1249 lineto
+2496 0 lineto
+2016 0 lineto
+1295 955 lineto
+594 0 lineto
+128 0 lineto
+1059 1272 lineto
+192 2432 lineto
+665 2432 lineto
+1312 1566 lineto
+1959 2432 lineto
+2432 2432 lineto
+end_ol grestore 
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.678431 0.847059 0.901961 srgb
+n 30.955000 11.147500 m 30.955000 18.450000 l 41.200000 18.450000 l 41.200000 11.147500 l f
+n 30.955000 11.147500 m 30.955000 11.147500 0.000000 0.000000 180.000000 270.000000 ellipse f
+n 41.200000 11.147500 m 41.200000 11.147500 0.000000 0.000000 270.000000 360.000000 ellipse f
+n 30.955000 11.147500 m 30.955000 18.450000 l 41.200000 18.450000 l 41.200000 11.147500 l f
+n 30.955000 18.450000 m 30.955000 18.450000 0.000000 0.000000 90.000000 180.000000 ellipse f
+n 41.200000 18.450000 m 41.200000 18.450000 0.000000 0.000000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 30.955000 11.147500 m 41.200000 11.147500 l s
+n 30.955000 18.450000 m 41.200000 18.450000 l s
+n 30.955000 11.147500 0.000000 0.000000 180.000000 270.000000 ellipse s
+n 41.200000 11.147500 0.000000 0.000000 270.000000 360.000000 ellipse s
+n 30.955000 11.147500 m 30.955000 18.450000 l s
+n 41.200000 11.147500 m 41.200000 18.450000 l s
+n 30.955000 18.450000 0.000000 0.000000 90.000000 180.000000 ellipse s
+n 41.200000 18.450000 0.000000 0.000000 0.000000 90.000000 ellipse s
+gsave 29.705000 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+1344 3328 moveto
+1084 2828 958 2338 conicto
+832 1849 832 1346 conicto
+832 844 959 351 conicto
+1086 -142 1344 -640 conicto
+1034 -640 lineto
+708 -129 546 365 conicto
+384 859 384 1346 conicto
+384 1831 545 2323 conicto
+706 2815 1034 3328 conicto
+1344 3328 lineto
+end_ol grestore 
+gsave 29.932285 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+833 320 moveto
+2385 320 lineto
+2385 0 lineto
+320 0 lineto
+320 320 lineto
+570 585 1001 1030 conicto
+1432 1476 1542 1605 conicto
+1753 1848 1836 2015 conicto
+1920 2183 1920 2346 conicto
+1920 2610 1736 2777 conicto
+1552 2944 1258 2944 conicto
+1048 2944 816 2864 conicto
+584 2785 320 2624 conicto
+320 3072 lineto
+589 3167 822 3215 conicto
+1056 3264 1249 3264 conicto
+1760 3264 2064 3011 conicto
+2368 2758 2368 2335 conicto
+2368 2134 2292 1954 conicto
+2216 1775 2016 1530 conicto
+1961 1467 1665 1165 conicto
+1370 863 833 320 conicto
+end_ol grestore 
+gsave 30.301933 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 30.671581 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+512 576 moveto
+960 576 lineto
+960 196 lineto
+576 -512 lineto
+320 -512 lineto
+512 196 lineto
+512 576 lineto
+end_ol grestore 
+gsave 30.856401 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+end_ol grestore 
+gsave 31.041220 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+833 320 moveto
+2385 320 lineto
+2385 0 lineto
+320 0 lineto
+320 320 lineto
+570 585 1001 1030 conicto
+1432 1476 1542 1605 conicto
+1753 1848 1836 2015 conicto
+1920 2183 1920 2346 conicto
+1920 2610 1736 2777 conicto
+1552 2944 1258 2944 conicto
+1048 2944 816 2864 conicto
+584 2785 320 2624 conicto
+320 3072 lineto
+589 3167 822 3215 conicto
+1056 3264 1249 3264 conicto
+1760 3264 2064 3011 conicto
+2368 2758 2368 2335 conicto
+2368 2134 2292 1954 conicto
+2216 1775 2016 1530 conicto
+1961 1467 1665 1165 conicto
+1370 863 833 320 conicto
+end_ol grestore 
+gsave 31.410868 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 31.780516 10.447500 translate 0.035278 -0.035278 scale
+start_ol
+384 3328 moveto
+694 3328 lineto
+1020 2815 1182 2323 conicto
+1344 1831 1344 1346 conicto
+1344 859 1182 365 conicto
+1020 -129 694 -640 conicto
+384 -640 lineto
+642 -142 769 351 conicto
+896 844 896 1346 conicto
+896 1849 769 2338 conicto
+642 2828 384 3328 conicto
+end_ol grestore 
+gsave 34.505000 19.847500 translate 0.035278 -0.035278 scale
+start_ol
+833 320 moveto
+2385 320 lineto
+2385 0 lineto
+320 0 lineto
+320 320 lineto
+570 585 1001 1030 conicto
+1432 1476 1542 1605 conicto
+1753 1848 1836 2015 conicto
+1920 2183 1920 2346 conicto
+1920 2610 1736 2777 conicto
+1552 2944 1258 2944 conicto
+1048 2944 816 2864 conicto
+584 2785 320 2624 conicto
+320 3072 lineto
+589 3167 822 3215 conicto
+1056 3264 1249 3264 conicto
+1760 3264 2064 3011 conicto
+2368 2758 2368 2335 conicto
+2368 2134 2292 1954 conicto
+2216 1775 2016 1530 conicto
+1961 1467 1665 1165 conicto
+1370 863 833 320 conicto
+end_ol grestore 
+gsave 34.874648 19.847500 translate 0.035278 -0.035278 scale
+start_ol
+576 320 moveto
+1280 320 lineto
+1280 2880 lineto
+512 2752 lineto
+512 3072 lineto
+1289 3200 lineto
+1728 3200 lineto
+1728 320 lineto
+2432 320 lineto
+2432 0 lineto
+576 0 lineto
+576 320 lineto
+end_ol grestore 
+gsave 35.244295 19.847500 translate 0.035278 -0.035278 scale
+start_ol
+448 3200 moveto
+2176 3200 lineto
+2176 2880 lineto
+896 2880 lineto
+896 2056 lineto
+990 2084 1084 2098 conicto
+1178 2112 1273 2112 conicto
+1807 2112 2119 1818 conicto
+2432 1525 2432 1024 conicto
+2432 508 2104 222 conicto
+1776 -64 1179 -64 conicto
+974 -64 760 -32 conicto
+547 0 320 64 conicto
+320 512 lineto
+516 383 725 319 conicto
+934 256 1167 256 conicto
+1544 256 1764 463 conicto
+1984 670 1984 1024 conicto
+1984 1378 1762 1585 conicto
+1541 1792 1162 1792 conicto
+985 1792 808 1745 conicto
+632 1699 448 1600 conicto
+448 3200 lineto
+end_ol grestore 
+gsave 35.613943 19.847500 translate 0.035278 -0.035278 scale
+start_ol
+768 384 moveto
+768 -896 lineto
+384 -896 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+895 2275 1089 2385 conicto
+1283 2496 1553 2496 conicto
+2001 2496 2280 2143 conicto
+2560 1791 2560 1216 conicto
+2560 641 2280 288 conicto
+2001 -64 1553 -64 conicto
+1283 -64 1089 46 conicto
+895 157 768 384 conicto
+2112 1216 moveto
+2112 1665 1932 1920 conicto
+1753 2176 1440 2176 conicto
+1127 2176 947 1920 conicto
+768 1665 768 1216 conicto
+768 767 947 511 conicto
+1127 256 1440 256 conicto
+1753 256 1932 511 conicto
+2112 767 2112 1216 conicto
+end_ol grestore 
+gsave 35.983591 19.847500 translate 0.035278 -0.035278 scale
+start_ol
+2432 2432 moveto
+1550 1249 lineto
+2496 0 lineto
+2016 0 lineto
+1295 955 lineto
+594 0 lineto
+128 0 lineto
+1059 1272 lineto
+192 2432 lineto
+665 2432 lineto
+1312 1566 lineto
+1959 2432 lineto
+2432 2432 lineto
+end_ol grestore 
+gsave 41.705000 15.497500 translate 0.035278 -0.035278 scale
+start_ol
+576 320 moveto
+1280 320 lineto
+1280 2880 lineto
+512 2752 lineto
+512 3072 lineto
+1289 3200 lineto
+1728 3200 lineto
+1728 320 lineto
+2432 320 lineto
+2432 0 lineto
+576 0 lineto
+576 320 lineto
+end_ol grestore 
+gsave 42.074648 15.497500 translate 0.035278 -0.035278 scale
+start_ol
+1472 1856 moveto
+1177 1856 1004 1642 conicto
+832 1428 832 1056 conicto
+832 686 1004 471 conicto
+1177 256 1472 256 conicto
+1767 256 1939 471 conicto
+2112 686 2112 1056 conicto
+2112 1428 1939 1642 conicto
+1767 1856 1472 1856 conicto
+2368 3136 moveto
+2368 2752 lineto
+2202 2845 2033 2894 conicto
+1864 2944 1698 2944 conicto
+1261 2944 1031 2662 conicto
+801 2380 768 1810 conicto
+895 1987 1087 2081 conicto
+1280 2176 1511 2176 conicto
+1996 2176 2278 1875 conicto
+2560 1574 2560 1056 conicto
+2560 549 2264 242 conicto
+1969 -64 1478 -64 conicto
+915 -64 617 362 conicto
+320 789 320 1599 conicto
+320 2359 688 2811 conicto
+1057 3264 1677 3264 conicto
+1844 3264 2014 3232 conicto
+2184 3200 2368 3136 conicto
+end_ol grestore 
+gsave 42.444295 15.497500 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 42.813943 15.497500 translate 0.035278 -0.035278 scale
+start_ol
+768 384 moveto
+768 -896 lineto
+384 -896 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+895 2275 1089 2385 conicto
+1283 2496 1553 2496 conicto
+2001 2496 2280 2143 conicto
+2560 1791 2560 1216 conicto
+2560 641 2280 288 conicto
+2001 -64 1553 -64 conicto
+1283 -64 1089 46 conicto
+895 157 768 384 conicto
+2112 1216 moveto
+2112 1665 1932 1920 conicto
+1753 2176 1440 2176 conicto
+1127 2176 947 1920 conicto
+768 1665 768 1216 conicto
+768 767 947 511 conicto
+1127 256 1440 256 conicto
+1753 256 1932 511 conicto
+2112 767 2112 1216 conicto
+end_ol grestore 
+gsave 43.183591 15.497500 translate 0.035278 -0.035278 scale
+start_ol
+2432 2432 moveto
+1550 1249 lineto
+2496 0 lineto
+2016 0 lineto
+1295 955 lineto
+594 0 lineto
+128 0 lineto
+1059 1272 lineto
+192 2432 lineto
+665 2432 lineto
+1312 1566 lineto
+1959 2432 lineto
+2432 2432 lineto
+end_ol grestore 
+0.100000 slw
+[0.200000] 0 sd
+[0.200000] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 31.450000 12.300000 m 31.450000 17.900000 l 40.700000 17.900000 l 40.700000 12.300000 l f
+n 31.450000 12.300000 m 31.450000 12.300000 0.000000 0.000000 180.000000 270.000000 ellipse f
+n 40.700000 12.300000 m 40.700000 12.300000 0.000000 0.000000 270.000000 360.000000 ellipse f
+n 31.450000 12.300000 m 31.450000 17.900000 l 40.700000 17.900000 l 40.700000 12.300000 l f
+n 31.450000 17.900000 m 31.450000 17.900000 0.000000 0.000000 90.000000 180.000000 ellipse f
+n 40.700000 17.900000 m 40.700000 17.900000 0.000000 0.000000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 31.450000 12.300000 m 40.700000 12.300000 l s
+n 31.450000 17.900000 m 40.700000 17.900000 l s
+n 31.450000 12.300000 0.000000 0.000000 180.000000 270.000000 ellipse s
+n 40.700000 12.300000 0.000000 0.000000 270.000000 360.000000 ellipse s
+n 31.450000 12.300000 m 31.450000 17.900000 l s
+n 40.700000 12.300000 m 40.700000 17.900000 l s
+n 31.450000 17.900000 0.000000 0.000000 90.000000 180.000000 ellipse s
+n 40.700000 17.900000 0.000000 0.000000 0.000000 90.000000 ellipse s
+gsave 32.355000 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+640 4800 moveto
+1524 4800 lineto
+3648 784 lineto
+3648 4800 lineto
+4288 4800 lineto
+4288 0 lineto
+3404 0 lineto
+1280 4016 lineto
+1280 0 lineto
+640 0 lineto
+640 4800 lineto
+end_ol grestore 
+gsave 33.009381 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 33.546377 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+576 1433 moveto
+576 3584 lineto
+1152 3584 lineto
+1152 1455 lineto
+1152 952 1354 700 conicto
+1556 448 1960 448 conicto
+2445 448 2726 749 conicto
+3008 1050 3008 1569 conicto
+3008 3584 lineto
+3584 3584 lineto
+3584 0 lineto
+3008 0 lineto
+3008 576 lineto
+2792 251 2506 93 conicto
+2221 -64 1844 -64 conicto
+1221 -64 898 317 conicto
+576 699 576 1433 conicto
+end_ol grestore 
+gsave 34.100853 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 34.637850 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+gsave 35.092421 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+end_ol grestore 
+gsave 35.369654 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+640 4800 moveto
+3392 4800 lineto
+3392 4288 lineto
+1280 4288 lineto
+1280 2816 lineto
+3200 2816 lineto
+3200 2304 lineto
+1280 2304 lineto
+1280 0 lineto
+640 0 lineto
+640 4800 lineto
+end_ol grestore 
+gsave 35.824225 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 36.361222 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+3584 2195 moveto
+3584 0 lineto
+3008 0 lineto
+3008 2176 lineto
+3008 2690 2806 2945 conicto
+2604 3200 2199 3200 conicto
+1713 3200 1432 2893 conicto
+1152 2586 1152 2056 conicto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+1152 3584 lineto
+1152 3072 lineto
+1365 3394 1654 3553 conicto
+1943 3712 2321 3712 conicto
+2945 3712 3264 3327 conicto
+3584 2942 3584 2195 conicto
+end_ol grestore 
+gsave 36.915697 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+gsave 37.370268 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+1152 4608 moveto
+1152 3584 lineto
+2368 3584 lineto
+2368 3136 lineto
+1152 3136 lineto
+1152 1197 lineto
+1152 761 1272 636 conicto
+1393 512 1762 512 conicto
+2368 512 lineto
+2368 0 lineto
+1762 0 lineto
+1088 0 832 258 conicto
+576 516 576 1197 conicto
+576 3136 lineto
+128 3136 lineto
+128 3584 lineto
+576 3584 lineto
+576 4608 lineto
+1152 4608 lineto
+end_ol grestore 
+gsave 37.712440 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 38.249437 14.722500 translate 0.035278 -0.035278 scale
+start_ol
+2688 3008 moveto
+2587 3107 2468 3153 conicto
+2349 3200 2205 3200 conicto
+1697 3200 1424 2868 conicto
+1152 2537 1152 1916 conicto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+1152 3584 lineto
+1152 3072 lineto
+1341 3397 1644 3554 conicto
+1948 3712 2381 3712 conicto
+2443 3712 2518 3696 conicto
+2593 3680 2685 3648 conicto
+2688 3008 lineto
+end_ol grestore 
+gsave 31.305000 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+1344 3328 moveto
+1084 2828 958 2338 conicto
+832 1849 832 1346 conicto
+832 844 959 351 conicto
+1086 -142 1344 -640 conicto
+1034 -640 lineto
+708 -129 546 365 conicto
+384 859 384 1346 conicto
+384 1831 545 2323 conicto
+706 2815 1034 3328 conicto
+1344 3328 lineto
+end_ol grestore 
+gsave 31.532285 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+448 3200 moveto
+2176 3200 lineto
+2176 2880 lineto
+896 2880 lineto
+896 2056 lineto
+990 2084 1084 2098 conicto
+1178 2112 1273 2112 conicto
+1807 2112 2119 1818 conicto
+2432 1525 2432 1024 conicto
+2432 508 2104 222 conicto
+1776 -64 1179 -64 conicto
+974 -64 760 -32 conicto
+547 0 320 64 conicto
+320 512 lineto
+516 383 725 319 conicto
+934 256 1167 256 conicto
+1544 256 1764 463 conicto
+1984 670 1984 1024 conicto
+1984 1378 1762 1585 conicto
+1541 1792 1162 1792 conicto
+985 1792 808 1745 conicto
+632 1699 448 1600 conicto
+448 3200 lineto
+end_ol grestore 
+gsave 31.901933 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+512 576 moveto
+960 576 lineto
+960 196 lineto
+576 -512 lineto
+320 -512 lineto
+512 196 lineto
+512 576 lineto
+end_ol grestore 
+gsave 32.086753 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+end_ol grestore 
+gsave 32.271573 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+576 320 moveto
+1280 320 lineto
+1280 2880 lineto
+512 2752 lineto
+512 3072 lineto
+1289 3200 lineto
+1728 3200 lineto
+1728 320 lineto
+2432 320 lineto
+2432 0 lineto
+576 0 lineto
+576 320 lineto
+end_ol grestore 
+gsave 32.641220 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+1439 2944 moveto
+1105 2944 936 2608 conicto
+768 2273 768 1599 conicto
+768 927 936 591 conicto
+1105 256 1439 256 conicto
+1775 256 1943 591 conicto
+2112 927 2112 1599 conicto
+2112 2273 1943 2608 conicto
+1775 2944 1439 2944 conicto
+1440 3264 moveto
+1985 3264 2272 2837 conicto
+2560 2411 2560 1599 conicto
+2560 789 2272 362 conicto
+1985 -64 1440 -64 conicto
+895 -64 607 362 conicto
+320 789 320 1599 conicto
+320 2411 607 2837 conicto
+895 3264 1440 3264 conicto
+end_ol grestore 
+gsave 33.010868 12.072500 translate 0.035278 -0.035278 scale
+start_ol
+384 3328 moveto
+694 3328 lineto
+1020 2815 1182 2323 conicto
+1344 1831 1344 1346 conicto
+1344 859 1182 365 conicto
+1020 -129 694 -640 conicto
+384 -640 lineto
+642 -142 769 351 conicto
+896 844 896 1346 conicto
+896 1849 769 2338 conicto
+642 2828 384 3328 conicto
+end_ol grestore 
+gsave 33.650000 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+896 2816 moveto
+896 384 lineto
+1417 384 lineto
+2076 384 2382 677 conicto
+2688 971 2688 1603 conicto
+2688 2232 2382 2524 conicto
+2076 2816 1417 2816 conicto
+896 2816 lineto
+448 3200 moveto
+1350 3200 lineto
+2273 3200 2704 2813 conicto
+3136 2426 3136 1603 conicto
+3136 776 2702 388 conicto
+2269 0 1350 0 conicto
+448 0 lineto
+448 3200 lineto
+end_ol grestore 
+gsave 34.097080 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+2496 1352 moveto
+2496 1152 lineto
+704 1152 lineto
+730 714 950 485 conicto
+1171 256 1565 256 conicto
+1793 256 2007 320 conicto
+2221 384 2432 512 conicto
+2432 128 lineto
+2215 34 1988 -15 conicto
+1761 -64 1527 -64 conicto
+941 -64 598 275 conicto
+256 615 256 1194 conicto
+256 1793 576 2144 conicto
+897 2496 1441 2496 conicto
+1928 2496 2212 2188 conicto
+2496 1881 2496 1352 conicto
+2112 1472 moveto
+2108 1793 1932 1984 conicto
+1757 2176 1468 2176 conicto
+1140 2176 943 1991 conicto
+747 1806 717 1470 conicto
+2112 1472 lineto
+end_ol grestore 
+gsave 34.454242 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+2176 2368 moveto
+2176 1984 lineto
+2010 2080 1843 2128 conicto
+1676 2176 1506 2176 conicto
+1125 2176 914 1924 conicto
+704 1672 704 1216 conicto
+704 760 914 508 conicto
+1125 256 1506 256 conicto
+1676 256 1843 304 conicto
+2010 352 2176 448 conicto
+2176 64 lineto
+2009 0 1830 -32 conicto
+1652 -64 1450 -64 conicto
+902 -64 579 282 conicto
+256 628 256 1216 conicto
+256 1812 582 2154 conicto
+908 2496 1476 2496 conicto
+1660 2496 1835 2464 conicto
+2011 2432 2176 2368 conicto
+end_ol grestore 
+gsave 34.773942 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+1377 2176 moveto
+1066 2176 885 1919 conicto
+704 1663 704 1216 conicto
+704 769 884 512 conicto
+1064 256 1377 256 conicto
+1686 256 1867 514 conicto
+2048 772 2048 1216 conicto
+2048 1658 1867 1917 conicto
+1686 2176 1377 2176 conicto
+1376 2496 moveto
+1899 2496 2197 2156 conicto
+2496 1817 2496 1216 conicto
+2496 617 2197 276 conicto
+1899 -64 1376 -64 conicto
+851 -64 553 276 conicto
+256 617 256 1216 conicto
+256 1817 553 2156 conicto
+851 2496 1376 2496 conicto
+end_ol grestore 
+gsave 35.131104 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+1792 2112 moveto
+1725 2145 1645 2160 conicto
+1566 2176 1470 2176 conicto
+1131 2176 949 1944 conicto
+768 1712 768 1277 conicto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+894 2275 1096 2385 conicto
+1298 2496 1588 2496 conicto
+1629 2496 1679 2496 conicto
+1729 2496 1790 2496 conicto
+1792 2112 lineto
+end_ol grestore 
+gsave 35.370875 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+1515 1216 moveto
+1021 1216 830 1104 conicto
+640 992 640 723 conicto
+640 508 783 382 conicto
+926 256 1171 256 conicto
+1510 256 1715 494 conicto
+1920 733 1920 1129 conicto
+1920 1216 lineto
+1515 1216 lineto
+2304 1385 moveto
+2304 0 lineto
+1920 0 lineto
+1920 384 lineto
+1782 154 1577 45 conicto
+1372 -64 1075 -64 conicto
+699 -64 477 146 conicto
+256 356 256 708 conicto
+256 1119 530 1327 conicto
+805 1536 1349 1536 conicto
+1920 1536 lineto
+1920 1578 lineto
+1920 1864 1739 2020 conicto
+1558 2176 1232 2176 conicto
+1024 2176 827 2128 conicto
+630 2080 448 1984 conicto
+448 2368 lineto
+665 2432 869 2464 conicto
+1073 2496 1266 2496 conicto
+1788 2496 2046 2220 conicto
+2304 1945 2304 1385 conicto
+end_ol grestore 
+gsave 35.728038 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+768 3136 moveto
+768 2432 lineto
+1600 2432 lineto
+1600 2112 lineto
+768 2112 lineto
+768 788 lineto
+768 490 850 405 conicto
+933 320 1185 320 conicto
+1600 320 lineto
+1600 0 lineto
+1185 0 lineto
+730 0 557 170 conicto
+384 340 384 788 conicto
+384 2112 lineto
+64 2112 lineto
+64 2432 lineto
+384 2432 lineto
+384 3136 lineto
+768 3136 lineto
+end_ol grestore 
+gsave 35.955323 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+384 2432 moveto
+768 2432 lineto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+384 3328 moveto
+768 3328 lineto
+768 2816 lineto
+384 2816 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 36.117670 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+1377 2176 moveto
+1066 2176 885 1919 conicto
+704 1663 704 1216 conicto
+704 769 884 512 conicto
+1064 256 1377 256 conicto
+1686 256 1867 514 conicto
+2048 772 2048 1216 conicto
+2048 1658 1867 1917 conicto
+1686 2176 1377 2176 conicto
+1376 2496 moveto
+1899 2496 2197 2156 conicto
+2496 1817 2496 1216 conicto
+2496 617 2197 276 conicto
+1899 -64 1376 -64 conicto
+851 -64 553 276 conicto
+256 617 256 1216 conicto
+256 1817 553 2156 conicto
+851 2496 1376 2496 conicto
+end_ol grestore 
+gsave 36.474832 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+2432 1463 moveto
+2432 0 lineto
+2048 0 lineto
+2048 1450 lineto
+2048 1814 1908 1995 conicto
+1769 2176 1490 2176 conicto
+1155 2176 961 1959 conicto
+768 1743 768 1370 conicto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+914 2273 1111 2384 conicto
+1309 2496 1568 2496 conicto
+1994 2496 2213 2234 conicto
+2432 1972 2432 1463 conicto
+end_ol grestore 
+gsave 36.844480 10.600000 translate 0.035278 -0.035278 scale
+start_ol
+1984 2368 moveto
+1984 1984 lineto
+1812 2080 1627 2128 conicto
+1442 2176 1244 2176 conicto
+942 2176 791 2083 conicto
+640 1990 640 1804 conicto
+640 1662 750 1581 conicto
+861 1500 1196 1427 conicto
+1339 1397 lineto
+1759 1305 1935 1138 conicto
+2112 972 2112 673 conicto
+2112 333 1844 134 conicto
+1576 -64 1108 -64 conicto
+913 -64 701 -16 conicto
+490 32 256 128 conicto
+256 512 lineto
+481 384 699 320 conicto
+918 256 1132 256 conicto
+1419 256 1573 355 conicto
+1728 455 1728 636 conicto
+1728 804 1614 893 conicto
+1500 982 1113 1065 conicto
+968 1097 lineto
+591 1175 423 1336 conicto
+256 1498 256 1780 conicto
+256 2123 501 2309 conicto
+747 2496 1199 2496 conicto
+1423 2496 1620 2464 conicto
+1817 2432 1984 2368 conicto
+end_ol grestore 
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 35.300000 10.700000 m 36.251889 11.369848 l s
+[] 0 sd
+0 slj
+0 slc
+n 36.558566 11.585658 m 36.005790 11.502363 l 36.251889 11.369848 l 36.293537 11.093460 l ef
+n 36.558566 11.585658 m 36.005790 11.502363 l 36.251889 11.369848 l 36.293537 11.093460 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 27.350000 14.950000 m 29.413197 14.950000 l s
+[] 0 sd
+0 slj
+0 slc
+n 29.788197 14.950000 m 29.288197 15.200000 l 29.413197 14.950000 l 29.288197 14.700000 l ef
+n 29.788197 14.950000 m 29.288197 15.200000 l 29.413197 14.950000 l 29.288197 14.700000 l cp s
+showpage
diff --git a/docs/GPN-2009-06-27/screenshot.png b/docs/GPN-2009-06-27/screenshot.png
new file mode 100644 (file)
index 0000000..15a5c7f
Binary files /dev/null and b/docs/GPN-2009-06-27/screenshot.png differ
diff --git a/docs/GPN-2009-06-27/screenshot.ps b/docs/GPN-2009-06-27/screenshot.ps
new file mode 100644 (file)
index 0000000..b9bf849
--- /dev/null
@@ -0,0 +1,8166 @@
+%!PS-Adobe-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: screenshot.ps
+%%CreationDate: Thu Mar 12 03:26:16 2009
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 1295 815
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+0 799.99999999999989 translate
+1279.9999999999998 -799.99999999999989 scale
+% Image geometry
+1280 800 8
+% Transformation matrix
+[ 1280 0 0 800 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 1280 string def
+/gstr 1280 string def
+/bstr 1280 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData:       542919 ASCII Bytes
+colorimage
+s!!"MJMVj5JMVp7s&FVDJP:VgJP:\iJ,~>
+s!!"MJMVj5JMVp7s&FVpJTu`jJTuflJ,~>
+s!!"MJMVj5JMVp7s&FW<JXM(WJXM.YJ,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+kop+`lQZ@br?D2rpEKQlr?D8tr$)/smNMah+sMho,(Uqh,(Us),55+7s63P`s7]Lns1q_8s3F[F
+s7B:ks0Yi,s.r]qs8>pts++1$<TmG5~>
+kop+`lQZ@br?D2rpEKQlr?D8tr$)/smNMah+sMho,(Uqh,(Us),55+7s63P`s7]Lns1q_8s3F[F
+s7B:ks0Yi,s.r]qs8>pts++1$<TmG5~>
+kop+`lQZ@br?D2rpEKQlr?D8tr$)/smNMah+sMho,(Uqh,(Us),55+7s63P`s7]Lns1q_8s3F[F
+s7B:ks0Yi,s.r]qs8>pts++1$<TmG5~>
+oHF9kpEBTnl664arZV>ur?;5tq'#fpr?;H%+sMge,)H4B",J-FM!uSkLa%X!Lk-b$,(Uqh,4$NN
+<<3'p<<3'a<<N8$<WDho!<;Xj!<;pr!<;1]!<;jp!<;pr!<;pr!<:VM!<;[k!<;"X!<;1]!<;Ui
+!<8lq!<<!t!<<!t!<:bQ!<7UMPuW>~>
+oHF9kpEBTnl664arZV>ur?;5tq'#fpr?;H%+sMge,)H4B",J-FM!uSkLa%X!Lk-b$,(Uqh,4$NN
+<<3'p<<3'a<<N8$<WDho!<;Xj!<;pr!<;1]!<;jp!<;pr!<;pr!<:VM!<;[k!<;"X!<;1]!<;Ui
+!<8lq!<<!t!<<!t!<:bQ!<7UMPuW>~>
+oHF9kpEBTnl664arZV>ur?;5tq'#fpr?;H%+sMge,)H4B",J-FM!uSkLa%X!Lk-b$,(Uqh,4$NN
+<<3'p<<3'a<<N8$<WDho!<;Xj!<;pr!<;1]!<;jp!<;pr!<;pr!<:VM!<;[k!<;"X!<;1]!<;Ui
+!<8lq!<<!t!<<!t!<:bQ!<7UMPuW>~>
+kop+`l664arZV>ur?;5tq'#fpr?;<!,)H1A!f/%Vr?;5tr?;5tp*'Tp+sMho,(Uqh,(Us(,4ee7
+s6<Sas8>pts7oXps794js8,drs5m;]s70.is3F[Fs7B:ks0Yi,s.r]qs8>pts4(*Ls++18<Ib~>
+kop+`l664arZV>ur?;5tq'#fpr?;<!,)H1A!f/%Vr?;5tr?;5tp*'Tp+sMho,(Uqh,(Us(,4ee7
+s6<Sas8>pts7oXps794js8,drs5m;]s70.is3F[Fs7B:ks0Yi,s.r]qs8>pts4(*Ls++18<Ib~>
+kop+`l664arZV>ur?;5tq'#fpr?;<!,)H1A!f/%Vr?;5tr?;5tp*'Tp+sMho,(Uqh,(Us(,4ee7
+s6<Sas8>pts7oXps794js8,drs5m;]s70.is3F[Fs7B:ks0Yi,s.r]qs8>pts4(*Ls++18<Ib~>
+r?D8t!@!?u,6*Jt,5m>t+p!KDreUOtrJ:FsrJ:@q!/UUu!f/$EreLS!M#ALtM#/@tLa%ZR+p*QE
+M#ALtM#JUtLk-b$,(Uqh,2FI@<WE*r<<3'`<<3't<<3'p<<<,"rr;strVumtrVujsrVugrrVumt
+!WQ1!s7fUms85mss8,drs85mss8H"!s&K'ur`/st!EK0p<W2st<<<,"rr;strr3"!s7fUnrrZ:$
+<WE"t"92C$<W<$t<W2ss<WE("<WE"ts8W$trVuUl!<<$u!<<$us8W'u!WQ1!s8H$trrZ:$<E9"t
+r`&sur`&supf7@o!EK1!<W2st<<<,"rr;strVujsrr3(#s&E(ts8Q("s&K'uku@ic<E9(t<WE*t
+<WE(&<W?'!s&K'ur`/pss&B+"<W<$t<W2st<W2sr<W2st<<<,"rr7OLVH&-~>
+r?D8t!@!?u,6*Jt,5m>t+p!KDreUOtrJ:FsrJ:@q!/UUu!f/$EreLS!M#ALtM#/@tLa%ZR+p*QE
+M#ALtM#JUtLk-b$,(Uqh,2FI@<WE*r<<3'`<<3't<<3'p<<<,"rr;strVumtrVujsrVugrrVumt
+!WQ1!s7fUms85mss8,drs85mss8H"!s&K'ur`/st!EK0p<W2st<<<,"rr;strr3"!s7fUnrrZ:$
+<WE"t"92C$<W<$t<W2ss<WE("<WE"ts8W$trVuUl!<<$u!<<$us8W'u!WQ1!s8H$trrZ:$<E9"t
+r`&sur`&supf7@o!EK1!<W2st<<<,"rr;strVujsrr3(#s&E(ts8Q("s&K'uku@ic<E9(t<WE*t
+<WE(&<W?'!s&K'ur`/pss&B+"<W<$t<W2st<W2sr<W2st<<<,"rr7OLVH&-~>
+r?D8t!@!?u,6*Jt,5m>t+p!KDreUOtrJ:FsrJ:@q!/UUu!f/$EreLS!M#ALtM#/@tLa%ZR+p*QE
+M#ALtM#JUtLk-b$,(Uqh,2FI@<WE*r<<3'`<<3't<<3'p<<<,"rr;strVumtrVujsrVugrrVumt
+!WQ1!s7fUms85mss8,drs85mss8H"!s&K'ur`/st!EK0p<W2st<<<,"rr;strr3"!s7fUnrrZ:$
+<WE"t"92C$<W<$t<W2ss<WE("<WE"ts8W$trVuUl!<<$u!<<$us8W'u!WQ1!s8H$trrZ:$<E9"t
+r`&sur`&supf7@o!EK1!<W2st<<<,"rr;strVujsrr3(#s&E(ts8Q("s&K'uku@ic<E9(t<WE*t
+<WE(&<W?'!s&K'ur`/pss&B+"<W<$t<W2st<W2sr<W2st<<<,"rr7OLVH&-~>
+r?;B#,)@G!r?;5trZV>ur?;?",)D'S+omGr+p*QEM#ALtM#ALtM#JS+La%X!,)@EeLa"%!q]Z,u
++sMjA+p*QEM#ALtM#ALtLk-b$,(Uqh,2=C><<3's<W<$m<W)mm<<3't<<3'p<WE*u<<E2#s8>q"
+s&E)!qc*Xrr)EasrD`t"<E9(u<<3'o<<3'p<<3'r<<3'r<<3'u<WE*u<<E2#s8H!us794ms&K+!
+r`'%"<WE%us8Vmp!<<$us8N+"s8>q"s&K+!r`&suqc*n$<E9'!s&K*t<<3'u<<3't<<3'o<<3'u
+<<3't<<3'u<WE*u<<E2#s8H$urrH."rD`t"<E9(u<<3'o<<W>%s&K*r<<N8$s8W'u!<;pr!rl:#
+r`'(#<E9(t<<N8$<WE%u!<;gor;ZOl"92A$s85jss8>q&s&K)!s&K+!r`'%"<WE"t"92A$s8H!u
+s8,dus&E)!r)EasrD`t"<E9(u<<3&M<MriI~>
+r?;B#,)@G!r?;5trZV>ur?;?",)D'S+omGr+p*QEM#ALtM#ALtM#JS+La%X!,)@EeLa"%!q]Z,u
++sMjA+p*QEM#ALtM#ALtLk-b$,(Uqh,2=C><<3's<W<$m<W)mm<<3't<<3'p<WE*u<<E2#s8>q"
+s&E)!qc*Xrr)EasrD`t"<E9(u<<3'o<<3'p<<3'r<<3'r<<3'u<WE*u<<E2#s8H!us794ms&K+!
+r`'%"<WE%us8Vmp!<<$us8N+"s8>q"s&K+!r`&suqc*n$<E9'!s&K*t<<3'u<<3't<<3'o<<3'u
+<<3't<<3'u<WE*u<<E2#s8H$urrH."rD`t"<E9(u<<3'o<<W>%s&K*r<<N8$s8W'u!<;pr!rl:#
+r`'(#<E9(t<<N8$<WE%u!<;gor;ZOl"92A$s85jss8>q&s&K)!s&K+!r`'%"<WE"t"92A$s8H!u
+s8,dus&E)!r)EasrD`t"<E9(u<<3&M<MriI~>
+r?;B#,)@G!r?;5trZV>ur?;?",)D'S+omGr+p*QEM#ALtM#ALtM#JS+La%X!,)@EeLa"%!q]Z,u
++sMjA+p*QEM#ALtM#ALtLk-b$,(Uqh,2=C><<3's<W<$m<W)mm<<3't<<3'p<WE*u<<E2#s8>q"
+s&E)!qc*Xrr)EasrD`t"<E9(u<<3'o<<3'p<<3'r<<3'r<<3'u<WE*u<<E2#s8H!us794ms&K+!
+r`'%"<WE%us8Vmp!<<$us8N+"s8>q"s&K+!r`&suqc*n$<E9'!s&K*t<<3'u<<3't<<3'o<<3'u
+<<3't<<3'u<WE*u<<E2#s8H$urrH."rD`t"<E9(u<<3'o<<W>%s&K*r<<N8$s8W'u!<;pr!rl:#
+r`'(#<E9(t<<N8$<WE%u!<;gor;ZOl"92A$s85jss8>q&s&K)!s&K+!r`'%"<WE"t"92A$s8H!u
+s8,dus&E)!r)EasrD`t"<E9(u<<3&M<MriI~>
+r?;B#,)@G!r?;5trZV>uq]Z#rr?;<!+sQr@!$_;rr?;5trZVN%,)@G!M#JUuM#8IsM#JRuM#AM!
+La%ZR+omFM,(Uqh,(Uri,5Y@?s7oXps6E\^s7oXps8>pus&Jsrs&B(!qc*Xrr)NXos&B(!oMknk
+q,IFpqc*Xrqc*Xrr`&surD`q!<WE%u!<;dnr;Qdts8>q!s&K*t<<3'p<<3't<<E2#s8>q!s&K*t
+<<E2#<W)ms<<W>%s&K*t<<3'u<<3'j<<W>%s&K*t<<3'u<<3't<<E2#s8>q!s&K*t<<rP(<W?)!
+<WDho#6.^'<W?'!r;Qdts8>q!s&E(srrH."r`'%"<E8qrs&B(!k#DN`<E9(s<<3't<<iJ's&K)!
+s8>pus&Jsrs&B(!qc3Ros&B(!r)EasrD`t"<E9'M<MNQE~>
+r?;B#,)@G!r?;5trZV>uq]Z#rr?;<!+sQr@!$_;rr?;5trZVN%,)@G!M#JUuM#8IsM#JRuM#AM!
+La%ZR+omFM,(Uqh,(Uri,5Y@?s7oXps6E\^s7oXps8>pus&Jsrs&B(!qc*Xrr)NXos&B(!oMknk
+q,IFpqc*Xrqc*Xrr`&surD`q!<WE%u!<;dnr;Qdts8>q!s&K*t<<3'p<<3't<<E2#s8>q!s&K*t
+<<E2#<W)ms<<W>%s&K*t<<3'u<<3'j<<W>%s&K*t<<3'u<<3't<<E2#s8>q!s&K*t<<rP(<W?)!
+<WDho#6.^'<W?'!r;Qdts8>q!s&E(srrH."r`'%"<E8qrs&B(!k#DN`<E9(s<<3't<<iJ's&K)!
+s8>pus&Jsrs&B(!qc3Ros&B(!r)EasrD`t"<E9'M<MNQE~>
+r?;B#,)@G!r?;5trZV>uq]Z#rr?;<!+sQr@!$_;rr?;5trZVN%,)@G!M#JUuM#8IsM#JRuM#AM!
+La%ZR+omFM,(Uqh,(Uri,5Y@?s7oXps6E\^s7oXps8>pus&Jsrs&B(!qc*Xrr)NXos&B(!oMknk
+q,IFpqc*Xrqc*Xrr`&surD`q!<WE%u!<;dnr;Qdts8>q!s&K*t<<3'p<<3't<<E2#s8>q!s&K*t
+<<E2#<W)ms<<W>%s&K*t<<3'u<<3'j<<W>%s&K*t<<3'u<<3't<<E2#s8>q!s&K*t<<rP(<W?)!
+<WDho#6.^'<W?'!r;Qdts8>q!s&E(srrH."r`'%"<E8qrs&B(!k#DN`<E9(s<<3't<<iJ's&K)!
+s8>pus&Jsrs&B(!qc3Ros&B(!r)EasrD`t"<E9'M<MNQE~>
+r?;B#,)@G!r?;5trZV>uq]Z#rr?;<!,)H1A!f/%Vp`]]orZVN%+sMgeM#JUuM#ALtM#8FsM#AM!
+La%ZR+omFM,(Uqh,(Uri,5Y@?s7oXps6EYbs8>pts7oXps8>q!s&K*q<<3'r<<3's<<3'q<<3'k
+<<3'p<<3'r<<3'r<<3'u<<3't<<E2#<W<$m<<3't<<E2#s8>q!s&K*t<<3'p<<3't<<E2#s8H$u
+rrH."rD`q!<WE"t#QIe(s&K)!s8>pts8H!us794ns&K)!s8>pts8H!us8>q!s&K*t<<E2#s8>q&
+s&E)!<W?)!pf.Ou<W?)!<WE"t!rl:#rD`q!<WE"t!rl8#rr;st!<;mq!<;.\s8Vsr!<<!t#QIg(
+<W?)!s8H""s&K*q<<3's<<3't<<N8$<WDts!<<!t"92A$s++1F<Ib~>
+r?;B#,)@G!r?;5trZV>uq]Z#rr?;<!,)H1A!f/%Vp`]]orZVN%+sMgeM#JUuM#ALtM#8FsM#AM!
+La%ZR+omFM,(Uqh,(Uri,5Y@?s7oXps6EYbs8>pts7oXps8>q!s&K*q<<3'r<<3's<<3'q<<3'k
+<<3'p<<3'r<<3'r<<3'u<<3't<<E2#<W<$m<<3't<<E2#s8>q!s&K*t<<3'p<<3't<<E2#s8H$u
+rrH."rD`q!<WE"t#QIe(s&K)!s8>pts8H!us794ns&K)!s8>pts8H!us8>q!s&K*t<<E2#s8>q&
+s&E)!<W?)!pf.Ou<W?)!<WE"t!rl:#rD`q!<WE"t!rl8#rr;st!<;mq!<;.\s8Vsr!<<!t#QIg(
+<W?)!s8H""s&K*q<<3's<<3't<<N8$<WDts!<<!t"92A$s++1F<Ib~>
+r?;B#,)@G!r?;5trZV>uq]Z#rr?;<!,)H1A!f/%Vp`]]orZVN%+sMgeM#JUuM#ALtM#8FsM#AM!
+La%ZR+omFM,(Uqh,(Uri,5Y@?s7oXps6EYbs8>pts7oXps8>q!s&K*q<<3'r<<3's<<3'q<<3'k
+<<3'p<<3'r<<3'r<<3'u<<3't<<E2#<W<$m<<3't<<E2#s8>q!s&K*t<<3'p<<3't<<E2#s8H$u
+rrH."rD`q!<WE"t#QIe(s&K)!s8>pts8H!us794ns&K)!s8>pts8H!us8>q!s&K*t<<E2#s8>q&
+s&E)!<W?)!pf.Ou<W?)!<WE"t!rl:#rD`q!<WE"t!rl8#rr;st!<;mq!<;.\s8Vsr!<<!t#QIg(
+<W?)!s8H""s&K*q<<3's<<3't<<N8$<WDts!<<!t"92A$s++1F<Ib~>
+r?;B#,)@G!r?;5trZV>ur?;<!,)H1A!f/%VrZ_Au!@!?u+omGt+omGu+omGq+pNiI,)@EeM#&:t
+La"%!rZVH#+sMj@+omFM,(Uqh,(Urn,5Y@?s8H!us8>pts6EYbs8>pts7o[ps8H""s&K*t<<N8$
+<WE%u"92A$s8H""s&K*t<<N8$<WD\k!<<$u!<<!t!<;pr!<;pr!<<$u!<<!t!rl:#oMknkr`0!u
+!EK0u<<E2#s8H$us7oXps8H$us8Q*urrZ:$<WE"t!rl:#r`0!us&B4%<W?)!rD`jtr`&surD`jt
+pf.Is<W?)!rD`jtr`&surD`q!<WE%us8N+"s8>q&s&E)!<W?)!pf.Ou<W?)!<WE%us8N+"s8>q!
+s&K*u<WE("<WDqr!<<!t"92A$s5d8\s8,drs8>q&s&K)!s&K)!rr<!u!<<!t"92A$s85jss8H$u
+s8Q(!s8H""s&K*t<<N8$<W@VMUK)g~>
+r?;B#,)@G!r?;5trZV>ur?;<!,)H1A!f/%VrZ_Au!@!?u+omGt+omGu+omGq+pNiI,)@EeM#&:t
+La"%!rZVH#+sMj@+omFM,(Uqh,(Urn,5Y@?s8H!us8>pts6EYbs8>pts7o[ps8H""s&K*t<<N8$
+<WE%u"92A$s8H""s&K*t<<N8$<WD\k!<<$u!<<!t!<;pr!<;pr!<<$u!<<!t!rl:#oMknkr`0!u
+!EK0u<<E2#s8H$us7oXps8H$us8Q*urrZ:$<WE"t!rl:#r`0!us&B4%<W?)!rD`jtr`&surD`jt
+pf.Is<W?)!rD`jtr`&surD`q!<WE%us8N+"s8>q&s&E)!<W?)!pf.Ou<W?)!<WE%us8N+"s8>q!
+s&K*u<WE("<WDqr!<<!t"92A$s5d8\s8,drs8>q&s&K)!s&K)!rr<!u!<<!t"92A$s85jss8H$u
+s8Q(!s8H""s&K*t<<N8$<W@VMUK)g~>
+r?;B#,)@G!r?;5trZV>ur?;<!,)H1A!f/%VrZ_Au!@!?u+omGt+omGu+omGq+pNiI,)@EeM#&:t
+La"%!rZVH#+sMj@+omFM,(Uqh,(Urn,5Y@?s8H!us8>pts6EYbs8>pts7o[ps8H""s&K*t<<N8$
+<WE%u"92A$s8H""s&K*t<<N8$<WD\k!<<$u!<<!t!<;pr!<;pr!<<$u!<<!t!rl:#oMknkr`0!u
+!EK0u<<E2#s8H$us7oXps8H$us8Q*urrZ:$<WE"t!rl:#r`0!us&B4%<W?)!rD`jtr`&surD`jt
+pf.Is<W?)!rD`jtr`&surD`q!<WE%us8N+"s8>q&s&E)!<W?)!pf.Ou<W?)!<WE%us8N+"s8>q!
+s&K*u<WE("<WDqr!<<!t"92A$s5d8\s8,drs8>q&s&K)!s&K)!rr<!u!<<!t"92A$s85jss8H$u
+s8Q(!s8H""s&K*t<<N8$<W@VMUK)g~>
+r?;5trZVE"+sQr@s!%DtruqH!r?;<!+sR#B"!WOF,5m>s,5d8s,5m>t+omGt+p!KDqhY4qs+pRs
+s+pRsreQ+LJKfXhJKinorDidqs&K$tl;[iarD`jtq,IIq<W<$t<W2sr<W<$s<W<$t<W2ss<<3'j
+<W<$t<W)ms<W)ms<W)jt<WE"t!rl8#rVuUlrr3(#s&K*t<<E2#<W<"!<WDhorr3"!s8,dts&K*t
+<<E2#<W<"$<W?'!s8H""s&E(ss8Q*ts7TFos&K*u<W)jt<WE"t!rl8#rr3(#s&E(ts8>q!s&K*n
+<<3'u<<E2#<W<"#<W?)!rD`q!<E9%u"',A$<W2ss<W2ss<<3'\<WE*t<W)ms<<3'u<<E2#s8#ao
+s8H!us8,gqrrH."r`/str`/psr`&suJQ8IFJ,~>
+r?;5trZVE"+sQr@s!%DtruqH!r?;<!+sR#B"!WOF,5m>s,5d8s,5m>t+omGt+p!KDqhY4qs+pRs
+s+pRsreQ+LJKfXhJKinorDidqs&K$tl;[iarD`jtq,IIq<W<$t<W2sr<W<$s<W<$t<W2ss<<3'j
+<W<$t<W)ms<W)ms<W)jt<WE"t!rl8#rVuUlrr3(#s&K*t<<E2#<W<"!<WDhorr3"!s8,dts&K*t
+<<E2#<W<"$<W?'!s8H""s&E(ss8Q*ts7TFos&K*u<W)jt<WE"t!rl8#rr3(#s&E(ts8>q!s&K*n
+<<3'u<<E2#<W<"#<W?)!rD`q!<E9%u"',A$<W2ss<W2ss<<3'\<WE*t<W)ms<<3'u<<E2#s8#ao
+s8H!us8,gqrrH."r`/str`/psr`&suJQ8IFJ,~>
+r?;5trZVE"+sQr@s!%DtruqH!r?;<!+sR#B"!WOF,5m>s,5d8s,5m>t+omGt+p!KDqhY4qs+pRs
+s+pRsreQ+LJKfXhJKinorDidqs&K$tl;[iarD`jtq,IIq<W<$t<W2sr<W<$s<W<$t<W2ss<<3'j
+<W<$t<W)ms<W)ms<W)jt<WE"t!rl8#rVuUlrr3(#s&K*t<<E2#<W<"!<WDhorr3"!s8,dts&K*t
+<<E2#<W<"$<W?'!s8H""s&E(ss8Q*ts7TFos&K*u<W)jt<WE"t!rl8#rr3(#s&E(ts8>q!s&K*n
+<<3'u<<E2#<W<"#<W?)!rD`q!<E9%u"',A$<W2ss<W2ss<<3'\<WE*t<W)ms<<3'u<<E2#s8#ao
+s8H!us8,gqrrH."r`/str`/psr`&suJQ8IFJ,~>
+V]l+sJKfXhJKfXhg`h;Lq,IFprD`jtel;_MrD`jtM,aQUrD`jtaAi6?JQ78$pf2h~>
+V]l+sJKfXhJKfXhg`h;Lq,IFprD`jtel;_MrD`jtM,aQUrD`jtaAi6?JQ78$pf2h~>
+V]l+sJKfXhJKfXhg`h;Lq,IFprD`jtel;_MrD`jtM,aQUrD`jtaAi6?JQ78$pf2h~>
+JKfXhJKfXhJKfYFpf7:me5cJILK4<Qa&N->JQ78$pf2h~>
+JKfXhJKfXhJKfYFpf7:me5cJILK4<Qa&N->JQ78$pf2h~>
+JKfXhJKfXhJKfYFpf7:me5cJILK4<Qa&N->JQ78$pf2h~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+JKfXhJKfXhJKfYFJQ78$JQ78$J,~>
+s!!"MJMVj5JMVp7s&FVDJP:VgJP:\iJ,~>
+s!!"MJMVj5JMVp7s&FVpJTu`jJTuflJ,~>
+s!!"MJMVj5JMVp7s&FW<JXM(WJXM.YJ,~>
+s!!!oJH16$JH1B(s!%JCJ_Yh3fA*"uJ_ZCCs&FR~>
+s!!!oJH16$JH1B(s!%JCJ_G\/f@lksJ_H7?s&FR~>
+s!!!oJH16$JH1B(s!%JCJ^o>%f@?MnJ^on5s&FR~>
+s!!!oJH16$JH1B(s!%JCJ_Yh3f\?K,TA0DHJ_ZFDs&FR~>
+s!!!oJH16$JH1B(s!%JCJ_G\/f\-?*T@s8FJ_H:@s&FR~>
+s!!!oJH16$JH1B(s!%JCJ^o>%f[U!%T@EoAJ^oq6s&FR~>
+s!!!oJH16$JH1B(s!%JCrS4(C!8O7E!8O7E!<8_I!M0:BglgIm<Ib~>
+s!!!oJH16$JH1B(s!%JCrS!qA!8=+C!8=+C!<8_G!La">g611i<Ib~>
+s!!!oJH16$JH1B(s!%JCrRIS;!7db=!7db=!<8_B!KdA5eWSJ_<Ib~>
+s!%CA!7UiGs3pfE!7TEtrR:]Fs3prIqpYQFrR:WD!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?
+!7UK=!7U'1!7U`D!7U-3!n..unc8^=q#CEDJH16$c2dkgs&K'R!;iG-!;iG-!;iG-!<8_I!M0:B
+glgIm<Ib~>
+s!%CA!7UiGs3pfE!7TEtrR:]Fs3prIqpYQFrR:WD!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?
+!7UK=!7U'1!7U`D!7U-3!n..unc8^=q#CEDJH16$c2dkgs&K'P!;iG+!;iG+!;iG+!<8_G!La">
+g611i<Ib~>
+s!%CA!7UiGs3pfE!7TEtrR:]Fs3prIqpYQFrR:WD!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?
+!7UK=!7U'1!7U`D!7U-3!n..unc8^=q#CEDJH16$c2dkgs&K'K!;`A%!;`A%!;`A%!<8_B!KdA5
+eWSJ_<Ib~>
+s!%FBs3poH"4I5Me,04Ge("Eue,97Ndf9Bs!!(LE!!:ULe,97He,9:He+!D<e,97Ndf9Bs!!(L4
+!!C[M!7UE;"4I5Me+WhEdf9Bsn,NR>!!(LA!<:O=!!(L1!!(LD!!(LC!!(L=!!:ULe+!D<e+itD
+dt%LM!6tTE,6([Bg]75E_uT\-_uT\-_uTh1g]<uHJ_ZFDs&FR~>
+s!%FBs3poH"4I5Me,04Ge("Eue,97Ndf9Bs!!(LE!!:ULe,97He,9:He+!D<e,97Ndf9Bs!!(L4
+!!C[M!7UE;"4I5Me+WhEdf9Bsn,NR>!!(LA!<:O=!!(L1!!(LD!!(LC!!(L=!!:ULe+!D<e+itD
+dt%LM!6tTE,6([Bg&V#C_>sJ+_>sJ+_>sV/g&[WBJ_H:@s&FR~>
+s!%FBs3poH"4I5Me,04Ge("Eue,97Ndf9Bs!!(LE!!:ULe,97He,9:He+!D<e,97Ndf9Bs!!(L4
+!!C[M!7UE;"4I5Me+WhEdf9Bsn,NR>!!(LA!<:O=!!(L1!!(LD!!(LC!!(L=!!:ULe+!D<e+itD
+dt%LM!6tTE,6([BeH#H=]`@o%]`@o%]`A)*eH(d4J^oq6s&FR~>
+s!%IC!n..urVurIr;ZiHrW!#K!7THu!7UlH!n..ur;ZiHqu?iJ!!(LH!!(LI!!:ULe+!D<e,97J
+df@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LC!!:ULe+3P>e)gW1e+`nCe*-i7
+df9BsnGiR<q#CEDJH16$c2dkgs&K'R!;iG-!;iG-!;iG-!<8_I!M0:BglgIm<Ib~>
+s!%IC!n..urVurIr;ZiHrW!#K!7THu!7UlH!n..ur;ZiHqu?iJ!!(LH!!(LI!!:ULe+!D<e,97J
+df@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LC!!:ULe+3P>e)gW1e+`nCe*-i7
+df9BsnGiR<q#CEDJH16$c2dkgs&K'P!;iG+!;iG+!;iG+!<8_G!La">g611i<Ib~>
+s!%IC!n..urVurIr;ZiHrW!#K!7THu!7UlH!n..ur;ZiHqu?iJ!!(LH!!(LI!!:ULe+!D<e,97J
+df@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LC!!:ULe+3P>e)gW1e+`nCe*-i7
+df9BsnGiR<q#CEDJH16$c2dkgs&K'K!;`A%!;`A%!;`A%!<8_B!KdA5eWSJ_<Ib~>
+s!%CA!7UoI!7UlH#1EPPdf9Bsci=-r!7UlH!7UlH!7UoI!7UoIs3puJ"4I5Me*I&9df@kq!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L>!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+F
+e,B@Ge,KCKdfBBrr;clHrVuuJ!<1IE!!LaN!7LrIe,B@Ge,01Ge,9:GdfBHtJH16$c2dkgs&K'R
+!;lZ3!O@mcL]`NnS$]K>!;lZ3!O@mcL]`NnS$]K>!;lZ3!O@mcL]`NnS$]K>!<;rO!Q10!L]`No
+TuOCn!M0:BglgIm<Ib~>
+s!%CA!7UoI!7UlH#1EPPdf9Bsci=-r!7UlH!7UlH!7UoI!7UoIs3puJ"4I5Me*I&9df@kq!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L>!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+F
+e,B@Ge,KCKdfBBrr;clHrVuuJ!<1IE!!LaN!7LrIe,B@Ge,01Ge,9:GdfBHtJH16$c2dkgs&K'P
+!;lZ1!O@pdM?AftS@#T=!;lZ1!O@pdM?AftS@#T=!;lZ1!O@pdM?AftS@#T=!<;rM!Q13"M?Afu
+U;aFl!La">g611i<Ib~>
+s!%CA!7UoI!7UlH#1EPPdf9Bsci=-r!7UlH!7UlH!7UoI!7UoIs3puJ"4I5Me*I&9df@kq!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L>!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+F
+e,B@Ge,KCKdfBBrr;clHrVuuJ!<1IE!!LaN!7LrIe,B@Ge,01Ge,9:GdfBHtJH16$c2dkgs&K'K
+!;cT+!N_=YK`d*eQ`dX-!;cT+!N_=YK`d*eQ`dX-!;cT+!N_=YK`d*eQ`dX-!<;rH!POWmK`d*f
+S\VP]!KdA5eWSJ_<Ib~>
+s!%CA!7UoI!7UlH!n..urVurId/X9t!!(LH!!(LH!!(LH!<1FL!7LqsrVurIm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L?!!(LI!!(LH!!:ULe,97Kdf9BsrVurI
+r;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LF!!(LH!!(LI!!(LI!<:N!
+!.b-q!<48C<W:bRqtn;4OQu]B"5VFhV6e)?qtn;4OQu]B"5VFhV6e)?qtn;4OQu]B"5VFhV6e)?
+s81RPPNr#E"5VFiYPR#S!5%"eScF>sP2-(;J,~>
+s!%CA!7UoI!7UlH!n..urVurId/X9t!!(LH!!(LH!!(LH!<1FL!7LqsrVurIm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L?!!(LI!!(LH!!:ULe,97Kdf9BsrVurI
+r;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LF!!(LH!!(LI!!(LI!<:N!
+!.b-q!<48C<W:\Pqtn52P3_uE"5_OlVR+,>qtn52P3_uE"5_OlVR+,>qtn52P3_uE"5_OlVR+,>
+s81LNQ0\;H"5_OmYkm&R!5$qcRK.omP1oq9J,~>
+s!%CA!7UoI!7UlH!n..urVurId/X9t!!(LH!!(LH!!(LH!<1FL!7LqsrVurIm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L?!!(LI!!(LH!!:ULe,97Kdf9BsrVurI
+r;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LF!!(LH!!(LI!!(LI!<:N!
+!.b-q!<48C<W:MKqYRr,Np6E?"5M:bTX2<3qYRr,Np6E?"5M:bTX2<3qYRr,Np6E?"5M:bTX2<3
+s81=IOQlWA"5M:cX8:?H!5$b^OT9s_P1BS4J,~>
+s!%CA!7UoI!7UlH!n..urVurIdfBEsrVurIr;ZiHrVurIp](BE!7UoI!7UB:s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7UT@!7UlH!7UlH"Od>Ne'n3p!7UcE!7UiG
+s3poH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n.,Lr6tTE!7UoI!7UlH!7QK!JH3sqs!%JC
+rnIMNqnrMks8CULf`\GDn;ss!`!!tt2JL&,_umhf2K\]3!;lZ3!JpdSf`'P,XmGP=ZMMK>bi-J?
+bk/gV_f7SK_YqCT_.GTIpV[(/qnrMks8CULf`\GDn;ss!`!!tt2JL&,_umhf2K\]3!<;rO!JpdS
+f`'P,XmGP>`;A<r!8QAB=;M#Q9Y]?;"P\;_F4pNI"5.QNJ+q_!ScF>sP2-(;J,~>
+s!%CA!7UoI!7UlH!n..urVurIdfBEsrVurIr;ZiHrVurIp](BE!7UoI!7UB:s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7UT@!7UlH!7UlH"Od>Ne'n3p!7UcE!7UiG
+s3poH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n.,Lr6tTE!7UoI!7UlH!7QK!JH3sqs!%JC
+rn7ALqn`Gms4lB,g]XeJn<1*#_?@\r3c2\2_?7Pe4*LA8!;lZ1",d-6g\fh0Y3teBZMVK>\d7<4
+!OrI._?@\r3c2\2_?7Pe4*LA8!;lZ1",d-6g\fh0Y3teBZHL)f_/hYS_#;+P^M,cQpVHq1qq;.0
+s4lB,g]XeJn<:ceg'Ic5g8%1K!ukOpgY)e`IQM`)rRqA*E]epIg&[WBJ_H:@s&FR~>
+s!%CA!7UoI!7UlH!n..urVurIdfBEsrVurIr;ZiHrVurIp](BE!7UoI!7UB:s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7UT@!7UlH!7UlH"Od>Ne'n3p!7UcE!7UiG
+s3poH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n.,Lr6tTE!7UoI!7UlH!7QK!JH3sqs!%JC
+rm_#Fqn3)cs4,WseHDl;muFNn]`bug4)DP-]`YiZ4*C;2!;cT+",6d*eGRi"WU'#5Xo#d4R3(A$
+!L"f$]`bug4)DP-]`YiZ4*C;2!;cT+",6d*eGRi"WU'#5XinB\]Q-)M]D]DF\nF0JpUpS,qpbe&
+s4,WseHDl;muP6\eHl6+eVc<l"se3:gXQGVI6;Z#rRD"uEBJdGeH(d4J^oq6s&FR~>
+s!%CA!7UoI!7UlH!Rh&Ge("Eue,01Ge,97He,B=Ie+`nDdfB9onGiR<qu?`Gr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Ao`,!@r;ZiHr;ZiHr;clHrVurIq>^NEq>gQErr<&J
+r;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZoJ!7UlH!7UlH!7UoI!7UlH!7QK!JH3sqs!%JCrnIMN
+qnrMks8LdOg]Xe@nB73o_udRh!<'h=U+-9ZAc9OKVa1=G`!p]^P?M>1`5KJs?(4W4pr!10qnrMk
+s8LdOg]Xe@nB73r_u[j#qSWESb3QtH`QRnl%<51->$o.b`5,\aRnn2%_uT]3_uY\ornID,"KphT
+bF&.E!6k/T!QN:?`!p]^P?M>1`5KJs?(4W4pr!14qqM4.s8LdOg]Xe@nB7Btg]egH]@kG]&_l(M
+Hr-#2B%btpfje?X:k8>r!M0:BglgIm<Ib~>
+s!%CA!7UoI!7UlH!Rh&Ge("Eue,01Ge,97He,B=Ie+`nDdfB9onGiR<qu?`Gr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Ao`,!@r;ZiHr;ZiHr;clHrVurIq>^NEq>gQErr<&J
+r;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZoJ!7UlH!7UlH!7UoI!7UlH!7QK!JH3sqs!%JCrn7AL
+qn`Aks8LmRhZU4Gn][Er_?-tS!<'b;J/eV1Jc3FeO=L=o_@:QbQ!Rq8_SX&p@@U8?pqd%.qn`Ak
+s8LmRhZU4Gn][Eu_?$PPqSE7oJEt&QU`8sC%<GI5?=L^e_S9GdS5XY,_>sK1_?#PorndV2"L7(Y
+baJ@F!P&I/_>u]Ji5,qE;jCZu^r!t'?X]I'GPK#Ts81LNMZ<\4rSIa_jmgQdpt>p.MT"/cALQ<e%
+=V9A?Y\3Hg=KqGS5b+8g&[WBJ_H:@s&FR~>
+s!%CA!7UoI!7UlH!Rh&Ge("Eue,01Ge,97He,B=Ie+`nDdfB9onGiR<qu?`Gr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Ao`,!@r;ZiHr;ZiHr;clHrVurIq>^NEq>gQErr<&J
+r;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZoJ!7UlH!7UlH!7UoI!7UlH!7QK!JH3sqs!%JCrm_#F
+qn3&bs4@8&rn.FSipXsPpq6``0*(sa"CMlG.%U=M!dGI\kIh=F<0LTs]=knh?t#L&FniWMqYRr-
+L&]d(f`'P,WoEKgPP`#o;e>g=!>hNs]`CfBoXt]S<0LTs]=knh?t#L&FniWMqYRr-L&]d(f`'P,
+WoEKgPP`#oQ5oV3!>hNh]a]!]P?hY0]tM!b@@C,;pq6\-qpbb%s4@8&rn.FSipXsUpsfR<QH.F\
+2e:[n%=M6??>7j<e^A)>RT+k5eH(d4J^oq6s&FR~>
+s!%CA!7UlH"4I5Me,'+Fe("Eue+s%Hdf9BsrVurIp](<CqZ$WFnGiR<q>^WH!!(L4!!C[M!7UE;
+"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LF!!(LA!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe,01G
+e,97Kdf@kGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!:ULe,B@Ie,97He,B=Ie,B@Idt%LM!6tTE
+,6([Bg]76K_uY\orndV2"NR[Fb)?)6"2dWM!<0n@\-RT!W$H<\_u^p.!9_9022mWi=^Ak[>[F7l
+N]?gP!;lZ3!JpdThYl=7a0)GbMu1En`QS+r!QiFK_u[j"oY_1rN0']8?,=?^?DWpI3;CDlqtn;4
+M#[J2rSIauY,]X&qSWBWp;@!RaPauG22mWi=^Ak[>[F7lN]?gP!<;rO!JpdThYl=7a0)GbMu290
+!;bIOgB--b%5s0,TNYmZfjeBcQ&[m"g]<uHJ_ZFDs&FR~>
+s!%CA!7UlH"4I5Me,'+Fe("Eue+s%Hdf9BsrVurIp](<CqZ$WFnGiR<q>^WH!!(L4!!C[M!7UE;
+"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LF!!(LA!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe,01G
+e,97Kdf@kGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!:ULe,B@Ie,97He,B=Ie,B@Idt%LM!6tTE
+,6([Bg&V$I_?#Poro*h8"Nn!ObDl>7"2GkL!<0h>U^EC%PmX>d_?)ER!9_3.3fT8r?=L[a?Xfn!
+O?WHV!;lZ1!K-pViVha=b-A(lNVgQnF%Q5F!>;I!_?"FKoYM%uNKKrA@_]Zb@]#KR55;tpqtn52
+MZ<\7rSdt&Z)u3/qn`B.)tq,L'!'s-%6BK2U0_<D^L(HIQ]OE+_>sW5g&[*2ro*h8"Nn!ObDlDQ
+!!)lL!S7G.g'p-'OeQ2sf@OVEVO*B/pt>b;!.ijegAb0'~>
+s!%CA!7UlH"4I5Me,'+Fe("Eue+s%Hdf9BsrVurIp](<CqZ$WFnGiR<q>^WH!!(L4!!C[M!7UE;
+"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LF!!(LA!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe,01G
+e,97Kdf@kGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!:ULe,B@Ie,97He,B=Ie,B@Idt%LM!6tTE
+,6([BeH#IC]`WuggY;\^"l7+sW5sej]`YPPYQ4[9#&5BW\9\Cbrk/A#U&aAi%6KK-TNu!;\mT!B
+PE%j%]`@p+]`WuggY;\^"l7+sW5sel]`BUFqRln8Zg5:*.$O;:%6KK-TNu!;\mT!BPE%j%]`@p+
+]`WuggY;\^"l7+sW5sel]`C`>p:UJ4Zf&M+4,])k?"(=U?t,mpN^!6O!<;rH",6d0g\on2h8H=l
+aGB`D!!)lG!QGK$eI=X!NM'TkdaDc<UQ^^'psfD-!.i[`ec/X"~>
+s!%ICr6tWFs3pfE!7THuqpYNEs3poH!7UfFrmU]D!7UH<qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUiHr6tE@!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M!7UiG
+!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtJH16$c2dkgs&K'R!;lZ3%>b&CiQGCU/7-ZNaS1Vg_uk`Q
+_uTeT!I[!-_uZnPr58R8kJRgD>FUDB=^><>VN%6MD>;$Lqtn;@M#ZGmb??GJ?I.'@pP\pe#KP!.
+bfn2I`;IjL`!+6*bfRlHoY_2Q>FUDB=^><>VN%6MD>;$Lqtn;@M#ZGmb??GJ?I.'@pP\pe$cU<-
+`6?3Bbfe,H`;IjZ`!"0)bfe#j`!pEbRtm_@?!Ud6NM'?ipr!14qqMX:s5Dq[=tD42cdKo/Mu290
+!;kOQd"rOmg^S=0Rtm_AARo/FNM'BtptPnA!.ipgh#CB)~>
+s!%ICr6tWFs3pfE!7THuqpYNEs3poH!7UfFrmU]D!7UH<qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUiHr6tE@!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M!7UiG
+!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtJH16$c2dkgs&K'P!;lZ1%>t2GjO/<Q<I<<Hb4ptl_?3VK
+_>sSP!@rd$_?#6>r5&F6kJ@[E?CcnI>@CoKW/mZWDtq0Lqtn5>MZ;_tdWnelHe-]hpl50f#VUcu
+$O_0q]E/!3!#P4C#/*J4%VI8ToYM&R?CcnI>@CoKW/mZWDtq0Lqtn5>MZ;_tdWnelHe-]hpl50f
+$t3/Q]EOEP#S;F$]E/!3#8b7j<"]?fZ0B+7CgNZgUK_/7@]5?^>As;R!<;rM%>t2GjO/<Q<I<<H
+b4ptng&M-Mg&f9.38<-rF^L\qUKhJFA#PH_>^?+u!La">g611i<Ib~>
+s!%ICr6tWFs3pfE!7THuqpYNEs3poH!7UfFrmU]D!7UH<qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUiHr6tE@!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M!7UiG
+!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtJH16$c2dkgs&K'K!;cT+%>Fi=hpnK]NMP1P`qP;b]`TIE
+]`A&F!>;7.]`C'<r4N(1kIh=@?^ZV?>[UrKUl:mKDYUmFqYRr8L&^#eeYA+`Ut<r4pPA^[#S_tL
+#8NfCV#gPq!*o*.#,O'X(P`X'oXt]M?^ZV?>[UrKUl:mKDYUmFqYRr8L&^#eeYA+`Ut<r4pPA^[
+$m_+OV%e"r"<4&JV#gPq#@+sB5Rdra[ctI7CgWTaT3Pc3@\esS>&O,K!<;rH%>Fi=hpnK]NMP1P
+`qP;deGoUIeH=:23d09.%<Z'HKqDX`B4I`rSm-I7eH(d4J^oq6s&FR~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCrnIMNqnru#s5_BXEM9Ic0@Aq^Lr9,."KrNV_uTeT!A'E5
+_u[UVr58R8kJRhH?<`qXU0(a"Oe>`__YD%Lqtn;AM#ZP[0QEefJhPO6s+nSj`!OQ/`l,j?`5KX=
+n&57J"NA=$bK'7n%DlFUS;X+D?DipY<a`f>_uT]3`"%V'jNK;tTr`i!dH:Ib_u.F^a2u9=bfe#E
+`QZ9=`Q\;!"j+p+`5^!b`!sRi>F^VG=C.nfTN5I;pr!14qqM[;s5_BXEM9Ic0@Aq^Lthj_!!)uQ
+rVus*\(f[Ifk"EYMkX?]VidWRB\E19!M0:BglgIm<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCrn7ALqn`i#s5qg3Ogi3!=P)d:MS]2,"H5%O_>sSP!=QC9
+_?%+Rr5&F6kJ@\D@:,RaUg%<,P+l,i_"bbHqtn5?MZ;hg<fsl.SljV.s,+Yj_?gejPe`Uk_SWJd
+nA5FG,\4Ei/HrEO_@=:h?_*.O>@OOoU0;'Bpqd%.qn`i#s5qg3Ogi3!=P)d:MS]5-%3_4XYQHVV
+^m>>D_QOIK_?Re(@C3[X*pLNN^gUT@N20ZeW03lYA&.lV!<;rM%Z:;Ke5h^@_Oal]kl6Onr7V,N
+rS%5N!>j/<g'uYJ@%E7P>[s^qU0DEbpt>b;!.ijegAb0'~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCrm_#Fqn3Jns5DRfP_R):NnWRoKtR;r"BSpC]`A&F!<p"4
+]`F*Dr4N(1kIh>:@UGU\TNbj$Nh0B`]D0&>qYRr9L&^,`Mj/t6O,hrTs+S,`]a4rsT=Sn]]tJ;D
+n@](8%XbgY&d#N6]a_S_?^lkE>@F@gSloR8pq6\(qn3Jns5DRfP_R):NnWRoKtR>s%1]MRF::sH
+\o&\)]l#k0]`tnWG."P5=m<U/]4,-:LnIs\V2h-MA%VNL!<;rH%YarAf8GlJ_iKi3jSsq`r7(cI
+rRLlI!B&<[eIBr@@%2tF>[jOiSm#mWpsfD-!.i[`ec/X"~>
+s!!!oJH16$JH1B(s!%JCrnIMNqnru#s6!O7W/%=^L0j-EM8T80"hu7W`5DZT_uU(TrkniT!W9k9
+!9V3-_Hg<7N1lu-T2f:9pV[(/qnru#s6!O7W/%=^L0j-EM8T80!R&O_`!"<&`5Tsi_u[j#rknlW
+bf01l$c61PS;a/9OIoN\_Y:tKqtn;AM#ZX@J#J.$\V=GTs,"Yk`!+?(`5Km=rknr``5KX=rkniW
+bPf?ZbiltQ_Hg<7N1lu-T2f:9pV[(3qqM[;s6!O7W/%=^L0j-EM;.s`!!)oO!lnslg>!(hA6PL^
+Tq[X@<bU1\g]<uHJ_ZFDs&FR~>
+s!!!oJH16$JH1B(s!%JCrn7ALqn`i#s64fs]Vr`lTR?)*Mo#>."h#&T_SQ<P_>s_Rrk\]O!rTn8
+!9V-+^gUQ?NM<53TNPd?pVHq-qn`i#s64fs]Vr`lTR?)*Mo#A/$GZ_>_SX"h_SV9]nA53R3<$br
+XTH<0_@+.f?Cd(MUlqBRA&.iU!;lZ1%Z:;NH'u=D_p"d$li2mZr5&mM[_eaF]u%Y#"2_p7.K70b
+H;4CU!Ped#_@+.f?Cd(MUlqBRA&.iU!<;rM%Z:;NH'u=D_p"d$li2mrr7V,Nr7V8+]0nj:g'cMG
+?_*1NUlqBSCY/=7!La">g611i<Ib~>
+s!!!oJH16$JH1B(s!%JCrm_#Fqn3Gms5g%hERC^\F/J.#LASXfOY")W]`A&F!<Kk4]`GMGr4N(1
+k.M/7?sT7ZT:h18>%>2=]`@p+]a]\qjeQO/dATi^VW[u6r4NHF!O9>OXpi"W21P,/!B>6$]`MjR
+]^rfE]3np6MP$Q$Sm#X9pUpS'qn3Gms5g%hERC^\F/J.#LASXn"Lu-5,eLb'Xpi"W21PV=!B>f4
+]`GGEke.A9?sT7ZT:h18>%>2=]`A*0eII<5jeQO/dATi^VW[u6eGRhs!;t@Ld]"4>g=6SZB3q'b
+T:h18>ADU\eH(d4J^oq6s&FR~>
+s!!!oJH16$JH1B(s!%JCrnIMNqnru#s6;)$E,`1dUFYa3M8T80!E<t9_uKf:_uU(TrkniT!W9k9
+!9M-*_-C*1Mi4**@)DWU!;lZ3%Z(/M.[Y0o[&p)RmJi$\r58TZrknuZbJ_?=b4*@LaSj$WbONLW
+_-C*1Mi4**@)DWU!;lZ3%Z(/M.[Y0o[&p)RmJi$\r58`^`5KX<rknuZbJ_?=b5T<Zans<F`!O7b
+=IG)*S5it6p;?t2qqM[;s6;)$E,`1dUFYa3M;%m_!!)lN!SISPh#.65g^2YE=db2+S5s=Vp=o\?
+!.ipgh#CB)~>
+s!!!oJH16$JH1B(s!%JCrn7ALqn`i#s6NXeQ']\4\5_nrMo#>.!@=<9_>jT8_>s_Rrk\]O!rTn8
+!9M'(^L1<9NK'N4AAIoU!;lZ1%Z:;Q;Ql@PbJ^nimf/3]rPAT?%fX<KY7\Xg7rIh5!>_^7_?$bO
+n\PUI?sK1\NLj9`_"PVFqtn5?MZ<$@YEbHt`4/e7s,4_l_?IIT_SUU^rk\iB&]2CTDZ7KQ(&e79
+!<<>e_?mtb>ap_4SloU>p;-h0qq;O;s6NXeQ']\4\5_nrMqIs]!!)lL!R_,JgAM$3g'QAD?(6h5
+Sm#p]p=]P9!.ijegAb0'~>
+s!!!oJH16$JH1B(s!%JCrm_#Fqn3Jns6,Gb_9$:p?&n7NL:mGt!>DX8]`8'3]`A/Hrk/??#Q278
+!9Lm#\mSa1M27U'@_;?I!;cT+%YarHNHN(ZAmJ]&li2^PrOi5T3<$SpDFV=Q)kHK3!=H14]`D\8
+n\#7??sB%ULmhIU]Cro<qYRr9L&^@rFhu13?!WKVs+\2b]`j]A]tGtTrk/JQ7_QJSSc6;,$3C80
+!<=##]a;8X>FC>(RTX+3p:UJ+qpc11s6,Gb_9$:p?&n7NL=?(N!!)lG!OWR;eboL.eHsZ:>a^G)
+RTaISp=02+!.i[`ec/X"~>
+s!!!oJH16$JH1B(s!%JCrnIMNqnru#s6M4sNb"?ZR4Ie,MSoA1q>gQ6!A'E5_u[UVr58R8jhqJA
+>ZI#DL6YhI_Y1nJqtn;AM#ZfkOH*k8ZC*64s,+_m_u[j#rPSi^`5Ka<nAG=MrPS`VbONLW_-C!)
+LPD'q?c)NT!;lZ3%Z(/O.Zf[$PHpT,nGeB`r58`]`5K[<rPSi^`5Ka<rkni\`T"fB_-C!)LPD'q
+?c)NT!<;rO%Z(/O.Zf[$PHpT,nGeC"r7h8PqV2,("52H9fje'ILPD'rBA*"6!M0:BglgIm<Ib~>
+s!!!oJH16$JH1B(s!%JCrn7ALqn`i#s6`dbVi7k!YZ1/mN5>G/q>gQ4!=QC9_?%+Rr5&F6jh_>=
+?WrbPLmM=T_"PVFqtn5?MZ<*BWi(f[`NW>3s,=em_?#iLrk\i!0>bRCVsqP("Mk#R!G!kR_?mta
+>*b#$QWmq7p;-h,qn`i#s6`dbVi7k!YZ1/mN5>J0"elsQ_F\qM_?GrQ_SR.frk\[=^uE3;^L(01
+M27L&@_h]S!<;rM%Z:;S;Q?XRYf3hGnc+R#r7V,NqUttt#hdo<f4J6QM27L'C"N(4!La">g611i
+<Ib~>
+s!!!oJH16$JH1B(s!%JCrm_#Fqn3Jns6GZL?*nf9PE,)2LV3Puq>gQ/!<p"4]`F*Cr4N(1jh1u3
+?s/\IK9KMK]Cro<qYRr9L&^IuZ!F_\3KoKks+e8c]`C-Crk/ImKY>&,Z1,F-!keNG!@ENj]a;8X
+=d+PlP?VM.p:UJ&qn3Jns6GZL?*nf9PE,)2LV3T!"\NLB]c<^E]`g9H]tFfYrk/=6]]-U2\mS[)
+KnGRn@_;?I!<;rH%YarKNNlcrG<(kImf/'kr7(cIqUGVJ*8/jKdUuaIKnGRoC=;h+!KdA5eWSJ_
+<Ib~>
+s!#5YrR:]Fs3prIqpYQFrR:cHqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:!7U?9!7UK=
+s3pcD!7QK!JH2JGs!%JCrnIMNqnru#s6j,jRsn_A>@-q$Mo5;-!!*#:!I[!-_uZnPr58R8k/7YD
+>Z6W3OHG*S;dR?8_uT]3`"%V'moi\[IUAsV?M"2T_u7LS`lnA""ie^'`66-h_u\'#rkni[bOWRZ
+_-BouIuoeDN`09$pV[(/qnru#s6j,jRsn_A>@-q$Mo5M3"i\['`5g"!`!+0'`5Kj<rkni\`T+lE
+_-BouIuoeDN`09$pV[(3qqM[;s6j,jRsn_A>@-q$Mqe0b#lrc9.@SW<^KiA[g].?Qg].?Qg].?I
+g^DeF</lBhOb&NlA_Hh5!M0:BglgIm<Ib~>
+s!#5YrR:]Fs3prIqpYQFrR:cHqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:!7U?9!7UK=
+s3pcD!7QK!JH2JGs!%JCrn7ALqn`i#s6t8YYapT]IspthNPYA+!!*#8!@rd$_?#6>r5&F6k/%M@
+?W`>>Ock?Y=CK#>_>sK1_@DJ'n9B5_SVXk,IJ!Q!_>V4O:M]sH"\<[N_?daB_?L+S_SWtoFRm9V
+^L(*'JWZ+JOB>r,pVHq-qn`i#s6t8YYapT]IspthNPYS1"^tEJ_BGWP_?EJN_SQSirk\[<\)Y=5
+^L(*'JWZ+JOB>r,pVHq1qq;O;s6t8YYapT]IspthNS46`#lr]57]=beZ8c.[g&M-Og&M-Og&M-G
+g'cME=cS&qP(Sj!C"N+5!La">g611i<Ib~>
+s!#5YrR:]Fs3prIqpYQFrR:cHqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:!7U?9!7UK=
+s3pcD!7QK!JH2JGs!%JCrm_#Fqn3Jns6ZVX5^^13Su;/ZLV3Ap!!*#3!>;7.]`C'<r4N(1k.M/6
+?WW/7NK/II=CSo:]`@p+]afbrmA-OCI(Me<Vt0kC]`#ME*h<5C"WX/J]`bq9]`nMK]tLELTCTZ'
+\mJNsIZ9A:NEBZ%pUpS'qn3Jns6ZVX5^^13Su;/ZLV3T!"XKAH]aq=G]`fCJ]tFQ[rk/=5\`:@2
+\mJNsIZ9A:NEBZ%pUpS,qpc11s6ZVX5^^13Su;/ZLt)@Q#lrN+?*DZ#T,*seeGoUJeGoUJeGoUB
+eI0f;=GqWfNdcsjC!ub+!KdA5eWSJ_<Ib~>
+s!$_.!7TU$!7UlH#1EPPdf9Bsq>^TG!7UlH!n..um/R.8r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me*m>;e*[29e+!D<e+itDdt%LM!2KVp,6([Bg]76K`"%V'n^T./
+LkoRnh=gl,_Y:tK!<0n@[g7N!W$H<Z_uKf3_uKf9_uKf9_uKf8`!sOf:kX(L:/HjpLJV<npr!10
+qnru#s7+ViE/9<\/`$.#Mo,G2!Q`C^`;dpY_u\'$rPS][rPS][rPT#d`5Ka?`PopAaRd=Z_-Bfi
+G_f*kMgC.T?GZET!;lZ3%Z(/TeLPTpLh&*npA^&frPSl[ai)->a8X$WaT'0ZbJsP"#04p,`5Ka:
+rknf\rPS][rPS][pV[NW>Yp)uLe^d)HA>='_>(qKs81R]M#["q.r^<#A1cX2s,5V/g^*u9gpT`^
+"!(n)n_=*ErS.AQrS.AQp=p,1@o7o(Legm+HA>@/g%a>'ScF>sP2-(;J,~>
+s!$_.!7TU$!7UlH#1EPPdf9Bsq>^TG!7UlH!n..um/R.8r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me*m>;e*[29e+!D<e+itDdt%LM!2KVp,6([Bg&V$I_@DJ'o%[0(
+USNQCj7iS5_"Y\G!<0h>U^<@%Q3sGc_>jT1_>jT7_>jT7_>jT6_@=7e<JGgW;H&O%Lf@cspqd%.
+qn`i#s74rDNh`D'<TEiRNPPM0!?7j6_?CgT_SQGRrPAO7rPAO7rPAj@_SR?r]r*OdVt7b7^L'uq
+HAYU!N-pF\@))KR!;lZ1%Z:;Wgf'6.UkDb.p]$5grPA^]S&3#TYl;KC)5k?g"K279"t_p>^S=l>
+rk\X8rPAO7rPAO7pVIBS?WDi,MGdB3I#(a0^\GYGs81L[MZ<8&;i[WKKN7(,s,G\/g'Ic5g6so)
+"X\KIn_*sCrRq5OrRq5Op=]u-AlaY4MGmK5I#(d9fD+&#RK.omP1oq9J,~>
+s!$_.!7TU$!7UlH#1EPPdf9Bsq>^TG!7UlH!n..um/R.8r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me*m>;e*[29e+!D<e+itDdt%LM!2KVp,6([BeH#IC]afbrnDfIL
+_T@Rnl1P(3]D&u=!<0Y9Bd9@_HO$hR]`8',]`8'2]`8'2]`8'1]a_P[<J,IM;Gr<qKiDHkpq6\(
+qn3Jns7#'-FMc.TNp66:LV*Mu!=c:4]`eeK]tFKOrOi12rOi12rOiL;]tFl$\s*j/Z1GX<\mJHi
+G)&snLj4VQ@(Q-H!;cT+%YarPj,A)sabPo@p&BfZrOi@EXhDCR[JmiC$aICY!jM[;"qk4J\<K4g
+rk/:3rOi12rOi12pUq$I?WD`%LJh$+G_K+)](ir=s81=VL&^Z&N-)qYLQ:Wls+o/%eHc0*eUJqK
+#r7S2eGoUJeGoUJeGoUCeIBr=<eGRN;cAKsKiMd6psfD-!.i[`ec/X"~>
+s!$_.!7TU$!7UlH!n..ur;ZiHqu?iJ!!(LH!!:ULe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH
+!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L:!!(L<!!(LD!!(K!!.b-G!<48C<W:bRqtn;A
+M#[)=f3BgV?/PMTs,=hh_uKf9_uub_!to/C`;BW2_uKf9_uKf9_uKf8`!p?SHuFO.>[0sSFF[&"
+pr!10qnru#s7>m7>Uq=1htm3LN5GP3!R&L^`!X],`5K[>bfdrCbl,H[bl,Hdbf%H=b08)NbJs.l%
+;/F`Dh(Jc>YK`kJ4s_Q_uT]3`"%V'oCUX>.k=o_qYL5N_YqCVbJqK=bJjJ!%a2i0`5^$FbJ_?@b
+KS/NrPS][rPS][rPS][pV[MR:4-u193b^qJolN:CA>^Is81R]M#[)=f3BgV?/PMTs,GaVg^S3uH
+uFO/A7J>cFF[),ptPnA!.ipgh#CB)~>
+s!$_.!7TU$!7UlH!n..ur;ZiHqu?iJ!!(LH!!:ULe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH
+!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L:!!(L<!!(LD!!(K!!.b-G!<48C<W:\Pqtn5?
+MZ<>AhKi+!IHC>%s,Onh_>jT7_?><,!ZQXf_YaE0_>jT7_>jT7_>jT6_@:3WIW:!:?scc`G(EM-
+pqd%.qn`i#s7H!@H;dajjneiRNkkV1!=?:8_?pR[_STmo!*-nQ!<'b7!<'b@!5cUS+T`d7#eKWE%
+;A^hEJ%(q?VuH!JPg:Z_>sK1_@DJ'o_%'e;cA,+qYL5P_#;+R$F[gg#/'rP%LBY__Ia5W<Pl=5$
+3_l0rPAO7rPAO7rPAO7pVIAR;LWV<:gdX-K6DfCD>:sJs81L[MZ<>AhKi+!IHC>%s,YgVg'r($I
+W:!;B4b%oG(EP7pt>b;!.ijegAb0'~>
+s!$_.!7TU$!7UlH!n..ur;ZiHqu?iJ!!(LH!!:ULe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH
+!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L:!!(L<!!(LD!!(K!!.b-G!<48C<W:MKqYRr9
+L&^`8k,+0!WU'BUs,"D_]`8'2]`_^T""0W;^&.m+]`8'2]`8'2]`8'1]a\[RH>S..?XHZ\EIL`#
+pq6\(qn3Jns75dDVN-\9lhUAVM7if#!<ft4]a=nQ]tHl?!0t72!<'S2!<'S;!56'u'*KkP"M+-;%
+;A^dD1>Ah?Vu>nISakU]`@p+]afbro(2"@NfL+)q>(&I]`#MI"Lu.Y"2"QG%Ks>U]g`5,Q+`_A"
+UHuOrOi12rOi12rOi12pUq#M;L320:g[R,J8p$7D"t[Ds81=VL&^`8k,+0!WU'BUs,,:LeI?OtH
+>S./AnFqkEILc-psfD-!.i[`ec/X"~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UlH!7UlH!7UoI!7UoIs3h#LdfBBrli7+9!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UE;!7UB:!Rh&Je,B@Ge,01Ge,9:G
+dfBHtq#CHE!<1II!!(LH!!C[MdfBBrrr<)K!<1IH!<(CH!!1OKrmQDuJH41"s!%JCrnIMNqnru#
+s7H!Xp\F[_r;HToNP`oX%5_g<G">cF[T?"DEb@<*_uT]3`"%V'o_%qPq>1!drVcbU_T]q-1hprP
+86NF1=%IOUB/]P'!;lZ3%Z(/Wp%J.UqYU3hrVqkobesrIC2\8d=gth@89])e2Yb2js81R]M#[,?
+p@nCZqu$Eks,PdVg^Q,UDg"][c-0HbGB.=TptPnA!.ipgh#CB)~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UlH!7UlH!7UoI!7UoIs3h#LdfBBrli7+9!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UE;!7UB:!Rh&Je,B@Ge,01Ge,9:G
+dfBHtq#CHE!<1II!!(LH!!C[MdfBBrrr<)K!<1IH!<(CH!!1OKrmQDuJH41"s!%JCrn7ALqn`i#
+s7Q*[q"ad`r;HToO2/uV%6A?GGYDAMZs$.JF(mc3_>sK1_@DJ'p%J.Tq>1!drVcbW^s'Y)3c/k]
+9O,!4>"j0^Bfu1-!;lZ1%Z:;Zp@n@XqYU3hrVqqobeafMD/jeo>d^qB9R(Vm4SZbns81L[MZ<AC
+p\=R\qu$Eks,bjVg'p,\EHk2fbKF<gG]RR^pt>b;!.ijegAb0'~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UlH!7UlH!7UoI!7UoIs3h#LdfBBrli7+9!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UE;!7UB:!Rh&Je,B@Ge,01Ge,9:G
+dfBHtq#CHE!<1II!!(LH!!C[MdfBBrrr<)K!<1IH!<(CH!!1OKrmQDuJH41"s!%JCrm_#Fqn3Jn
+s7>mUp\=R]r;HToMS%*G%6SBBF\H&EYZXVADeD9/]`@p+]afbroCV_Mq"agbrVcbR]?Iqt4DJ_U
+9O+g+=\EmUB0Q+(!;cT+%YarSo_%tRq>:*grVqbebe4HJC2J)e>d1G896G/c55;eks81=VL&^c:
+p%S7Wqu$Eks,5=LeI=ZVD08Q_a2VI[F`1nWpsfD-!.i[`ec/X"~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("F#df9Bsr;ZiHr;ZiHr;ciG"9?mNe'n9r!7U?9"4I5M
+e,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*d8:e*mA;e,B=Ie,'+F
+e,97He,B=Ie,B@Ie,KFGe,KCJe,B=Kdf@kq!!C[Me'n9r"4I8!e,B=Kdf@kq!!C[M!7UoI!7QK!
+JH44#s!%JCrnIMNqnrMunFuqaoT6u7`"$iS@7!ngTq@oN5@6Tr_th4Nqtn;4P485G!q_Slbet!4
+6"*)YUnOEP9g;uKFMmpm!;lZ3!KusHrrVhS_p$%/F$X5$;l$+ZSkVFV5'4^<_uTi7g]<]0p\t<e
+P2"49%Xp`Q6Wpt-Za!Cn?U'(qq:l"B!.ipgh#CB)~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("F#df9Bsr;ZiHr;ZiHr;ciG"9?mNe'n9r!7U?9"4I5M
+e,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*d8:e*mA;e,B=Ie,'+F
+e,97He,B=Ie,B@Ie,KFGe,KCJe,B=Kdf@kq!!C[Me'n9r"4I8!e,B=Kdf@kq!!C[M!7UoI!7QK!
+JH44#s!%JCrn7ALqn`Atnb<%bood/8_@C`YA4K[qTUhTK6XW9)_>1qJqtn52PO\DI!qh_mbeaj5
+7V#"iUS+0J:IAMWG/=!k!;lZ1!L*'JrrVkV_9Bb+G"-"4<hl=YS52L[6[$<A_>sW5g&[K/p\t<f
+PhF:7%Y7,\86r^3Z*..q?poV"q:Yk<!.ijegAb0'~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("F#df9Bsr;ZiHr;ZiHr;ciG"9?mNe'n9r!7U?9"4I5M
+e,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*d8:e*mA;e,B=Ie,'+F
+e,97He,B=Ie,B@Ie,KFGe,KCJe,B=Kdf@kq!!C[Me'n9r"4I8!e,B=Kdf@kq!!C[M!7UoI!7QK!
+JH44#s!%JCrm_#Fqn3#knFuqaoT$T.]af0S@7F:iS=,a?6XN6(]_T5@qYRr,O7;oD!q_Mcbe4L/
+7U\beT:D=::IAJWFhIO`!;cT+!KZaErrVhQ]Ze&!F[fe/<hGnMQqp(V7!60<]`A*0eH(g%p\t<e
+OOVM)%Y.&X7pNC(XfGGi?U]Lpq:,M.!.i[`ec/X"~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OI!!(LH!!(LI!!(LC!!(LF!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L<!!(LH!!:UL!;t=E!!(LI
+!!(LH!!(LC!!(LG!!(LH!!:ULe,97Jdf@kq!!1OKqpYQF!7QK!JH4'ts!%JCrnIMNqnrNAPP9k6
+PHrBM%`<6A@AolgQ^F:E0lOnGq8<:1qnrNAPP9k6PHrBM%`<6A@AolgQ^F:E0lOnGq8<:1qnrNA
+PP9k6PHrBM%`<6A@AolgQ^F:E0lOnGq8<:5qqM4kQM619Q,Cf#%bl=eC:ppUWN34013qR-q:l"B
+!.ipgh#CB)~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OI!!(LH!!(LI!!(LC!!(LF!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L<!!(LH!!:UL!;t=E!!(LI
+!!(LH!!(LC!!(LG!!(LH!!:ULe,97Jdf@kq!!1OKqpYQF!7QK!JH4'ts!%JCrn7ALqn`B>Q1p.:
+Q*JNL%`*0GA#>lcQ'[qC2K?LJq8*./qn`B>Q1p.:Q*JNL%`*0GA#>lcQ'[qC2K?LJq8*./qn`B>
+Q1p.:Q*JNL%`*0GA#>lcQ'[qC2K?LJq8*.3qq;(gR.lI=Qbpr"%bZ7kCq?sRW2Zq.2gj61q:Yk<
+!.ijegAb0'~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OI!!(LH!!(LI!!(LC!!(LF!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L<!!(LH!!:UL!;t=E!!(LI
+!!(LH!!(LC!!(LG!!(LH!!:ULe,97Jdf@kq!!1OKqpYQF!7QK!JH4'ts!%JCrm_#Fqn3$4OS=G0
+O0-U=%_QaB@A96UOcu)63,lIAq7Qe)qn3$4OS=G0O0-U=%_QaB@A96UOcu)63,lIAq7Qe)qn3$4
+OS=G0O0-U=%_QaB@A96UOcu)63,lIAq7Qe.qpb_^PP9b3P.o,i%b,hfC::=DUnt)"3I9-'q:,M.
+!.i[`ec/X"~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LG!!(LH!!(LI!!(LC!!(LF!!(L<!!(LG!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L<!!(LH!!:ULe,97He,97H
+e,B=Ie,97He+`nCe,01Ge,97Jdf@kq!!:ULe,97Jdf@kn!!(K!!.b-t!<48C<W:bRqmOEO_nj'u
+[Bd$B[CNue_YD%LqmOEO_nj'u[Bd$B[CNue_YD%LqmOEO_nj'u[Bd$B[CNue_YD%Ls0g\kgY(-)
+bf@`Dbg=kmgA'G(ScF>sP2-(;J,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LG!!(LH!!(LI!!(LC!!(LF!!(L<!!(LG!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L<!!(LH!!:ULe,97He,97H
+e,B=Ie,97He+`nCe,01Ge,97Jdf@kq!!:ULe,97Jdf@kn!!(K!!.b-t!<48C<W:\PqmO?M_8!Xm
+['6^;[(!Z^_"bbHqmO?M_8!Xm['6^;[(!Z^_"bbHqmO?M_8!Xm['6^;[(!Z^_"bbHs0gVig"4^!
+b/M<<b0JGef_F/$RK.omP1oq9J,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LG!!(LH!!(LI!!(LC!!(LF!!(L<!!(LG!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L<!!(LH!!:ULe,97He,97H
+e,B=Ie,97He+`nCe,01Ge,97Jdf@kq!!:ULe,97Jdf@kn!!(K!!.b-t!<48C<W:MKqR4'G]XkSY
+YH+\(YHt[K]_K/?qR4'G]XkSYYH+\(YHt[K]_K/?qR4'G]XkSYYH+\(YHt[K]_K/?s0gGdeC)Xb
+`PK=*`Q?BQe+hGoOT9s_P1BS4J,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LE!!C[M!7UoI!7U]C"4I5Me,97He+*J=e+s%H
+df9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L7!!(L=!!(LH!!:UL
+e,B@Ie,97He,B=Ie,B@Ie+`nCe,01Ge,B@IdfBHtr;ZoJ!7UlH!n..ur;ZrK!!(K!!.b-t!<48C
+<W:bRqk1k-qk1k-qk1k-s.J-JScF>sP2-(;J,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LE!!C[M!7UoI!7U]C"4I5Me,97He+*J=e+s%H
+df9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L7!!(L=!!(LH!!:UL
+e,B@Ie,97He,B=Ie,B@Ie+`nCe,01Ge,B@IdfBHtr;ZoJ!7UlH!n..ur;ZrK!!(K!!.b-t!<48C
+<W:\Pqk1e+qk1e+qk1e+s.J'HRK.omP1oq9J,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LE!!C[M!7UoI!7U]C"4I5Me,97He+*J=e+s%H
+df9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L7!!(L=!!(LH!!:UL
+e,B@Ie,97He,B=Ie,B@Ie+`nCe,01Ge,B@IdfBHtr;ZoJ!7UlH!n..ur;ZrK!!(K!!.b-t!<48C
+<W:MKqOkM%qOkM%qOkM%s.ImCOT9s_P1BS4J,~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYNEs3poH!7UfFrmUfGrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3p96!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp](<CqZ-WE!s$dMe,97J
+df@kq!!:UL!<(CG!!(K!!.b-t!<48C<Ip`mT%KV7s.J-JScF>5P+M\RJ,~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYNEs3poH!7UfFrmUfGrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3p96!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp](<CqZ-WE!s$dMe,97J
+df@kq!!:UL!<(CG!!(K!!.b-t!<48C<IpTiRb4&/s.J'HRK.o-P+)DNJ,~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYNEs3poH!7UfFrmUfGrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3p96!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp](<CqZ-WE!s$dMe,97J
+df@kq!!:UL!<(CG!!(K!!.b-t!<48C<Ip9`Ok>crs.ImCOT9rpP*,cEJ,~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8nr*YI<E4P~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8nqdGF<E4P~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8nq$r><E4P~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^iCo`#!nqc-XH~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^i@o`#!nqc-XH~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^i9o`#!nqGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!#5YrR:]Fs3poHrR:`GrR:`GrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7U?9!7UK=
+s3pcD!7U<8!7UfF!7SLZ!7RYB!7UfF!7U<8!7TR#!7T[&s3pN=s!%JCJcC<$JcC<$Q2^lDs7Y4N
+ScJXf<Ib~>
+s!#5YrR:]Fs3poHrR:`GrR:`GrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7U?9!7UK=
+s3pcD!7U<8!7UfF!7SLZ!7RYB!7UfF!7U<8!7TR#!7T[&s3pN=s!%JCJcC<$JcC<$Q2^lAs7Y.L
+RK34b<Ib~>
+s!#5YrR:]Fs3poHrR:`GrR:`GrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7U?9!7UK=
+s3pcD!7U<8!7UfF!7SLZ!7RYB!7UfF!7U<8!7TR#!7T[&s3pN=s!%JCJcC<$JcC<$Q2^l:s7XtG
+OT>5X<Ib~>
+s!$_.!7TU$!7UlH$.AkSdf9Bs!!(LH!!:ULe,97Jdf@kq!!(L=!!(LH!!^mP!7LoJe*-i7df9Bs
+n,NR>!!(LB!!C[M!7UE;"4I5Me+WhEdf9Bse,TKtmJm79nGiR<q#CEDm/R.8qZ$WFkPtV3kPtV3
+mJm79p](<Cp&G*AlMpq6cN!soqZ$WFm/R.8r;ZiHkPtV3pAb3BirB).qZ$`I!!(L>!<48C<It1$
+s+13$s-<TbN;rk3!n<C_rS.OI!;fbrJ,~>
+s!$_.!7TU$!7UlH$.AkSdf9Bs!!(LH!!:ULe,97Jdf@kq!!(L=!!(LH!!^mP!7LoJe*-i7df9Bs
+n,NR>!!(LB!!C[M!7UE;"4I5Me+WhEdf9Bse,TKtmJm79nGiR<q#CEDm/R.8qZ$WFkPtV3kPtV3
+mJm79p](<Cp&G*AlMpq6cN!soqZ$WFm/R.8r;ZiHkPtV3pAb3BirB).qZ$`I!!(L>!<48C<It1$
+s+13$s-<TbM?!P.!n*7[rRqCC!;fbrJ,~>
+s!$_.!7TU$!7UlH$.AkSdf9Bs!!(LH!!:ULe,97Jdf@kq!!(L=!!(LH!!^mP!7LoJe*-i7df9Bs
+n,NR>!!(LB!!C[M!7UE;"4I5Me+WhEdf9Bse,TKtmJm79nGiR<q#CEDm/R.8qZ$WFkPtV3kPtV3
+mJm79p](<Cp&G*AlMpq6cN!soqZ$WFm/R.8r;ZiHkPtV3pAb3BirB).qZ$`I!!(L>!<48C<It1$
+s+13$s-<TbK)bf"!mQhOrRD%5!;]\qJ,~>
+s!$_.!7TU$!7UlH!n..ur;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3@:nGiR<q#CEDm/R.8qZ$WFc2[jn
+q#CEDpAb3Bli7%7\GuWYq>^NEmJm79iW&u-p](<CiW&u-qu?`Gr;ZiHoDnn8s&FXMJcC<$JcD#8
+!K@'Xg]Z8fFckGXg]X2Kqc-XH~>
+s!$_.!7TU$!7UlH!n..ur;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3@:nGiR<q#CEDm/R.8qZ$WFc2[jn
+q#CEDpAb3Bli7%7\GuWYq>^NEmJm79iW&u-p](<CiW&u-qu?`Gr;ZiHoDnn8s&FXMJcC<$JcD#8
+!K$jUg'#ubFckAVg'!iEqc-XH~>
+s!$_.!7TU$!7UlH!n..ur;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3@:nGiR<q#CEDm/R.8qZ$WFc2[jn
+q#CEDpAb3Bli7%7\GuWYq>^NEmJm79iW&u-p](<CiW&u-qu?`Gr;ZiHoDnn8s&FXMJcC<$JcD#8
+!J:@NeH=6WFccRP"H`]\<E4P~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UlH!n..ur;ZiHqZ$]H!7UoIs3p?8!n..ur;ZiHlMpq6
+r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3C;!<1IH!<(CE!!(LH!<1FJ
+!7U]CrR:`GrmLrLdf9CIdfTU!!!)uHrr<)K!<1I@!<:OI!!1OKrmUlI!Rh&Je,KCJe,97IdfB?q
+quH`Fp](<Cq#LHDr;cfFrrE#Hr;cfFrr<)K!<1IG!<:OI!!1OKrmUiHrmLlJe+`qAe,KCKdfBBr
+oDem?rW)rH!s$dM!<(CG!!(LI!!(LG!!(LH!<:OI!!1OKrmUlI!Rh&Je,KCJe,97IdfB?qq>^NE
+rW)oGrVurIrW!#K!!)uHrr<)K!<1II!<(CG!!(LH!!(L?!<48C<It1$s+13$s-<TfN;q\gg6DSZ
+#bB`*gn"NC<E4P~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UlH!n..ur;ZiHqZ$]H!7UoIs3p?8!n..ur;ZiHlMpq6
+r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3C;!<1IH!<(CE!!(LH!<1FJ
+!7U]CrR:`GrmLrLdf9CIdfTU!!!)uHrr<)K!<1I@!<:OI!!1OKrmUlI!Rh&Je,KCJe,97IdfB?q
+quH`Fp](<Cq#LHDr;cfFrrE#Hr;cfFrr<)K!<1IG!<:OI!!1OKrmUiHrmLlJe+`qAe,KCKdfBBr
+oDem?rW)rH!s$dM!<(CG!!(LI!!(LG!!(LH!<:OI!!1OKrmUlI!Rh&Je,KCJe,97IdfB?qq>^NE
+rW)oGrVurIrW!#K!!)uHrr<)K!<1II!<(CG!!(LH!!(L?!<48C<It1$s+13$s-<TfM>u;`fTcAX
+#bBZ&g6r$=<E4P~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UlH!n..ur;ZiHqZ$]H!7UoIs3p?8!n..ur;ZiHlMpq6
+r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3C;!<1IH!<(CE!!(LH!<1FJ
+!7U]CrR:`GrmLrLdf9CIdfTU!!!)uHrr<)K!<1I@!<:OI!!1OKrmUlI!Rh&Je,KCJe,97IdfB?q
+quH`Fp](<Cq#LHDr;cfFrrE#Hr;cfFrr<)K!<1IG!<:OI!!1OKrmUiHrmLlJe+`qAe,KCKdfBBr
+oDem?rW)rH!s$dM!<(CG!!(LI!!(LG!!(LH!<:OI!!1OKrmUlI!Rh&Je,KCJe,97IdfB?qq>^NE
+rW)oGrVurIrW!#K!!)uHrr<)K!<1II!<(CG!!(LH!!(L?!<48C<It1$s+13$s-<TfK)aBOdus]Q
+!1a&="H`]\<E4P~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("F#df9Bsr;ZoJ!!)uHqZ$WFrW)rH!<CU:!!C[M!7UlH
+!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7UE;s3prI!7UfF!7UlH
+!7UoI!7UoIs3puJr6tNC!n..urW)uI!<CUJ!<:LK!7UlH"4I8!e,B=Kdf9CGe,97He,B@Ie,B=L
+df@kGrW!#K!7UlH"4I5Me+itDe+WhBe+`nCe,B=Ie,97Kdf9Bsqu?`Gr;ZrK!7TEr!!(LH!!(LI
+!<:OI!!:ULe,B=Ie+`nCe,97Kdf@kGrVurIp&G*ArVurIrW)uI!<CUI!!C[M!7UoI!7UlH!7UfF
+!7UoIs3prI"4I8!e,B=Kdf@kq!!C[M!7U`D!7UoI!7UlH"4I5Me,B=Kdf@kq!!C[Me'n9r"4I5M
+e,01Ge,97He+<Y?,6(Yos+13$s+138rre;\gt\S#FU+o$gn"NC<E4P~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("F#df9Bsr;ZoJ!!)uHqZ$WFrW)rH!<CU:!!C[M!7UlH
+!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7UE;s3prI!7UfF!7UlH
+!7UoI!7UoIs3puJr6tNC!n..urW)uI!<CUJ!<:LK!7UlH"4I8!e,B=Kdf9CGe,97He,B@Ie,B=L
+df@kGrW!#K!7UlH"4I5Me+itDe+WhBe+`nCe,B=Ie,97Kdf9Bsqu?`Gr;ZrK!7TEr!!(LH!!(LI
+!<:OI!!:ULe,B=Ie+`nCe,97Kdf@kGrVurIp&G*ArVurIrW)uI!<CUI!!C[M!7UoI!7UlH!7UfF
+!7UoIs3prI"4I8!e,B=Kdf@kq!!C[M!7U`D!7UoI!7UlH"4I5Me,B=Kdf@kq!!C[Me'n9r"4I5M
+e,01Ge,97He+<Y?,6(Yos+13$s+138rre2Yg=i1sFU+o"g6r$=<E4P~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("F#df9Bsr;ZoJ!!)uHqZ$WFrW)rH!<CU:!!C[M!7UlH
+!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7UE;s3prI!7UfF!7UlH
+!7UoI!7UoIs3puJr6tNC!n..urW)uI!<CUJ!<:LK!7UlH"4I8!e,B=Kdf9CGe,97He,B@Ie,B=L
+df@kGrW!#K!7UlH"4I5Me+itDe+WhBe+`nCe,B=Ie,97Kdf9Bsqu?`Gr;ZrK!7TEr!!(LH!!(LI
+!<:OI!!:ULe,B=Ie+`nCe,97Kdf@kGrVurIp&G*ArVurIrW)uI!<CUI!!C[M!7UoI!7UlH!7UfF
+!7UoIs3prI"4I8!e,B=Kdf@kq!!C[M!7U`D!7UoI!7UlH"4I5Me,B=Kdf@kq!!C[Me'n9r"4I5M
+e,01Ge,97He+<Y?,6(Yos+13$s+138rrdrRe^^5gFU+nreWBk.<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OI!!(LH!!:ULe,97He,B@Ie+itDe*mA;e,B=Ie,97H
+e*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'\3re+!D<e,97Jdf9CGe,97H
+e,B=Ie,97He+`q@dfBHtr;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UWA!7UoI!7UlH!n..ur;ZoJ!7UlH
+"4I5Me*[29e+`nCe,9:He,01Ge,04CdfBHtr;ZiHr;ZiHrVurIr;ZoJ!7UoI!7U]C!7UlH!n..u
+r;ZiHpAb3Br;ZiHr;ZlI!;k7F!!(LI!!(LI!!(LE!!(LI!!(LH!!:ULe,97Jdf@kq!!C[M!7UcE
+!7UlHqpYQF!7UoI!Rh&GdfBHtr;ZrK!!(LG!!(LH!!(L?!<48C<It1$s+13$s-<TbN;rn4!:g!e
+#4^K?!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OI!!(LH!!:ULe,97He,B@Ie+itDe*mA;e,B=Ie,97H
+e*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'\3re+!D<e,97Jdf9CGe,97H
+e,B=Ie,97He+`q@dfBHtr;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UWA!7UoI!7UlH!n..ur;ZoJ!7UlH
+"4I5Me*[29e+`nCe,9:He,01Ge,04CdfBHtr;ZiHr;ZiHrVurIr;ZoJ!7UoI!7U]C!7UlH!n..u
+r;ZiHpAb3Br;ZiHr;ZlI!;k7F!!(LI!!(LI!!(LE!!(LI!!(LH!!:ULe,97Jdf@kq!!C[M!7UcE
+!7UlHqpYQF!7UoI!Rh&GdfBHtr;ZrK!!(LG!!(LH!!(L?!<48C<It1$s+13$s-<TbM?!S/!:]pd
+#4U?8!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OI!!(LH!!:ULe,97He,B@Ie+itDe*mA;e,B=Ie,97H
+e*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'\3re+!D<e,97Jdf9CGe,97H
+e,B=Ie,97He+`q@dfBHtr;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UWA!7UoI!7UlH!n..ur;ZoJ!7UlH
+"4I5Me*[29e+`nCe,9:He,01Ge,04CdfBHtr;ZiHr;ZiHrVurIr;ZoJ!7UoI!7U]C!7UlH!n..u
+r;ZiHpAb3Br;ZiHr;ZlI!;k7F!!(LI!!(LI!!(LE!!(LI!!(LH!!:ULe,97Jdf@kq!!C[M!7UcE
+!7UlHqpYQF!7UoI!Rh&GdfBHtr;ZrK!!(LG!!(LH!!(L?!<48C<It1$s+13$s-<TbK)bi#!:Kdb
+#4C$(!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LG!!(LH!!:ULe,97Kdf9BspAb3BnGiR<qu?`Gr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHdJs9rnGiR<r;ZoJ!7UlH!7UlH
+!7UoI!7UlH!7U`D!7UlH!n..ur;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UWA!7UoI!7UlH"4I8!e,B=K
+df@kq!!C[M!7U?9!7U]C!7UfFs3prI!7UiG!7UfF!7UlH!7UlH!7UoI!7UlH!n.,LrmUTA!7UlH
+!n..ur;ZiHpAb3Br;ZiHr;ZoJ!7U`D!n..ur;ZiHq>^NErVurIr;ZrK!7TEr!!:ULe,97Kdf9Bs
+q>^NEr;ZiHq#CTI!7LoJe,'+Fe,97Kdf9Bsqu?`Gr;ZiHoDnn8s&FXMJcC<$JcD#8!K@'Pg]X2K
+qc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LG!!(LH!!:ULe,97Kdf9BspAb3BnGiR<qu?`Gr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHdJs9rnGiR<r;ZoJ!7UlH!7UlH
+!7UoI!7UlH!7U`D!7UlH!n..ur;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UWA!7UoI!7UlH"4I8!e,B=K
+df@kq!!C[M!7U?9!7U]C!7UfFs3prI!7UiG!7UfF!7UlH!7UlH!7UoI!7UlH!n.,LrmUTA!7UlH
+!n..ur;ZiHpAb3Br;ZiHr;ZoJ!7U`D!n..ur;ZiHq>^NErVurIr;ZrK!7TEr!!:ULe,97Kdf9Bs
+q>^NEr;ZiHq#CTI!7LoJe,'+Fe,97Kdf9Bsqu?`Gr;ZiHoDnn8s&FXMJcC<$JcD#8!K$jMg'!iE
+qc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LG!!(LH!!:ULe,97Kdf9BspAb3BnGiR<qu?`Gr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHdJs9rnGiR<r;ZoJ!7UlH!7UlH
+!7UoI!7UlH!7U`D!7UlH!n..ur;ZoJ!7UlH!n..ur;ZoJ!7UlH!7UWA!7UoI!7UlH"4I8!e,B=K
+df@kq!!C[M!7U?9!7U]C!7UfFs3prI!7UiG!7UfF!7UlH!7UlH!7UoI!7UlH!n.,LrmUTA!7UlH
+!n..ur;ZiHpAb3Br;ZiHr;ZoJ!7U`D!n..ur;ZiHq>^NErVurIr;ZrK!7TEr!!:ULe,97Kdf9Bs
+q>^NEr;ZiHq#CTI!7LoJe,'+Fe,97Kdf9Bsqu?`Gr;ZiHoDnn8s&FXMJcC<$JcD#8!J:@FeHD!7
+qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LE!!^mP!7LoJe,97Jdf@kk!!(L<!!(LE!!C[M
+!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me'J'pe+*J=e,97Jdf@kr
+!<:OH!!(LI!!(LI!<:OD!!(LI!<:LK!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!7UWA!7UoI!7UlH
+"4I8!!<1II!!(LI!<:OJ!!(LI!!(LH!!(LB!!(LC!!(LI!!(LH!!C[M!7UoI!n..ur;ZoJ!7UlH
+!7UlH!7UoI!7UlH!n..uoDem?r;ZoJ!7UlH!7U]C!7UiG!7UoIs3guKe,97He,B=Kdf@kr!!(LD
+!!(LI!!(LH!!C[MdfBBrrr<&JrW)uIrr<&JrW!&L!!(LG!!(LH!!(LI!!UgOdf9Bsr;ZoJ!7UlH
+"4I5Me,B=Odf9Bs!!(L>!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LE!!^mP!7LoJe,97Jdf@kk!!(L<!!(LE!!C[M
+!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me'J'pe+*J=e,97Jdf@kr
+!<:OH!!(LI!!(LI!<:OD!!(LI!<:LK!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!7UWA!7UoI!7UlH
+"4I8!!<1II!!(LI!<:OJ!!(LI!!(LH!!(LB!!(LC!!(LI!!(LH!!C[M!7UoI!n..ur;ZoJ!7UlH
+!7UlH!7UoI!7UlH!n..uoDem?r;ZoJ!7UlH!7U]C!7UiG!7UoIs3guKe,97He,B=Kdf@kr!!(LD
+!!(LI!!(LH!!C[MdfBBrrr<&JrW)uIrr<&JrW!&L!!(LG!!(LH!!(LI!!UgOdf9Bsr;ZoJ!7UlH
+"4I5Me,B=Odf9Bs!!(L>!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LE!!^mP!7LoJe,97Jdf@kk!!(L<!!(LE!!C[M
+!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me'J'pe+*J=e,97Jdf@kr
+!<:OH!!(LI!!(LI!<:OD!!(LI!<:LK!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!7UWA!7UoI!7UlH
+"4I8!!<1II!!(LI!<:OJ!!(LI!!(LH!!(LB!!(LC!!(LI!!(LH!!C[M!7UoI!n..ur;ZoJ!7UlH
+!7UlH!7UoI!7UlH!n..uoDem?r;ZoJ!7UlH!7U]C!7UiG!7UoIs3guKe,97He,B=Kdf@kr!!(LD
+!!(LI!!(LH!!C[MdfBBrrr<&JrW)uIrr<&JrW!&L!!(LG!!(LH!!(LI!!UgOdf9Bsr;ZoJ!7UlH
+"4I5Me,B=Odf9Bs!!(L>!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYNEs3poHrR:cHqpYQFrmU?:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3o9o!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp]1<B!s$dM!<1FL!7LoJ
+rmLrLdf9CHe,KCJe,97He+`q@dfBHtr;ZoJ!7UcErmLlJe,B@He,9:Ge+`q?e,KFGe,KFHe,9:G
+e,B@Ge,KCJe,97Jdf9CGdfBHtr;ZoJ!!)uHpAk0@rr<&Jr;ZiHp](<CqZ-WE!s$dM!<(CE!!(LH
+!!(LF!;t:H!7UlH!n..uq>gND!<CUJ!<1IH!!(LF!<(CE!!(LH!<(CH!!(LH!!(LI!<1IG!<:O=
+!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYNEs3poHrR:cHqpYQFrmU?:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3o9o!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp]1<B!s$dM!<1FL!7LoJ
+rmLrLdf9CHe,KCJe,97He+`q@dfBHtr;ZoJ!7UcErmLlJe,B@He,9:Ge+`q?e,KFGe,KFHe,9:G
+e,B@Ge,KCJe,97Jdf9CGdfBHtr;ZoJ!!)uHpAk0@rr<&Jr;ZiHp](<CqZ-WE!s$dM!<(CE!!(LH
+!!(LF!;t:H!7UlH!n..uq>gND!<CUJ!<1IH!!(LF!<(CE!!(LH!<(CH!!(LH!!(LI!<1IG!<:O=
+!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYNEs3poHrR:cHqpYQFrmU?:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3o9o!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp]1<B!s$dM!<1FL!7LoJ
+rmLrLdf9CHe,KCJe,97He+`q@dfBHtr;ZoJ!7UcErmLlJe,B@He,9:Ge+`q?e,KFGe,KFHe,9:G
+e,B@Ge,KCJe,97Jdf9CGdfBHtr;ZoJ!!)uHpAk0@rr<&Jr;ZiHp](<CqZ-WE!s$dM!<(CE!!(LH
+!!(LF!;t:H!7UlH!n..uq>gND!<CUJ!<1IH!!(LF!<(CE!!(LH!<(CH!!(LH!!(LI!<1IG!<:O=
+!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbScAc>l2Uh5^An8_r;ZiHZN(!SYQ4\Is&G'Yr;b1Dr;`Dgr;_EKJcDeN
+!K@'OSc\ui<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbScAc>l2Uh5^An8_r;ZiHZN(!SYQ4\Is&G'Yr;b1Dr;`Dgr;_EKJcDeN
+!K$jLRKEQe<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbScAc>l2Uh5^An8_r;ZiHZN(!SYQ4\Is&G'Yr;b1Dr;`Dgr;_EKJcDeN
+!J:@EOTPU[<E4P~>
+s!!!oJH1E)!7ReFrR8%P!7S.Ps!%JCNW8qWci<qDScAWgq>Urq_NSk//f4ot"rB11XSdYLJcEUe
+!0$LL!rGttJ,~>
+s!!!oJH1E)!7ReFrR8%P!7S.Ps!%JCNW8qWci<qDScAWgq>Uof\;Orc.2*!g#TGsK^4H<8s2"^8
+M=U]Kqc-XH~>
+s!!!oJH1E)!7ReFrR8%P!7S.Ps!%JCNW8qWci<qDScAWgq>Uo]YCg.E,nL:_$Qqric[l+Is2"^8
+K(AsDqGgOG~>
+s!!!oJH16$JH1B(s!%JCNW8qWci<qDScAWgq>^$d!>(3@s+13frrA#MrrW8u<E4P~>
+s!!!oJH16$JH1B(s!%JCNW8qWci<qDScAWgq>^$d!@+Xrs+13frr@oJrrW8u<E4P~>
+s!!!oJH16$JH1B(s!%JCNW8qWci<qDScAWgq>^$d!BeSWs+13frr@ZCrrW8t<E4P~>
+s!!!oJH16$JH1B(s!%JCNW8qWci<qDScAWgq>]sb!B0_(s+13hrrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCNW8qWci<qDScAWgq>]sb!FbtYs+13hrrIuVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCNW8qWci<qDScAWgq>]sb!02X1JcE[g!J:@FeHD!7qGgOG~>
+s!%CA!7UiGs3pfE!7TEtrR:]Fs3poHrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@
+s3oEs!7U?9!7UK=s3pcD!7U<8!7UfF!7S[_s3lf)!7U!/!7Tm,!7U'1!7UQ?s!%JCNW8qWci<qD
+ScAWgq>^Hp$3EAC[c6rXm`ghKr;ZgLJcC<$`W#sts7Y4NScJXf<Ib~>
+s!%CA!7UiGs3pfE!7TEtrR:]Fs3poHrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@
+s3oEs!7U?9!7UK=s3pcD!7U<8!7UfF!7S[_s3lf)!7U!/!7Tm,!7U'1!7UQ?s!%JCNW8qWci<qD
+ScAWgq>^Hp$3a+`^ukCglGA&hr;Zh-JcC<$`W#sqs7Y.LRK34b<Ib~>
+s!%CA!7UiGs3pfE!7TEtrR:]Fs3poHrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@
+s3oEs!7U?9!7UK=s3pcD!7U<8!7UfF!7S[_s3lf)!7U!/!7Tm,!7U'1!7UQ?s!%JCNW8qWci<qD
+ScAWgq>^Hp$4pC.b3Ag"j1&t6r;ZhpJcC<$`W#sjs7XtGOT>5X<Ib~>
+s!%FBs3poH"4I5Me,04Ge("Eue,97Qdf9Bs!!(IJ!7UlH!7UfF!7UfF!7UK=!7UlH#1EPPdf9Bs
+kl:h7!!(L;!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(L9!!(L<!!(LD!!(L8!!(LF!!(Ks
+!!(L8!!(LF!!(LA!!(L6!!(K\!!(LD!!(L/!!(L>!!(L;!!(L1!!(L?!<48C<It2%s8;q[rrO:!
+kP5&XrfmB^!<J(/s+13irrJ)Yp=oeB!;fbrJ,~>
+s!%FBs3poH"4I5Me,04Ge("Eue,97Qdf9Bs!!(IJ!7UlH!7UfF!7UfF!7UK=!7UlH#1EPPdf9Bs
+kl:h7!!(L;!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(L9!!(L<!!(LD!!(L8!!(LF!!(Ks
+!!(L8!!(LF!!(LA!!(L6!!(K\!!(LD!!(L/!!(L>!!(L;!!(L1!!(L?!<48C<It2%s8;q[rrP'K
+pA"Xgqe?$0!<Ll)s+13irrIuVp=]Y<!;fbrJ,~>
+s!%FBs3poH"4I5Me,04Ge("Eue,97Qdf9Bs!!(IJ!7UlH!7UfF!7UfF!7UK=!7UlH#1EPPdf9Bs
+kl:h7!!(L;!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(L9!!(L<!!(LD!!(L8!!(LF!!(Ks
+!!(L8!!(LF!!(LA!!(L6!!(K\!!(LD!!(L/!!(L>!!(L;!!(L1!!(L?!<48C<It2%s8;q[rrPiu
+r:p9mmQ(7H!<MY?s+13irrI`Op=0;.!;]\qJ,~>
+s!%IC!n..urVurIr;ZiHrW!#K!7THu!7UlH!n..ur;ZoJ!7UlH!7UiG!7UfF!7UH<!7UlH!n..u
+r;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3@:nGiR<q#CED
+m/R.8qZ$WFbQ%XloDem?mf3@:S,`Q<j8]2/o)Jd>nGiR<jo>D1o)Se7s&FXMfDkdLKDtq*rVup;
+JcC<$`r?'us7Y4NScJXf<Ib~>
+s!%IC!n..urVurIr;ZiHrW!#K!7THu!7UlH!n..ur;ZoJ!7UlH!7UiG!7UfF!7UH<!7UlH!n..u
+r;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3@:nGiR<q#CED
+m/R.8qZ$WFbQ%XloDem?mf3@:S,`Q<j8]2/o)Jd>nGiR<jo>D1o)Se7s&FXMfDkdLKDtp5rVup_
+JcC<$`r?'rs7Y.LRK34b<Ib~>
+s!%IC!n..urVurIr;ZiHrW!#K!7THu!7UlH!n..ur;ZoJ!7UlH!7UiG!7UfF!7UH<!7UlH!n..u
+r;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHe,TKtmf3@:nGiR<q#CED
+m/R.8qZ$WFbQ%XloDem?mf3@:S,`Q<j8]2/o)Jd>nGiR<jo>D1o)Se7s&FXMfDkdLK`;)P)#aL8
+WIb)#s2P'>K)bPp"H`]\<E4P~>
+s!%CA!7UoI!7UlH#1EPPdf9Bsci=-r!7UlH!n..ur;ZiHr;ZiHqZ$WFlMq"8!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7UB:!Rh&Je,B@Ge,01Ge,9:GdfBHt
+p]19ArW)rH!s$dM!<1FL!7LoJrR:cH!Rh&Je+Wk@e,B@Ge,KCKdfBBrr;clHquH`Fo`,!@quHcG
+r;cfFrrE#Hr;cfFrr<)K!<1IG!<:OI!!1OKrmUiHrmLlJe+`qAe,KCKdfBBrpAk0@rW)oGrr<)K
+!<1IG!<:OH!<1FJ!7U]CrR:`GrR:`GrR:cH!7UoI!7UoIrR:cHrR:?<!7UoI!7UoI!n.,LrR:cH
+!Rh&Je,'+Jdf9Bs!<1ID!<48C<It2%s8;qMrrDQf!!!7Ts+13irrJ)Yp=oeB!;fbrJ,~>
+s!%CA!7UoI!7UlH#1EPPdf9Bsci=-r!7UlH!n..ur;ZiHr;ZiHqZ$WFlMq"8!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7UB:!Rh&Je,B@Ge,01Ge,9:GdfBHt
+p]19ArW)rH!s$dM!<1FL!7LoJrR:cH!Rh&Je+Wk@e,B@Ge,KCKdfBBrr;clHquH`Fo`,!@quHcG
+r;cfFrrE#Hr;cfFrr<)K!<1IG!<:OI!!1OKrmUiHrmLlJe+`qAe,KCKdfBBrpAk0@rW)oGrr<)K
+!<1IG!<:OH!<1FJ!7U]CrR:`GrR:`GrR:cH!7UoI!7UoIrR:cHrR:?<!7UoI!7UoI!n.,LrR:cH
+!Rh&Je,'+Jdf9Bs!<1ID!<48C<It2%s8;qMrrCmS!!!O\s+13irrIuVp=]Y<!;fbrJ,~>
+s!%CA!7UoI!7UlH#1EPPdf9Bsci=-r!7UlH!n..ur;ZiHr;ZiHqZ$WFlMq"8!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7UB:!Rh&Je,B@Ge,01Ge,9:GdfBHt
+p]19ArW)rH!s$dM!<1FL!7LoJrR:cH!Rh&Je+Wk@e,B@Ge,KCKdfBBrr;clHquH`Fo`,!@quHcG
+r;cfFrrE#Hr;cfFrr<)K!<1IG!<:OI!!1OKrmUiHrmLlJe+`qAe,KCKdfBBrpAk0@rW)oGrr<)K
+!<1IG!<:OH!<1FJ!7U]CrR:`GrR:`GrR:cH!7UoI!7UoIrR:cHrR:?<!7UoI!7UoI!n.,LrR:cH
+!Rh&Je,'+Jdf9Bs!<1ID!<48C<It2%s8;qMrr@]N!!#*3s+13irrI`Op=0;.!;]\qJ,~>
+s!%CA!7UoI!7UlH!n..urVurId/X9t!!(LH!!:UL!<(CF!<1IG!<1I7!!C[M!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7UE;s3prI!7UfF!7UlH!7UoI!7UoI
+s3puJr6tNC!n..urW)uI!<CUJ!<:LK!7UlH"4I8!e,B=Kdf9CGe,'+Hdf@kq!!C[Me'n9r!7UlH
+!7UfF!7UQ?!7UfF!7UoI!7UlH"4I5Me,01Ge,97Kdf@kGrVurIr;ZiHrW)uIrW!#K!7UoI!7U]C
+!7UlH"4I8!e,B=Ie+<VAdf@kq!!C[Me'n9r!7UlH!7UoI!7UoIs3pcD!7UlH!n..ur;ZoJ!7UlH
+"k*J#!!(LI!!(LH!!C[M!7UK=!7UlH!7UoI!7UfF"4I5Me,B=Ie,97He,97He,B=Ie,'.F,6(Yo
+s8)a$p6.ua"pZ5JVt9ooqOU:r":?J[Z2Xe%!;6@!rO$8m&d/F[7uHJurrE#s!!!%Ns+13irrJ)Y
+p=oeB!;fbrJ,~>
+s!%CA!7UoI!7UlH!n..urVurId/X9t!!(LH!!:UL!<(CF!<1IG!<1I7!!C[M!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7UE;s3prI!7UfF!7UlH!7UoI!7UoI
+s3puJr6tNC!n..urW)uI!<CUJ!<:LK!7UlH"4I8!e,B=Kdf9CGe,'+Hdf@kq!!C[Me'n9r!7UlH
+!7UfF!7UQ?!7UfF!7UoI!7UlH"4I5Me,01Ge,97Kdf@kGrVurIr;ZiHrW)uIrW!#K!7UoI!7U]C
+!7UlH"4I8!e,B=Ie+<VAdf@kq!!C[Me'n9r!7UlH!7UoI!7UoIs3pcD!7UlH!n..ur;ZoJ!7UlH
+"k*J#!!(LI!!(LH!!C[M!7UK=!7UlH!7UoI!7UfF"4I5Me,B=Ie,97He,97He,B=Ie,'.F,6(Yo
+s8)a$kCG]-!t$A_^%;70nqfI@!t?ktaSu5<!;6@!q4h.D%0?h\;OmNNrrDop!!!(Os+13irrIuV
+p=]Y<!;fbrJ,~>
+s!%CA!7UoI!7UlH!n..urVurId/X9t!!(LH!!:UL!<(CF!<1IG!<1I7!!C[M!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7UE;s3prI!7UfF!7UlH!7UoI!7UoI
+s3puJr6tNC!n..urW)uI!<CUJ!<:LK!7UlH"4I8!e,B=Kdf9CGe,'+Hdf@kq!!C[Me'n9r!7UlH
+!7UfF!7UQ?!7UfF!7UoI!7UlH"4I5Me,01Ge,97Kdf@kGrVurIr;ZiHrW)uIrW!#K!7UoI!7U]C
+!7UlH"4I8!e,B=Ie+<VAdf@kq!!C[Me'n9r!7UlH!7UoI!7UoIs3pcD!7UlH!n..ur;ZoJ!7UlH
+"k*J#!!(LI!!(LH!!C[M!7UK=!7UlH!7UoI!7UfF"4I5Me,B=Ie,97He,97He,B=Ie,'.F,6(Yo
+s8)a$d;^lN!Y-o'fCT"JgikI]";*P<i;WcT!;6@!k`JXd$3CVc?EO-orrD?`!!!=Vs+13irrI`O
+p=0;.!;]\qJ,~>
+s!%CA!7UoI!7UlH!n..urVurIdfBEsrVurIr;ZoJ!7UlH!7UfF!7UfF!7UE;s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<!7UlH!n.,Lr6tTE!7UoI
+!7UlH!7U]Cr6kZHe,97Jdf@kq!!:ULe,97Jdf@kq!!(LC!;t:H!7UfF!7UlH!7UlH!7U<8!7UfF
+!7UlHs3plG!7UiGqpPQGe,97He,97He,B=Ie,97Jdf@kr!!(LC!!(LH!!:ULe,97He+`q@dfBHt
+qZ$WFr;ZiHr;ZiHrVurIr;ZiHp]1?Cr;ZiHr;ZoJ!7UfFrmUfGqpYQF!7UN>!7UiG!7UoI!n.,L
+r6tZG!7UcE!7UiG!7UZBs!%JCNW8qWq>^Bns8N+q&,?2+.c0n!!QlS]!!4t9s8;rlrrW2#+nu$=
+#'BkArrAVg!!$a-rrCpS!!":ms8;r`rrE&t!!!+Ps+13irrJ)Yp=oeB!;fbrJ,~>
+s!%CA!7UoI!7UlH!n..urVurIdfBEsrVurIr;ZoJ!7UlH!7UfF!7UfF!7UE;s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<!7UlH!n.,Lr6tTE!7UoI
+!7UlH!7U]Cr6kZHe,97Jdf@kq!!:ULe,97Jdf@kq!!(LC!;t:H!7UfF!7UlH!7UlH!7U<8!7UfF
+!7UlHs3plG!7UiGqpPQGe,97He,97He,B=Ie,97Jdf@kr!!(LC!!(LH!!:ULe,97He+`q@dfBHt
+qZ$WFr;ZiHr;ZiHrVurIr;ZiHp]1?Cr;ZiHr;ZoJ!7UfFrmUfGqpYQF!7UN>!7UiG!7UoI!n.,L
+r6tZG!7UcE!7UiG!7UZBs!%JCNW8qWq>^Bn"98@M"Si#u9_\8\!MTtt!!60qs8;rlrrW.W%JTo(%
+@$_h!*T7#!3Gqp!3?%u!*RbMr;c0`!;ufr!!\#SJcEai!K$jMg'!iEqc-XH~>
+s!%CA!7UoI!7UlH!n..urVurIdfBEsrVurIr;ZoJ!7UlH!7UfF!7UfF!7UE;s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<!7UlH!n.,Lr6tTE!7UoI
+!7UlH!7U]Cr6kZHe,97Jdf@kq!!:ULe,97Jdf@kq!!(LC!;t:H!7UfF!7UlH!7UlH!7U<8!7UfF
+!7UlHs3plG!7UiGqpPQGe,97He,97He,B=Ie,97Jdf@kr!!(LC!!(LH!!:ULe,97He+`q@dfBHt
+qZ$WFr;ZiHr;ZiHrVurIr;ZiHp]1?Cr;ZiHr;ZoJ!7UfFrmUfGqpYQF!7UN>!7UiG!7UoI!n.,L
+r6tZG!7UcE!7UiG!7UZBs!%JCNW8qWq>^Bn"984(!r2fsEW#P1!I=qF!!7ECs8;rlrrVn0#5A0!
++h.=J!$qLC!8dJM!,2<2!1hR<r;c0`!:p*h!#L4dJcEai!J:@FeHD!7qGgOG~>
+s!%CA!7UoI!7UlH!Rh&Ge("Eue,01Ge,97Jdf@kq!!(LF!!(LF!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(Kr!!(L<!!(LH!!:ULe,97He,97He,B=I
+e,97He+itDe,97Jdf@kq!!:ULe,97Jdf@kq!!:ULe,97He+itDe,97Jdf@ko!<:OI!!(LH!!(L8
+!!(LF!!(LF!<:OI!!(LG!!(LF!!(LH!!(LH!!(LI!!(LH!!:UL!<1IA!!(LH!!:ULe,97He+itD
+e,97Jdf@ko!<:OI!!(LH!!(LI!!(LH!!(LA!<:OJ!!(LH!!:ULe,'+Idf9BsrVurIq>^NEo)Jd>
+qZ$fK!7LoJe,97Kdf9Bsq>^NEqu?`GpAk4;s&G'Yr;cZnr;ZltIeEaB'(,Jo!4__&!>+8h!;QQp
+qI9's!A!j@rrN'orVus$[JBh'oc*l1!=S,>s8;r`rrD]j!!!IZs+13irrJ)Yp=oeB!;fbrJ,~>
+s!%CA!7UoI!7UlH!Rh&Ge("Eue,01Ge,97Jdf@kq!!(LF!!(LF!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(Kr!!(L<!!(LH!!:ULe,97He,97He,B=I
+e,97He+itDe,97Jdf@kq!!:ULe,97Jdf@kq!!:ULe,97He+itDe,97Jdf@ko!<:OI!!(LH!!(L8
+!!(LF!!(LF!<:OI!!(LG!!(LF!!(LH!!(LH!!(LI!!(LH!!:UL!<1IA!!(LH!!:ULe,97He+itD
+e,97Jdf@ko!<:OI!!(LH!!(LI!!(LH!!(LA!<:OJ!!(LH!!:ULe,'+Idf9BsrVurIq>^NEo)Jd>
+qZ$fK!7LoJe,97Kdf9Bsq>^NEqu?`GpAk4;s&G'Yr;cZnr;Zls9D/>d/,T,A!.jhD!@R[@!;QQp
+oK)UE!EK*rrrMs8rVus(kkY5ZkQh(e!?1g_s8;r`rrD0[!!!shs+13irrIuVp=]Y<!;fbrJ,~>
+s!%CA!7UoI!7UlH!Rh&Ge("Eue,01Ge,97Jdf@kq!!(LF!!(LF!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(Kr!!(L<!!(LH!!:ULe,97He,97He,B=I
+e,97He+itDe,97Jdf@kq!!:ULe,97Jdf@kq!!:ULe,97He+itDe,97Jdf@ko!<:OI!!(LH!!(L8
+!!(LF!!(LF!<:OI!!(LG!!(LF!!(LH!!(LH!!(LI!!(LH!!:UL!<1IA!!(LH!!:ULe,97He+itD
+e,97Jdf@ko!<:OI!!(LH!!(LI!!(LH!!(LA!<:OJ!!(LH!!:ULe,'+Idf9BsrVurIq>^NEo)Jd>
+qZ$fK!7LoJe,97Kdf9Bsq>^NEqu?`GpAk4;s&G'Yr;cZnr;Zlj,5)!;?N0a"!)E4f!E]3t!;QQp
+eJ[uZ!JUONrrM<lrVus<p%eUg[0-C.!D`UAs8;r`rrA>`!!$nfs+13irrI`Op=0;.!;]\qJ,~>
+s!%CA!7UlH"4I5Me,'+Fe("Eue+s%Kdf9Bs!!(LH!!:ULe,97Jdf@kq!!(L=!!(LE!!C[M!7U04
+"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me'J'pe+*J=e,97Jdf@kr!<:OH
+!!(LI!!(LI!<:OD!!(LI!<:LK!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!7U`D!7UoIs3guKe,97K
+df@hsrmUcF!7UfF!7UQ?!7UfF!7UoI!7UlH"4I5Me,B=Kdf@kq!!:ULe,97He,97He,B=Ie,97J
+df@kh!!(LH!!:ULe,97He+itDe,B@IdfBHtr;ZrK!7LrIe,01Ge,B=Ie,B@Ie+itDe,97Jdf@kq
+!!:ULe,97Jdf@kr!!C[M!7UlH"4I5Me,B=Ie+`nCe+s%Jdf@hs!7UoIs3puJ!7UfF!7UfF!7UZB
+s!%JCNW8qWq>^Bn$)%>!(m*DAo#bYE!!"\JrrCmR!!s6sh>$3>8H8`3r;cZn!W5go!!i^4ZKCrN
+aE%I_!!"JFrrM^)rVus0nGE4dr`f@%!<]=fs8=b=s8;r`rrA_k!!#05s+13irrJ)Yp=oeB!;fbr
+J,~>
+s!%CA!7UlH"4I5Me,'+Fe("Eue+s%Kdf9Bs!!(LH!!:ULe,97Jdf@kq!!(L=!!(LE!!C[M!7U04
+"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me'J'pe+*J=e,97Jdf@kr!<:OH
+!!(LI!!(LI!<:OD!!(LI!<:LK!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!7U`D!7UoIs3guKe,97K
+df@hsrmUcF!7UfF!7UQ?!7UfF!7UoI!7UlH"4I5Me,B=Kdf@kq!!:ULe,97He,97He,B=Ie,97J
+df@kh!!(LH!!:ULe,97He+itDe,B@IdfBHtr;ZrK!7LrIe,01Ge,B=Ie,B@Ie+itDe,97Jdf@kq
+!!:ULe,97Jdf@kr!!C[M!7UlH"4I5Me,B=Ie+`nCe+s%Jdf@hs!7UoIs3puJ!7UfF!7UfF!7UZB
+s!%JCNW8qWq>^Bn$"*`51SE\$m^bsf!!$s5rrB"r!!t0Lj87i..0'?Ar;cZn!Vdo=!!imR^Zta_
+\6&e2!!$=%rrM'^rVusDr;6Kpr$)+?!<qHKs8=b=s8;r`rr>sr!!&+3s+13irrIuVp=]Y<!;fbr
+J,~>
+s!%CA!7UlH"4I5Me,'+Fe("Eue+s%Kdf9Bs!!(LH!!:ULe,97Jdf@kq!!(L=!!(LE!!C[M!7U04
+"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me'J'pe+*J=e,97Jdf@kr!<:OH
+!!(LI!!(LI!<:OD!!(LI!<:LK!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!7U`D!7UoIs3guKe,97K
+df@hsrmUcF!7UfF!7UQ?!7UfF!7UoI!7UlH"4I5Me,B=Kdf@kq!!:ULe,97He,97He,B=Ie,97J
+df@kh!!(LH!!:ULe,97He+itDe,B@IdfBHtr;ZrK!7LrIe,01Ge,B=Ie,B@Ie+itDe,97Jdf@kq
+!!:ULe,97Jdf@kr!!C[M!7UlH"4I5Me,B=Ie+`nCe+s%Jdf@hs!7UoIs3puJ!7UfF!7UfF!7UZB
+s!%JCNW8qWq>^Bn#q5iS;R#<\l)H01!!'_.rr?^1!!u?+l1`tk&-)]qr;cZn!T4Lf!!jO"bjP>i
+WB1.[!!&McrrK)$rVut(rql]rn.,Et!>G(ks8=b=s8;r`rr=5A!!(N"s+13irrI`Op=0;.!;]\q
+J,~>
+s!%ICr6tWFs3pfE!7THuqpYNEs3poHrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3o9o!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp]1<B!s$dM!<1FL!7LoJrmLrL
+df9CHe,KCJe,97He+`qBdfTU!!!)uHrr<&Jq>gHBrW)rHpAk-?rrDuGrrE#Hr;ciGrW)oGrr<&J
+r;ZoJ!!)rG!<CUI!!:UL!<(C@!<(CH!!(LH!!(LC!<1FL!7LoJrR:cH!7UcEr6tZGrmLlJe+`qA
+e,B@Ge,B@Ge,KCJe,97Jdf9CHe,9:Ge+WhBe+itDe,9:Gdf]["!!(LF!!(LF!!(LB!<48C<K7%W
+!;ZZl!!,poqu6YkrVus#ebf@IqAoP8!@dR:rrN+XqZ-Hl!/^[T!?BSbrrLplrVuq6qu6ZJr;ZgK
+qu6Yrr;Zh$li6o>lMpe_m/I'crVus+l%/kcs2P'>N;rV,"J,Vj<E4P~>
+s!%ICr6tWFs3pfE!7THuqpYNEs3poHrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3o9o!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp]1<B!s$dM!<1FL!7LoJrmLrL
+df9CHe,KCJe,97He+`qBdfTU!!!)uHrr<&Jq>gHBrW)rHpAk-?rrDuGrrE#Hr;ciGrW)oGrr<&J
+r;ZoJ!!)rG!<CUI!!:UL!<(C@!<(CH!!(LH!!(LC!<1FL!7LoJrR:cH!7UcEr6tZGrmLlJe+`qA
+e,B@Ge,B@Ge,KCJe,97Jdf9CHe,9:Ge+WhBe+itDe,9:Gdf]["!!(LF!!(LF!!(LB!<48C<K7%W
+!;ZZl!!%THrr?j6!!*8rqu6]g#Q=](>l=O"!W6*t!;ZWp7/d/e5k+XM!OW.2!!'M*rrA\i!!$[/
+rr?[0!!&VVs8=b=s8;rbrrN+MrVus7qLSZts2P'>M?!;'"I]>f<E4P~>
+s!%ICr6tWFs3pfE!7THuqpYNEs3poHrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3o9o!7UK=!7UlH!n.,LrmLrLdf9CGe,KFIdfBHtp]1<B!s$dM!<1FL!7LoJrmLrL
+df9CHe,KCJe,97He+`qBdfTU!!!)uHrr<&Jq>gHBrW)rHpAk-?rrDuGrrE#Hr;ciGrW)oGrr<&J
+r;ZoJ!!)rG!<CUI!!:UL!<(C@!<(CH!!(LH!!(LC!<1FL!7LoJrR:cH!7UcEr6tZGrmLlJe+`qA
+e,B@Ge,B@Ge,KCJe,97Jdf9CHe,9:Ge+WhBe+itDe,9:Gdf]["!!(LF!!(LF!!(LB!<48C<K7%W
+!;ZZl!!'8"rr=kS!!*`0qu6]?"TAB%O8f(W!UqK6!;ZWp)u]g<B_hN)!JgjW!!)'Vrr?:%!!'(s
+rr=VK!!(X:s8=b=s8;rbrrMpmrVushrIP!"s2P'>K)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbScAc>nGiR<^An8_r;ZiHec5^!L&h5ts&IGGrMfk$_uKZ8q>^?m!&OHN
+!WGLd!!#IbrrBP-!!*c*qYpTqCA\).rrD0[!!*f)q#:?QrVus*qtpBnQ2L[_EW,n;ir&iW+R9"*
+1[>#=!:^!jo[TO!rVus+]Rg*6s2G!=N;rV,"J,Vj<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbScAc>nGiR<^An8_r;ZiHec5^!L&h5ts&IGGr;Zg._uKZ8q>^?m!-@u9
+!W3Q/!!'%rrr?@(!!+\MqYpTo.f9;CrrBb3!!+eOq#:?#rVus3rql]q;Z-Rq[/L")Zi'k(;<n2[
+1[>#=!:g'lrU8!k.K0;J)!6DLJcE^h!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*`W5nbScAc>nGiR<^An8_r;ZiHec5^!L&h5ts&IGGr;Zg._uKZ8q>^?m!4DY&
+!UpBo!!(jPrr=AE!!.!:qYpTf')Vb+rr?d4!!-p8q#:>3rVupiqYpO=r;ZiWrVlk;r;Zh^lMpf=
+lMpe_nc&ailG@r_rVus\on!-os2G!=K)bPp"H`]\<E4P~>
+s!!!oJH1E)!7S%MrR99s!7QZ&s!%JCd/X'E!3a<?r;cZnr;Zj&mJ-\]ci*nE)#XC;r=o;4!MT;g
+!V6Bk!;c]u>Q=a*[eB_$If9<IEr5k;rCQtg"U)O=s7[Z8!!*GelMpf=lMpe_p&Fad!Wl9WJcC<$
+`;]jss7Y4NScJXf<Ib~>
+s!!!oJH1E)!7S%MrR99s!7QZ&s!%JCd/X%E!"[!Ir;cZnr;Zj-qtU0kK)P`M2Z3RYq#p`u!Ta%U
+!TF.Y!;c]u)#sX=m.UGZ.fKDJeGK7Hq%s#1"UOJps6L$j!!*l2lMpf=lMpe_p&Fad!X3B5JcC<$
+`;]jps7Y.LRK34b<Ib~>
+s!!!oJH1E)!7S%MrR99s!7QZ&s!%JCd/X%E!"[!Ir;cZnr;ZjVrqQKn1B%7RWVlc"j9#A^"7u<f
+!M'8i!;c]u$NL/6p\+Ue')hk2mJHnaj9kkd"X*R>s1AL6!!,XglMpf=lMpe_p&Fad!YU:dJcC<$
+`;]jis7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCd/X'E!3a<?r;cZnr;ZgNp\t6`rVup*r;QcZrVup0pAY,>r;c`p!;$0i
+!#bJ0!9F+Z!$qF@!V$a#!!<i*raYp-!<StZs8=b=s8;rjs7cQq$AJ&%s+13frrJ)Yp=oeB!;fbr
+J,~>
+s!!!oJH16$JH1B(s!%JCd/X%E!"[!Ir;cZnr;ZhBp\t6OrVup6r;Qc7rVupCpAY+:r;c`p!9F+Z
+!'BlR!5/:2!*T0u!SmnX!!=YJr$VID!<h0As8=b=s8;rjs7cQq(Spt[s+13frrIuVp=]Y<!;fbr
+J,~>
+s!!!oJH16$JH1B(s!%JCd/X%E!"[!Ir;cZnr;ZiAp\t5CrVuq#r;QaurVuqHpAY+'r;c`p!0I0[
+!2&ra!)`^q!5\O3!Mfer!!?a1o+Cs%!=nYas8=b=s8;rjs7cQq1;!O:s+13frrI`Op=0;.!;]\q
+J,~>
+s!!!oJH16$JH1B(s!%JCd/X'E!3a<?r;cZnr;ZhHp\t6irVup$r;Qc1rVupZpAY-Dr;c`p!6tKC
+!)3(c!;HHm!"Jc(!7UlH!A^tZ!!#m@s8;rjs7QEn$%%7'JcE[g!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JCd/X%E!"[!Ir;cZnr;ZiUp\t6crVup(r;QanrVuqcpAY,Yr;c`p!.FhH
+!5/")!:Kgd!$(h7!1<]b!H2lS!!&;/s8;rjs7QEn'q9dSJcE[g!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JCd/X%E!"[!Ir;cZnr;Zifp\t6>rVupAr;Qa?rVurMpAY+Qr;c`p!&4BP
+!9EhQ!4Mk,!-@u9!*&ms!OFQ[!!(Eks8;rjs7QEn/A6W7JcE[g!J:@FeHD!7qGgOG~>
+s!#5YrR:ZE!7UlHrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D
+!7U-3!7U'1!7Tg*!7U'1!7U'1!7U'1!7U'1!7Tm,!7UiGs3prIqpY6=!7UiGs3prIqpV\Js!%JC
+d/X'E!3a<?r;cZnr;ZiGp\t6mrVup!r;Qb?rVuqJpAY-_r;c`p!0mH_!1WZ]!<2rt!!`5u!07$Y
+!<E9$!!"%`s8;rfrri8fb`b*d!!+bKJcC<$`r?'us7Y4NScJXf<Ib~>
+s!#5YrR:ZE!7UlHrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D
+!7U-3!7U'1!7Tg*!7U'1!7U'1!7U'1!7U'1!7Tm,!7UiGs3prIqpY6=!7UiGs3prIqpV\Js!%JC
+d/X%E!"[!Ir;cZnr;Zijp\t6jrVup"r;Qa;rVurWpAY-Nr;c`p!%.[F!9a%T!;ufr!"8T%!)3@l
+rrN*!!(b?6r;cBf"T.H$K-U<p!F5VTs+13irrIuVp=]Y<!;fbrJ,~>
+s!#5YrR:ZE!7UlHrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D
+!7U-3!7U'1!7Tg*!7U'1!7U'1!7U'1!7U'1!7Tm,!7UiGs3prIqpY6=!7UiGs3prIqpV\Js!%JC
+d/X%E!"[!Ir;cZnr;Zipp\t6^rVup'r;Qa,rVurgpAY,Ar;c`p!"o21!;,sa!:p*h!&"'H!$;+>
+!<N<$!!%o#s8;rfrri/Y\8`&X!!%t/s+13hrrI`Op=0;.!;]\qJ,~>
+s!%4<!7T*k!7UlH!7UoIs3prI!7UlH!n..uqZ$WFm/R.8r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW1e+itDe+`nCe+*J=e+`nCe*m>;e)(-*e)gW1e)gW1
+e+`nCe*m>;e*d8:e+itDe)CB-e,97Kdf9Bsq>^NEpAk6Br;[&N!!(IJ!7RnIs!%JCNW8qWq>^Bn
+!;Z?gr;ccq!&a`U!6Fm6!;ZQnqu6XerW)m!r;us!qZ$Ttq#:Bm7/Hrb#i3`)r;c3a!OE15!!"m-
+s+13irrJ)Yp=oeB!;fbrJ,~>
+s!%4<!7T*k!7UlH!7UoIs3prI!7UlH!n..uqZ$WFm/R.8r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW1e+itDe+`nCe+*J=e+`nCe*m>;e)(-*e)gW1e)gW1
+e+`nCe*m>;e*d8:e+itDe)CB-e,97Kdf9Bsq>^NEpAk6Br;[&N!!(IJ!7RnIs!%JCNW8qWq>^Bn
+!<2]lr;ccq!"Jo-!:oj`!:p'gqu6X/rW)m!r;us!qZ$Tuq#:Bi'`.k2')0WMr;c6b!re8`rVuq=
+JcC<$`r?'rs7Y.LRK34b<Ib~>
+s!%4<!7T*k!7UlH!7UoIs3prI!7UlH!n..uqZ$WFm/R.8r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW1e+itDe+`nCe+*J=e+`nCe*m>;e)(-*e)gW1e)gW1
+e+`nCe*m>;e*d8:e+itDe)CB-e,97Kdf9Bsq>^NEpAk6Br;[&N!!(IJ!7RnIs!%JCNW8qWq>^Bn
+p&Fsjr;Qa$rVuropAY-5r;c`p!!rQ(r<*!"rW2lr!"AZ&!T4:]!!,@_bl@VAmJd7`CBFJ8!4[U[
+JcEai!J:@FeHD!7qGgOG~>
+s!%4<!7T*k!7UlH"k*GOdf@kr!!(LH!!:ULe,'+Fe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH
+!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!(LC!!(L4!!(LB!!(L;!!(L+!!(L1!!(L1
+!!(LB!!(L;!!(L1!!(L.!!:ULe,B=Ie,97He,01Ge,01Ge,97Jdf@kr!!(LH!!:ULe#<?I,6(ZY
+s8AqtYLEOM!;ZZn!;6Bj!;uis&H2Y0nFlk^rquiorr<l%!;HKomg]3q!<S\4s8;r`rrq9]!!!%t
+JcDPG!!'Y2!!)Bc!K@'Pg]X2Kqc-XH~>
+s!%4<!7T*k!7UlH"k*GOdf@kr!!(LH!!:ULe,'+Fe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH
+!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!(LC!!(L4!!(LB!!(L;!!(L+!!(L1!!(L1
+!!(LB!!(L;!!(L1!!(L.!!:ULe,B=Ie,97He,01Ge,01Ge,97Jdf@kr!!(LH!!:ULe#<?I,6(ZY
+s8;ot&(CRW!;ZZn!;6Bj!;uis"TAB$r:^-jr;?Wmrr<8i!;HKofE;'P!<^ors8;r`rro\/!!!)a
+JcDPG!!'Y2!!)Bc!K$jMg'!iEqc-XH~>
+s!%4<!7T*k!7UlH"k*GOdf@kr!!(LH!!:ULe,'+Fe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH
+!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!(LC!!(L4!!(LB!!(L;!!(L+!!(L1!!(L1
+!!(LB!!(L;!!(L1!!(L.!!:ULe,B=Ie,97He,01Ge,01Ge,97Jdf@kr!!(LH!!:ULe#<?I,6(ZY
+s8;ot&(CRW!;ZZn!;6Bj!;uis!r`0"rq??lnGN@arr</f!;HKoSHA`i!=S>=s8;r`rrmTI!!!2q
+JcDPG!!'Y2!!)Bc!J:@FeHD!7qGgOG~>
+ruqLEdfBBrrrE#HrVuuJ!<1Ho!!(LH!!(LD!!C[MdfBBrrr<)K!<1I6!!:ULe,97He*?u6e,97H
+e+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ!!)uHrr<)K!<1IE!!(LI
+!<(CH!!1OKrmUfGs3prI!Rh&Je,'+Jdf9Bs!<1II!<(CG!!1OKrmUiHrmLlJe+*J>dfBBroDem?
+rVurIrW!#K!!)uHrr<)K!<1IE!!LaN!7LrIe,KCJe,97Kdf@hsrmU`E"Od>NdfBBrrrE#HrVuuJ
+!<1IH!<1FJ!7U`D!Rh&Je,9:He,9:GdfBHtnc/[=r;ZiHp&G*ArVurIr;ZiHr;ZiHquH`Fqu?`G
+rVurIr;ZrK!7LrIe*mA:dfBHt_Z9]\s&Hl7rMfk$e,T@Hq>^Bnp&Fsjr;Qa"rVursp&Fsjqu6X"
+li?bZ!1j&g!%l@nr;c-_!20;k!%!3rn,KlP!M0;gs2*OlScJ-W!K@'Pg]X2Kqc-XH~>
+ruqLEdfBBrrrE#HrVuuJ!<1Ho!!(LH!!(LD!!C[MdfBBrrr<)K!<1I6!!:ULe,97He*?u6e,97H
+e+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ!!)uHrr<)K!<1IE!!(LI
+!<(CH!!1OKrmUfGs3prI!Rh&Je,'+Jdf9Bs!<1II!<(CG!!1OKrmUiHrmLlJe+*J>dfBBroDem?
+rVurIrW!#K!!)uHrr<)K!<1IE!!LaN!7LrIe,KCJe,97Kdf@hsrmU`E"Od>NdfBBrrrE#HrVuuJ
+!<1IH!<1FJ!7U`D!Rh&Je,9:He,9:GdfBHtnc/[=r;ZiHp&G*ArVurIr;ZiHr;ZiHquH`Fqu?`G
+rVurIr;ZrK!7LrIe*mA:dfBHt_Z9]\s&Hl7r;Zg.e,T@Hq>^Bnp&Fsjr;Q`trW)Tjr;c`p!!;Ke
+pAY+Rr;Zh?b5_D?lMgiUrVuq&JcG3=\(UkO!;lf5g&[WBm/I*Cs7Y.LRK34b<Ib~>
+ruqLEdfBBrrrE#HrVuuJ!<1Ho!!(LH!!(LD!!C[MdfBBrrr<)K!<1I6!!:ULe,97He*?u6e,97H
+e+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ!!)uHrr<)K!<1IE!!(LI
+!<(CH!!1OKrmUfGs3prI!Rh&Je,'+Jdf9Bs!<1II!<(CG!!1OKrmUiHrmLlJe+*J>dfBBroDem?
+rVurIrW!#K!!)uHrr<)K!<1IE!!LaN!7LrIe,KCJe,97Kdf@hsrmU`E"Od>NdfBBrrrE#HrVuuJ
+!<1IH!<1FJ!7U`D!Rh&Je,9:He,9:GdfBHtnc/[=r;ZiHp&G*ArVurIr;ZiHr;ZiHquH`Fqu?`G
+rVurIr;ZrK!7LrIe*mA:dfBHt_Z9]\s&Hl7r;Zg.e,T@Hq>^Bnp&Fsjr;Q`trW)Wk!;ucqqu6Ws
+li?bZ!#b_8!5cnYr;c-_!$;+>!5F*bn,KlI!KdBZs2*:eOT=bJ!J:@FeHD!7qGgOG~>
+ruqLEe'n9r"4I5Me,04Ge,B=Ie'\3re,01Ge+s%Idf9Bse,B=Ldf@kGrVurImJm@<!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!!(LI!!(LH!!:ULe,97Kdf9Bs
+rVurIr;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!C[M!7UiGs3prI!n..u
+rW)uIp]16@!W^]urVurIp&G*Ar;ZiHrVurIqZ$`I!!(LI!!(LH!!(LH!!(LI!!:ULe,97Kdf@kG
+rVurIr;ZiHrW)uIrW!&L!!(LG!<:OI!!:ULe,B@Ie+j"De,B=Ie,97He,B=Ie,B@Ie+`q@dfBHt
+r;ZiHp&G*ArVurIr;ZiHrW)rHqu?`GqZ$WFrVurIr;ZrK!7TEr!!(LC!;t:H!7UoI!7Sdbs!%JC
+_#OA5!3alOr;cZnr;cNjr;ccq!"f,0!:]^^!<2osqu6X,rVur_k5PJE"8r3#$KfP3r;c-_!:Tme
+!"+;Wn,KlP!M0;gs2*OlScJ-W!K@'Pg]X2Kqc-XH~>
+ruqLEe'n9r"4I5Me,04Ge,B=Ie'\3re,01Ge+s%Idf9Bse,B=Ldf@kGrVurImJm@<!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!!(LI!!(LH!!:ULe,97Kdf9Bs
+rVurIr;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!C[M!7UiGs3prI!n..u
+rW)uIp]16@!W^]urVurIp&G*Ar;ZiHrVurIqZ$`I!!(LI!!(LH!!(LH!!(LI!!:ULe,97Kdf@kG
+rVurIr;ZiHrW)uIrW!&L!!(LG!<:OI!!:ULe,B@Ie+j"De,B=Ie,97He,B=Ie,B@Ie+`q@dfBHt
+r;ZiHp&G*ArVurIr;ZiHrW)rHqu?`GqZ$WFrVurIr;ZrK!7TEr!!(LC!;t:H!7UoI!7Sdbs!%JC
+_#O?5!"[QYr;cZnr;cNjr;ccq!!N9$!;uQj!;ucqqu6X!rVurpk5PIr!W<!!(&?&Qr;c-_!8IJQ
+!#:(bn,KlN!La#cs2*IjRK2^S!K$jMg'!iEqc-XH~>
+ruqLEe'n9r"4I5Me,04Ge,B=Ie'\3re,01Ge+s%Idf9Bse,B=Ldf@kGrVurImJm@<!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!!(LI!!(LH!!:ULe,97Kdf9Bs
+rVurIr;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!C[M!7UiGs3prI!n..u
+rW)uIp]16@!W^]urVurIp&G*Ar;ZiHrVurIqZ$`I!!(LI!!(LH!!(LH!!(LI!!:ULe,97Kdf@kG
+rVurIr;ZiHrW)uIrW!&L!!(LG!<:OI!!:ULe,B@Ie+j"De,B=Ie,97He,B=Ie,B@Ie+`q@dfBHt
+r;ZiHp&G*ArVurIr;ZiHrW)rHqu?`GqZ$WFrVurIr;ZrK!7TEr!!(LC!;t:H!7UoI!7Sdbs!%JC
+_#O?5!"[QYr;cZnr;cNjr;ccq!!<-"!<2]l!:]pequ6WtrVursk5PI2!W<!!8,^X2r;c-_!.4\F
+!*=aOn,KlI!KdBZs2*:eOT=bJ!J:@FeHD!7qGgOG~>
+ruqIDe,97Kdf9Bsqu?`Gr;ZiHe,]NtqZ$WFquHcGq#CEDqZ$WFn,WL;rVurIr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZuL!!(Ksqu?`Gq>^NEquHcG
+r;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZrK!!(LG!!(LH!!:ULe,97He+*J=e,97He+WhB
+e,01Ge,B=Kdf9CGe,KCJe+s%Ee,01Ge,01Ge,97Jdf@kq!!(LI!!(LH!!(LH!!C[M!7UiG!7UlH
+!n..ur;ZiHq#CEDr;ZiHr;ZiHrVurIr;ZiHnc/[=r;ZiHp&G*ArVurIr;ZiHqZ$WFp&G*ArVurI
+r;ZiHqZ$WFnc/[=rVurI_>sT[s&Hl7rMfk$e,T@Hq>^Bnp&Fsjr;QaSrVur>pAY-gr;c`p!&XZT
+!3GA`!Ve&>!!"@hs8;r_rrDur!!!+Ps6p!0h#Eu9g]<uHqu=Og!M0;XrrJ)Yp=oeB!;fbrJ,~>
+ruqIDe,97Kdf9Bsqu?`Gr;ZiHe,]NtqZ$WFquHcGq#CEDqZ$WFn,WL;rVurIr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZuL!!(Ksqu?`Gq>^NEquHcG
+r;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZrK!!(LG!!(LH!!:ULe,97He+*J=e,97He+WhB
+e,01Ge,B=Kdf9CGe,KCJe+s%Ee,01Ge,01Ge,97Jdf@kq!!(LI!!(LH!!(LH!!C[M!7UiG!7UlH
+!n..ur;ZiHq#CEDr;ZiHr;ZiHrVurIr;ZiHnc/[=r;ZiHp&G*ArVurIr;ZiHqZ$WFp&G*ArVurI
+r;ZiHqZ$WFnc/[=rVurI_>sT[s&Hl7r;Zg.e,T@Hq>^Bnp&Fsjr;Qa+rVurhpAY-`r;c`p!"Jo-
+!:/hJ!U^<l!!$<Js8;r_rrDin!!!1Rs6p!0gAdW3g&[WBqu=Oe!La#TrrIuVp=]Y<!;fbrJ,~>
+ruqIDe,97Kdf9Bsqu?`Gr;ZiHe,]NtqZ$WFquHcGq#CEDqZ$WFn,WL;rVurIr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZuL!!(Ksqu?`Gq>^NEquHcG
+r;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZrK!!(LG!!(LH!!:ULe,97He+*J=e,97He+WhB
+e,01Ge,B=Kdf9CGe,KCJe+s%Ee,01Ge,01Ge,97Jdf@kq!!(LI!!(LH!!(LH!!C[M!7UiG!7UlH
+!n..ur;ZiHq#CEDr;ZiHr;ZiHrVurIr;ZiHnc/[=r;ZiHp&G*ArVurIr;ZiHqZ$WFp&G*ArVurI
+r;ZiHqZ$WFnc/[=rVurI_>sT[s&Hl7r;Zg.e,T@Hq>^Bnp&Fsjr;Qa$rVuropAY-5r;c`p!!`E&
+!;>UU!Q#$;!!&h<s8;r_rrD!V!!![`s6p!0ec1d%eH(d4qu=O`!KdBKrrI`Op=0;.!;]\qJ,~>
+ruqIDe,97Kdf9BsquHcGrVurIeGoTuq#CEDr;ZiHpAb3BqZ$WFnGiR<qu?`Gr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZiHr;clHrVurIq>^NEq>gQE
+rr<&Jr;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZrK!!(LG!<:OI!!:ULe,97He+*M=e,B=Ie+WhB
+e,'+Kdf@hs!7UlH"4I5Me+s%Ee,01Ge,01Ge,97Jdf@kq!!(LI!!(LH!!(LH!!C[M!7UiGs3prI
+!n..ur;ZiHq#LHDrVurIr;ZiHrVurIr;ZiHnc/[=r;ZiHp&G*ArVurIr;ZiHqZ$WFp&G*ArVurI
+r;ZiHqZ$WFnGrR;_#XKZs&Hl7rMfk$e,T@Hq>^Bnp&Fsjr;Qb>rVuqJpAY-_r;c`p!.=bG!*8=`
+!WH^,!!%,bs8;r^s8Duu!J1:>s2j$sT)\?9!M0;gs2*OlScJ-W!K@'Pg]X2Kqc-XH~>
+ruqIDe,97Kdf9BsquHcGrVurIeGoTuq#CEDr;ZiHpAb3BqZ$WFnGiR<qu?`Gr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZiHr;clHrVurIq>^NEq>gQE
+rr<&Jr;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZrK!!(LG!<:OI!!:ULe,97He+*M=e,B=Ie+WhB
+e,'+Kdf@hs!7UlH"4I5Me+s%Ee,01Ge,01Ge,97Jdf@kq!!(LI!!(LH!!(LH!!C[M!7UiGs3prI
+!n..ur;ZiHq#LHDrVurIr;ZiHrVurIr;ZiHnc/[=r;ZiHp&G*ArVurIr;ZiHqZ$WFp&G*ArVurI
+r;ZiHqZ$WFnGrR;_#XKZs&Hl7r;Zg.e,T@Hq>^Bnp&Fsjr;Qa;rVurWpAY-Nr;c`p!$;+>!6=='
+!W=PE!!'RRs8;r_rrE&t!!!(Os6p!0g&[ZBn_+#4!;lf5g&[WBm/I*Cs7Y.LRK34b<Ib~>
+ruqIDe,97Kdf9BsquHcGrVurIeGoTuq#CEDr;ZiHpAb3BqZ$WFnGiR<qu?`Gr;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZiHr;clHrVurIq>^NEq>gQE
+rr<&Jr;ZiHr;ZiHrVurIr;ZiHrVurIr;ZiHr;ZrK!!(LG!<:OI!!:ULe,97He+*M=e,B=Ie+WhB
+e,'+Kdf@hs!7UlH"4I5Me+s%Ee,01Ge,01Ge,97Jdf@kq!!(LI!!(LH!!(LH!!C[M!7UiGs3prI
+!n..ur;ZiHq#LHDrVurIr;ZiHrVurIr;ZiHnc/[=r;ZiHp&G*ArVurIr;ZiHqZ$WFp&G*ArVurI
+r;ZiHqZ$WFnGrR;_#XKZs&Hl7r;Zg.e,T@Hq>^Bnp&Fsjr;Qa+rVurgpAY,Ar;c`p!"Su.!9iYH
+!V@$#!!)*(s8;r_rrDlo!!!:Us6p!0eH(g4n^RZ&!;lf5eH(d4m/I*<s7XtGOT>5X<Ib~>
+ruqIDe,97Kdf9BsrW!&L!7LrIe("Eue+`nCe,B=Ie,'+Fe,97Jdf@kq!!(L=!!(LE!!C[M!7U04
+"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me+WhBe,01Ge,B@IdfBHtr;ZrK
+!!(LF!!(LG!!(LH!!C[Me'n9r!7UlH!7UoI!7UlH"4I5Me,01Ge,97Kdf9BsrW!&L!7LrIe,KCJ
+e,B@Ie+*J>dfBBrpAb3Bq>^]J!7LoJe,B@Ie,KCJe,'+Fe,'+Fe,01Ge,B@IdfBHtr;ZrK!!(LG
+!!(LH!!C[M!7UoI"4I8!!<1II!!(LI!<:OH!!(LI!!1OKrmUcF!7UoI!7UoIs3pN=!7UoIs3pZA
+!7UlH#1EPPdf9Bsr;ZiHr;ZiHqZ$WFr;[&N!!(IJ!7UlH!7UK=!7SX^s!%JC_#OA5!3alOr;cZn
+r;cNjr;ccq!5/:2!'9iR!7q)Kqu6Z7rVup@kl1Xfr;Zjh<;lju"jG6kr;c-_!;l`q!!RrRn,LMb
+!M9>]g]<uHqu=Og!M0;XrrJ)Yp=oeB!;fbrJ,~>
+ruqIDe,97Kdf9BsrW!&L!7LrIe("Eue+`nCe,B=Ie,'+Fe,97Jdf@kq!!(L=!!(LE!!C[M!7U04
+"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me+WhBe,01Ge,B@IdfBHtr;ZrK
+!!(LF!!(LG!!(LH!!C[Me'n9r!7UlH!7UoI!7UlH"4I5Me,01Ge,97Kdf9BsrW!&L!7LrIe,KCJ
+e,B@Ie+*J>dfBBrpAb3Bq>^]J!7LoJe,B@Ie,KCJe,'+Fe,'+Fe,01Ge,B@IdfBHtr;ZrK!!(LG
+!!(LH!!C[M!7UoI"4I8!!<1II!!(LI!<:OH!!(LI!!1OKrmUcF!7UoI!7UoIs3pN=!7UoIs3pZA
+!7UlH#1EPPdf9Bsr;ZiHr;ZiHqZ$WFr;[&N!!(IJ!7UlH!7UK=!7SX^s!%JC_#O?5!"[QYr;cZn
+r;cNjr;ccq!)NRo!1<K[!1*Q`qu6Y*rVupmkl1X#r;ZkS*W?$>$M2OBr;c-_!;6<k!"+;Wn,LM`
+!Lj&Yg&[WBqu=Oe!La#TrrIuVp=]Y<!;fbrJ,~>
+ruqIDe,97Kdf9BsrW!&L!7LrIe("Eue+`nCe,B=Ie,'+Fe,97Jdf@kq!!(L=!!(LE!!C[M!7U04
+"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me+WhBe,01Ge,B@IdfBHtr;ZrK
+!!(LF!!(LG!!(LH!!C[Me'n9r!7UlH!7UoI!7UlH"4I5Me,01Ge,97Kdf9BsrW!&L!7LrIe,KCJ
+e,B@Ie+*J>dfBBrpAb3Bq>^]J!7LoJe,B@Ie,KCJe,'+Fe,'+Fe,01Ge,B@IdfBHtr;ZrK!!(LG
+!!(LH!!C[M!7UoI"4I8!!<1II!!(LI!<:OH!!(LI!!1OKrmUcF!7UoI!7UoIs3pN=!7UoIs3pZA
+!7UlH#1EPPdf9Bsr;ZiHr;ZiHqZ$WFr;[&N!!(IJ!7UlH!7UK=!7SX^s!%JC_#O?5!"[QYr;cZn
+r;cNjr;ccq!$V=A!8$rE!'0uXqu6XDrVur*kl1W<r;Zl0%/p5-.f.Eir;c-_!7UoI!%EL!n,LM[
+!KmEPeH(d4qu=O`!KdBKrrI`Op=0;.!;]\qJ,~>
+ruqIDe,97He,B@He,KCJe'S0me,KFGdf9CFe,KFHe,B@Ge+!G8e,B@Ie)p`2e*[59e,04Fe,9:H
+e*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WFqZ-TDrr<)K!<1IH!;t:H!7UlH"4I5M
+e,01Ge,97He,B@He,KCJe+s(DdfBHtnc/[=o)Jd>q#CEDr;ciG"9?mN!7UfF!7UfF!7UfFrmLrL
+df@kq!!C[M!7UiG!7UlH!7UoIrmUlI!7UcErmLlJe,B@He,KCJe+s(Be,KFIdfBHtnGrR;!<CUD
+!;t=F!<:OH!<(CF!<1IH!;t=F!<:OH!<(C9!<(B`!<48C<P\Y5WW96Os8;rns8;rjs8;rqrrD3\
+!!!T(rr@HF!;lcrn,<:f"Q\kJ!TO4[!!=5>ndbX!!>td\s8;r_rrDEb!!!L[s6p!0g]=#Hn_=/:
+!;lfVg].?Fg].?Eg]<uHm/I*Fs7Y4NScJXf<Ib~>
+ruqIDe,97He,B@He,KCJe'S0me,KFGdf9CFe,KFHe,B@Ge+!G8e,B@Ie)p`2e*[59e,04Fe,9:H
+e*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WFqZ-TDrr<)K!<1IH!;t:H!7UlH"4I5M
+e,01Ge,97He,B@He,KCJe+s(DdfBHtnc/[=o)Jd>q#CEDr;ciG"9?mN!7UfF!7UfF!7UfFrmLrL
+df@kq!!C[M!7UiG!7UlH!7UoIrmUlI!7UcErmLlJe,B@He,KCJe+s(Be,KFIdfBHtnGrR;!<CUD
+!;t=F!<:OH!<(CF!<1IH!;t=F!<:OH!<(C9!<(B`!<48C<P\Y5!!!PYs8;rns8;rjs8;rqrrBt9
+!!";<rr=8A!;lcrg&:sP#l3cc!O`%.!!>[ihus#Z!'JO+r;c-_!7LiH!$6^kn,LM`!Lj&Yg&[WB
+qu>^1!!)TD!!)QC!La#TrrIuVp=]Y<!;fbrJ,~>
+ruqIDe,97He,B@He,KCJe'S0me,KFGdf9CFe,KFHe,B@Ge+!G8e,B@Ie)p`2e*[59e,04Fe,9:H
+e*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WFqZ-TDrr<)K!<1IH!;t:H!7UlH"4I5M
+e,01Ge,97He,B@He,KCJe+s(DdfBHtnc/[=o)Jd>q#CEDr;ciG"9?mN!7UfF!7UfF!7UfFrmLrL
+df@kq!!C[M!7UiG!7UlH!7UoIrmUlI!7UcErmLlJe,B@He,KCJe+s(Be,KFIdfBHtnGrR;!<CUD
+!;t=F!<:OH!<(CF!<1IH!;t=F!<:OH!<(C9!<(B`!<48C<P\Y5!!!PYs8;rns8;rjs8;rqrr?."
+!!%KArr<W/!;lcrGl@[D+8tL)!H\AA!!@rTV#pVr!.`>or;c-_!,DK5!.0:sn,LM[!KmEPeH(d4
+qu>^,!!)T?!!)Q>!KdBKrrI`Op=0;.!;]\qJ,~>
+s!%"6!7QK!h>dQ)hZ*Z*S,`Q<jo>D1VZ6_GnGiR<rVurI\GuWYgAh6&r;ZiH_Z9]\s&JRg&+A/k
+]!AH=WiE,'Zb+B4naZYXWW97!s6-KCs8;rns8;rjs8;rqrrr<7!!!%oq#:Bd!rW,qrr>Xi!!"h@
+rrMg9rW!'-g].;ur;ZgocN!hClMgjJrVupQJcG3=hV8)2mG%`6s7+kFScJZfj4j_:gtVo&g].?E
+g]<uHm/I*Fs7Y4NScJXf<Ib~>
+s!%"6!7QK!h>dQ)hZ*Z*S,`Q<jo>D1VZ6_GnGiR<rVurI\GuWYgAh6&r;ZiH_Z9]\s&JRg&(-><
+1)^K%!!!-6*Aq5`fCAn>!!!Q+s6'ICs8;rns8;rjs8;rqrrr3%!!!&]q#:BT!W<#qrrN*3rVuqE
+li."O#lXf,'DMP,NVrhWQd5X0!:'Ra4T5<\IY%Ofs5)H0!:AJ@RfDp3!La#cs5Vf8!8?-,p"BBG
+n_+#4!:9^dM?!;'"I]>f<E4P~>
+s!%"6!7QK!h>dQ)hZ*Z*S,`Q<jo>D1VZ6_GnGiR<rVurI\GuWYgAh6&r;ZiH_Z9]\s&JRg&(-><
+1)^K%!!!-6*Aq5`fCAn>!!!Q+s6'ICs8;rns8;rjs8;rqrrqEb!!!,nq#:Ae!W<#qrrN!'rVur7
+li.!t"TAB(5lCZ^8GrMge'A!l!:'Ra)?'U9c@Q#as5)9+!:A;;OoOt%!KdBZs5VW3!7fU"p!j$B
+n^RZ&!:9^dK)bPp"H`]\<E4P~>
+s!%"6!7QK!JH44#!7U'1!7RhG!7U<8!7R&1rR8U`s!%JCo)AaM\ac[#\`<;]rMfk$qZ#cZj8]&X
+q>^Bnp&Fsjqu6Z(rVus4p%n[hrbME3qYpQRrVus"M!b3Cra#L'!<Shjrr@3@!!*/(ci<qDqYpRU
+jRiHPgAV'Q!ka*an,M8"!!)EA!M9>]g]<uHqu>U0!!)]I!!)QE!M0;XrrJ)Yp=oeB!;fbrJ,~>
+s!%"6!7QK!JH44#!7U'1!7RhG!7U<8!7R&1rR8U`s!%JCo)A`h/b&fA0!+[Er;Zg.qZ#aZj8]&X
+q>^Bnp&Fsjqu6Y#rVusOrVHNpr@@dGqYpQ#rVus#_!V.&r$;7A!<h'Rrr=nT!!*8aci<qDqYpS'
+q"4RdWr;u!"7Lg@n,M7u!!)E?!Lj&Yg&[WBqu>U.!!)]G!!)QC!La#TrrIuVp=]Y<!;fbrJ,~>
+s!%"6!7QK!JH44#!7U'1!7RhG!7U<8!7R&1rR8U`s!%JCo)A`h/b&fA0!+[Er;Zg.qZ#aZj8]&X
+q>^Bnp&Fsjqu6XArVut;rqcWqoFh'%qYpP%rVus*k3`0Ln.5Ku!=nStrrN$4rVus3o[!R9!;c]r
+L]$fE!,hc9!=S[Rs6p!EeGoU:eH(g4n^RZ&!;lfSeGoUBeGoU>eH(d4m/I*<s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCo`"sh`U0Z+_u03-rMfk$qZ#cZj8]&Xq>^Bnp&Fsjqu6]m)u]g<.e<N;
+!WJ)U!;ZWpL&M&R!dO_>rrW//9`+hiW;Q\r;uHXrp`f\;!=n_es8=b=s8;rorrW6-JFWF7!rf;.
+rVupRJcG0<qqN+jUaZHbLp&B7*1u$Acrgk\.C.aacqb5U*d-99!<:g^\2FO#:=S(S!1Y26rnIXJ
+s4lCCq>^M/r7h=E!;lfig^MP*&Ha(sgt)_`gtZ'3g]T"'g]6.-!<:g`[lFa+B\_ACW\k%d1:-`1
+!M0;XrrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCo`"sb;=+>a9DA,Zr;Zg.qZ#aZj8]&Xq>^Bnp&Fsjqu6]f#Q=](?2XX#
+!W6-u!;ZWp6iI&d"eYPh!r8NIqu6Y-r;Zh`r;Qfe$2so*,5gd,rA3a=r;c]o!rs(*r:p9nrJC[U
+!!%"is6fpag)C$@*!7OjL`Z^K`S0%^57%HQce@*c4UVECO4sL3s4RjE-Nb&of\5$ZF;4iUg'!lE
+g=g39!!$[0g&[WBqu?BD#eW;."Y,Sec3jR)!%7d"":<B-!8@>Ns4RpH.KgWBg=cO`-NaZCchH,o
+RK2^S!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JCo`"sb;=+>a9DA,Zr;Zg.qZ#aZj8]&Xq>^Bnp&Fsjqu6]<"9&9$OT,1X
+!UqK6!;c]rrYth:!><6CrrVSG+8c'</H#PKdJX"F_Z]r=!F>]js8=b=s8;rorrW6U[f6(%!qg+*
+rVur0JcG0<qpcVc?P3T$`+Kbf5L%a/W%8)Y:XR_CQ7W=I2lbF+!<:RWEuG-$JCN-"!*'I/rm_.6
+s4,Y1q>^M+r7(h1!;lfieHhHm#7*8geY=PleHf@/e^=TIeH".t!<:RYF<(H1UXdlpC`EKf=jcuo
+!KdBKrrI`Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCo`"p0l`(!%rV$9iWW97!s6-KCs8;rns8;rjs8;rorrCgP!!s:!hYHHD
+8cSi4r;cZn!W6."!"9d!amf<&ji*Tl&c_q0rrCsT!!",;rrD!U!!"kAs8=b=s8;ros8E!*#?-l5
+k5+u>`JQDK!!*u.JcG0<qqN1l(9uP]!uJ5qRLn90&<bJpNYpR,7U+$g]40RN!<([\a:Oomc=nc`
+g]//&rS.RJs4lDa:](1n:YYg&!M0;gs7Y4`7U+$g]40RN8rMKU!Nk/*$/F;9gtVo.g^_=1NRQ$g
+gtVl>R+'N5'_gA`ScJ-W!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JCo`"ndlMprUq=aje!!!Q+s6'ICs8;rns8;rjs8;rorrAno!!t3NjSS#2
+.0'?Ar;cZn!Ve2D!":WJeFih2ik(4E#64c%rrB2"!!#djrrB5#!!%-,s8=b=s8;ros8E!*&R_<`
+lM^S?]QtRr!!,:]JcG0<qq<%j28@[_#<'?IF!]Po+K!];BK=f#&r"Z^X[q1"!<(UZW$AIs_EhVa
+g&O1TrRqFDs4Z2[:Ab(m:>,R!!La#cs7Y.^&r"Z^X[q1"'$&_L!RKK<'&)%>g=cQ*g('hfU=HnS
+g=cNNW7K*m0_a9%RK2^S!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JCo`"ndlMprUq=aje!!!Q+s6'ICs8;rns8;rjs8;rorr?O,!!u?-lhK=r
+&-)]pr;cZn!TF^i!";Jrh>$s:h6M_s!rr?!rr?j5!!&)Vrr?a2!!'Rqs8=b=s8;ros8E!*,As[<
+n,E%:Y\FRE!!.0?JcG0<qpc\e?,k#I**pS,3H*Hu3O.#O1PaN2#b0/bROZk<!<(FUBLoV\Y8X+b
+eGs4)rRD(6s4,ZL9`+kk9[s!j!KdBZs7XtY#b0/bROZk<#gLng!moJC8_)>ke^XZueIH(AYL9F)
+e^XXgZdZH3H2#hiOT=bJ!J:@FeHD!7qGgOG~>
+s!#5YrR:ZE!7UoIqpYQFrR:WD!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D
+!7U-3!7UE;rmU36!7QK!JH4I*s!%JCp&>$Mql1%._pd;qi8EMIe]P>tWW:`Gs8AqtYPS:ti;KYU
+Xmt?0s8;rns8;rjs8;rnrrBG"!!*Yjr;cWm!W7!.!<)ouoc!f0!=Ii^rrAGc!!*+[m/R#?lMpe_
+qZ$$b!B]e%s6]j`g^4%Rgt^Q_T\S>U"8gjWg'$3d&$c#e!!)uQ!GI>hg]c=6gtVmor7h=Es8LdS
+f/`g1!BJd/g]<uHqu?BF!=uI4g^^8>gq!PPgp83[g]6-b!<(^Q@f+p]!1!Q=!SISLg]<uHm/I*F
+s7Y4NScJXf<Ib~>
+s!#5YrR:ZE!7UoIqpYQFrR:WD!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D
+!7U-3!7UE;rmU36!7QK!JH4I*s!%JCp&>#dqZ%!<9RMnmUSFKIK4#u%!!&&Qs8;ot&,Q>)U\t/m
+$LsnOs8;rns8;rjs8;rnrr@K@!!+JBr;cWm!Vf=X!<)oujp1kc!>kP,rr>sr!!*,Gm/R#?lMpe_
+qZ$$b!FPbUs6]j`g'Ri'g=k'WbM(\#"T-mVed:'a"46r!!!)uO!?9#Wg',k2g=cPKr7V1?s8L^Q
+eN!O.!BAX,g&[WBqu?BD!<^^Gg(%&9g4f`ug2L!Eg&Tj\!<(UP)Qrtk!<C4?g&]Y*pY#Y:!:9^d
+M?!;'"I]>f<E4P~>
+s!#5YrR:ZE!7UoIqpYQFrR:WD!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D
+!7U-3!7UE;rmU36!7QK!JH4I*s!%JCp&>#dqZ%!<9RMnmUSFKIK4#u%!!&&Qs8;ot&,Q>)U\t/m
+$LsnOs8;rns8;rjs8;rnrr>[b!!-1!r;cWm!TGKs!<)ouZNL1,!D*.arr=2@!!*8hm/R#?lMpe_
+qZ$$b!JgZ*s6]j`eHu<&e^_A6cdgR[')U2__]dR\!n$nq!!)uJ!=d9PeHN')e^XZEr7(h1s8LOL
+co:q(!B8C&eH(d4qu?B?!<U[GeIEb1eM@9=eLREFeH".M!<(FK%)_tm!<CCDeH*,kpXK;,!:9^d
+K)bPp"H`]\<E4P~>
+s!$_.!7TU$!7UlH!7UoIs3pcD!n..ur;ZiHr;clHnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW1e+itDe+`nCe+*J=e+!D<e,B=Ldf9Bsn,NI;JH16$
+g]7?us&Jal!4Mj+!jCJZpAY0[\,E<-Ykn+orMfk$pAb)k!3alOr;cZnr;cNjr;cWm!QH2V!!4q6
+s8;rkrrKqqo)Sdi!W?$t!!*.uq#:Bm4T5<]#iG%LrA3a=r;c]o!oeVKo`,"=Sq6q-s81RP!8IM.
+!<CmRg^aD?gs]+3!!!&Tgm/1@K!kU5!!)uQ$4m:A!W`9%gtVn^r7h=Es8C^UcS#8OchcDtScJZf
+p=oe:#>]rZrnJ"-&_q@r'\m;,gtVnbg]7<.!=m?Ng].?Pg].?Kg]<uHm/I*Fs7Y4NScJXf<Ib~>
+s!$_.!7TU$!7UlH!7UoIs3pcD!n..ur;ZiHr;clHnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW1e+itDe+`nCe+*J=e+!D<e,B=Ldf9Bsn,NI;JH16$
+g]7?us&Jal!%.XE!YCt!pAY05.K'5I'(P_rr;Zg.pAb'k!"[QYr;cZnr;cNjr;cWm!M0Vn!!6-p
+s8;rkrrJl<o)Sdi!W*u<!!*8[q#:Bi&H2Y1&btbnrA3a=r;c]o!mPEho`,"T]7L"Js81LM!<(UO
+!<(U^!8?/F4UD)g!SZ72&6jt-rn7>PrRqS]!s8T*!!1g-!87;(!Lj&eg'#YR!&)Ung&[WBqu?BD
+"Bl@@Lr0/F%^m_<*f;T()7J8Q!8?-,rRq8SfDF8%!;tON!;G1JRK2^S!K$jMg'!iEqc-XH~>
+s!$_.!7TU$!7UlH!7UoIs3pcD!n..ur;ZiHr;clHnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+pAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW1e+itDe+`nCe+*J=e+!D<e,B=Ldf9Bsn,NI;JH16$
+g]7?us&Jal!%.XE!YCt!pAY05.K'5I'(P_rr;Zg.pAb'k!"[QYr;cZnr;cNjr;cWm!I"\B!!7?A
+s8;rlrrW1R%eB]"rrMEprVus3o(`4ch['2]!C$GKs8=b=s8;rorrT]0#5%rs;V6R#li6k4!!)uJ
+!!)uJ%fk/1SLasF!!:^$0Ht"ebPp#l!<(FS!WrN+!<<2OeH#Ks!KmE\eHErG!%u@heH(d4qu?B?
+">D$0Nm%FP%U4D4%7Gs$%*$iJ!7fU"rRCoMe,.Yq!;t@I!;G"EOT=bJ!J:@FeHD!7qGgOG~>
+s!$_.!7TU$!7UlH"k*GOdf@kn!!C[M!7UlH!7UoI!n..unGiR<r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UT@!7U'1!7U]C!7U04!7UE;!7UfF!7UE;!7QK!
+JH4I*s!%JCpAY-[rMfn!mdpGZp9=Lq!93bQrMfk$pAb)k!3alOr;cZnr;cNjr;cTl#l:#\('=gf
+>-Ir*r;cKi%F';h*s_lP%NmZ0H`,WtrrA\i!!$9trrMEhrVupAmJm,@lMpe_p\tWJLfPu="9]8a
+:4gT=s69R\g].?Qg].?Qg^!o8gg*Cbg"ZT,g]tZG<>e<^g]7<.!=cg?g].?Og]=#Hr7h@r50E]V
+!M0;gs7P.^_15N'8)2nR&C:a'&C:[*gtVnbg]7<.!=m?Ng].?Pg].?Kg]<uHm/I*Fs7Y4NScJXf
+<Ib~>
+s!$_.!7TU$!7UlH"k*GOdf@kn!!C[M!7UlH!7UoI!n..unGiR<r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UT@!7U'1!7U]C!7U04!7UE;!7UfF!7UE;!7QK!
+JH4I*s!%JCpAY-8r;Zj$cL_&:jq@Um!3,_mr;Zg.pAb'k!"[QYr;cZnr;cNjr;cTl#k<X1%fm%i
+Bug5Qr;cNj%fX+[3Z&&%#SA@E?%]EDrr2t'r;ZhhpAY0<!WE'!;XOM_1[>#=!;QR&rP<hS+qF\Y
+'eWOJg4B:gs81LM!<(UO!<(UW!8?-GFN<(e!<1[WY'*DED;*\DrRq8Se,%bu!;kINRfE<>!m!RH
+q:Yk<!;lfhg(gc68d]Fhg=?SX"jmY("P2;\!8?-,rRq8SfDF8%!;tON!;G1JRK2^S!K$jMg'!iE
+qc-XH~>
+s!$_.!7TU$!7UlH"k*GOdf@kn!!C[M!7UlH!7UoI!n..unGiR<r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UT@!7U'1!7U]C!7U04!7UE;!7UfF!7UE;!7QK!
+JH4I*s!%JCpAY-8r;Zj$cL_&:jq@Um!3,_mr;Zg.pAb'k!"[QYr;cZnr;cNjr;cTl#hsGS$3C_r
+Gi/N#r;cNj%f<;;1(j`m$5=sUAW+4jrr2sGr;ZiLpAY/O!WE'!RI1%Q1[>#=!;QR&p9J^+*=MuS
+))blml[f*#s81=H!<(FJ!<(FR!7fU.Nl]bq!<1LRRqt7oT@MHlrRCoMde_Jo!;k:IOoP@0!lI.<
+q:,M.!;lfheJ4Qi4p[e2e\i93%DNjh%F`kX!7fU"rRCoMeGIbr!;t@I!;G"EOT=bJ!J:@FeHD!7
+qGgOG~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5^!r;ZiHqZ$WFq#CWJ!!(IJ!7U97!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,*C!!(LH!!:UL!<(CH!!1OKrmU`E!7UoI
+rR:cH!Rh&Je,9:He,B=JdfBBrqZ$WFrVurIrW!#K!!)uHrVurIquH]ErVuuJ!<1IH!<1FJ!7QK!
+JH4I*s!%JCpAY-DrMfk<nc&U=rMfk@p](2l!3c+rrMfk$JcC<$KE(i(!!)uQ!!)uQ#QWZ8#ghA^
+d/a(!"kEe2g]Q7/g]:tZqV2&NqqM4Ds7+kFScJZfo%X8s"9.'[G?PR5GZG@Sg]RW4g]Q7/g]:ho
+qqM/Or7h8PpY5e@!:9^dN;rV,"J,Vj<E4P~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5^!r;ZiHqZ$WFq#CWJ!!(IJ!7U97!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,*C!!(LH!!:UL!<(CH!!1OKrmU`E!7UoI
+rR:cH!Rh&Je,9:He,B=JdfBBrqZ$WFrVurIrW!#K!!)uHrVurIquH]ErVuuJ!<1IH!<1FJ!7QK!
+JH4I*s!%JCpAY,Hr;Zh#nc&T=r;Zh/p](0l!"\f'r;Zg.JcC<$KE(i&!!)uO!!)uO#QWT4!nZ/[
+^B"/b"Npr%g&_0+!?7F&g&M-Mg&[ZBn_+#4!;lfeg&]A"rn7Q!LEY@pMBMoP!s%'/!WC^Q)6`qk
+!!)rN!!)cI!La#TrrIuVp=]Y<!;fbrJ,~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5^!r;ZiHqZ$WFq#CWJ!!(IJ!7U97!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,*C!!(LH!!:UL!<(CH!!1OKrmU`E!7UoI
+rR:cH!Rh&Je,9:He,B=JdfBBrqZ$WFrVurIrW!#K!!)uHrVurIquH]ErVuuJ!<1IH!<1FJ!7QK!
+JH4I*s!%JCpAY,Hr;Zh#nc&T=r;Zh/p](0l!"\f'r;Zg.JcC<$KE(i!!!)uJ!!)uJ#QWE*!S#ZM
+GQ@Wk"Jc[\eH,X!!=ZU:eGoUHeH(g4n^RZ&!;lfeeH)HYrm_2_3HWd]4*1DO!s$m%!WCOL$cDkl
+!!)rI!!)cD!KdBKrrI`Op=0;.!;]\qJ,~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("Eue,01Ge,04Fe,'+Idf9BsrVurIm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!!(LI!!(LH!!:ULe,97Kdf9Bs
+rVurIr;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LH!!(LI!!:ULe,97IdfB?qr;ZiH
+quHcGrW!#K!7UoIs3lN!JH4I*s!%JCpAY-3rMfkSnc&UVrMfk/p](2l!3c+rrMfk$JcC<$KE(i(
+!!)uQ!!)uQ+TU<Q9N0H^8H@Q$-'?I*V[;/621XE9grTkKc.K:)gtVo,g]=#Hn_=/:!;lfig]]!d
+c.T!$rnI^g"#SfE"#9f1&-1M@21XE9gr9Y]e]Vmdg]79-!!)cK!M0;XrrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("Eue,01Ge,04Fe,'+Idf9BsrVurIm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!!(LI!!(LH!!:ULe,97Kdf9Bs
+rVurIr;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LH!!(LI!!:ULe,97IdfB?qr;ZiH
+quHcGrW!#K!7UoIs3lN!JH4I*s!%JCpAY+ir;Zhhnc&U2r;ZgQp](0l!"\f'r;Zg.JcC<$KE(i&
+!!)uO!!)uO'EHk@'8>&K*WXpJ5G?KSN>1+#%B]W`$*";pda=dTg=cQ(g&[ZBn_+#4!;lfig''^7
+dF=-irn7R+"bkZa"b6O*"9@00%B]W`#b_g+f"Fu8g&V')!!)cI!La#TrrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("Eue,01Ge,04Fe,'+Idf9BsrVurIm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!!(LI!!(LH!!:ULe,97Kdf9Bs
+rVurIr;ZiHrVurIr;ZrK!7TEr!!(LH!!(LI!<:OI!!(LH!!(LH!!(LI!!:ULe,97IdfB?qr;ZiH
+quHcGrW!#K!7UoIs3lN!JH4I*s!%JCpAY+ir;Zhhnc&U2r;ZgQp](0l!"\f'r;Zg.JcC<$KE(i!
+!!)uJ!!)uJ'EH\6#b]V=%04r/<N=Hg@7A_s#/1#d$#UfZd`@Ire^XZseH(g4n^RZ&!;lfieHJsQ
+dE,fcrm_3,"16T6"1/!W"9@!&#/1#d#\#Kmd],"OeH#Nt!!)cD!KdBKrrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OF!!(LD!!(LI!<:OI!!(LI!!(L:!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH!!(LH!!LaN!7TEp!!(LE
+!!(LG!<:OH!!(LH!!(LH!!(LI!!(LH!!(LI!!(LG!!(LI!!LaN!7TEp!!(LF!!(LG!!(LH!!:UL
+e,97Hdt%LM!8ISS,6([:rrBV.WW;JWrrDuqWW9C"s8AqtYP/"pWW95Rs+13&s81RO!<([Q!<([r
+!8QAR2?OLp!8QA<7LBARTA855+9DPugqcGh""8`Ug]76,!M9>]g]<uHqu?BF"h$l-#;;_Kg]l4-
+PhaagM#Q0@!8QA@+9DPugpApB&89kS!;tUP!;G7LScJ-W!K@'Pg]X2Kqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OF!!(LD!!(LI!<:OI!!(LI!!(L:!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH!!(LH!!LaN!7TEp!!(LE
+!!(LG!<:OH!!(LH!!(LH!!(LI!!(LH!!(LI!!(LG!!(LI!!LaN!7TEp!!(LF!!(LG!!(LH!!:UL
+e,97Hdt%LM!8ISS,6([:rr=YL!!(=7rrDck!!"&6s8;ot&,-&%!!!O\s+13&s81LM!<(UO!<(Up
+!8?/5,68U)!8?.q1^+7N^Y7Cu'`e<gg7^A/#W8%(g&V$(!Lj&Yg&[WBqu?BD"e%7O$U2?)g'5Os
+akFi:`r=['!8?.`'`e<gg5mW`)MHhu!;tON!;G1JRK2^S!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OF!!(LD!!(LI!<:OI!!(LI!!(L:!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH!!(LH!!LaN!7TEp!!(LE
+!!(LG!<:OH!!(LH!!(LH!!(LI!!(LH!!(LI!!(LG!!(LI!!LaN!7TEp!!(LF!!(LG!!(LH!!:UL
+e,97Hdt%LM!8ISS,6([:rr=YL!!(=7rrDck!!"&6s8;ot&,-&%!!!O\s+13&s81=H!<(FJ!<(Fk
+!7fVS'`oPH!7fVK-3FlWbLP-L%06IZeU]%L$q.;LeH#Ks!KmEPeH(d4qu?B?"b%d#&l?dNeHUX+
+c..jTc2Q6)!7fV+%06IZeSlB.-DT,A!;t@I!;G"EOT=bJ!J:@FeHD!7qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LD!!(LD!!C[M!7UiGqpY'8!7UiG!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH!7UlH!7UlHs3prI!7UcE!7UcE
+s3puJ!7UlH!7UlH!7UoI!7UlH!7UoI!7UfF!n..uquHcGrVurIqZ$WFquHcGrW!#K!7UlH!7QK!
+JH4I*s!%JCpAY,trMfkmnG`Kiri,t#p](2l!3c+rrMfk$JcC<$KE''K!M9>]g]<uHqu=Og!M0;X
+rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LD!!(LD!!C[M!7UiGqpY'8!7UiG!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH!7UlH!7UlHs3prI!7UcE!7UcE
+s3puJ!7UlH!7UlH!7UoI!7UlH!7UoI!7UfF!n..uquHcGrVurIqZ$WFquHcGrW!#K!7UlH!7QK!
+JH4I*s!%JCpAY+-r;Zi_nG`InrVup)p](0l!"\f'r;Zg.JcC<$KE''I!Lj&Yg&[WBqu=Oe!La#T
+rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LD!!(LD!!C[M!7UiGqpY'8!7UiG!7UlH!7U66!7UlH
+!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH!7UlH!7UlHs3prI!7UcE!7UcE
+s3puJ!7UlH!7UlH!7UoI!7UlH!7UoI!7UfF!n..uquHcGrVurIqZ$WFquHcGrW!#K!7UlH!7QK!
+JH4I*s!%JCpAY+-r;Zi_nG`InrVup)p](0l!"\f'r;Zg.JcC<$KE''D!KmEPeH(d4qu=O`!KdBK
+rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LC!!(LI!!(LH!!:ULe+WhBe+!D<e+s%Hdf9Bs
+kl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(LB!!(LG!!(LI!<:LK!7UlH
+"4I5Me,'+Fe,01Ge,97Kdf@kGrVurIr;ZiHrVurIr;ZrK!!(LE!!UgOdf9Bsr;ZrK!!(LF!!(LI
+!!C[MdfBBrrr<&JrW)uIJH16$g]7?us&Jdm!3H.!!<1sWrMfk$pAb)k!3^tRJcCB&akQogs7+kF
+ScJZf_V>0`!:9^dN;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LC!!(LI!!(LH!!:ULe+WhBe+!D<e+s%Hdf9Bs
+kl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(LB!!(LG!!(LI!<:LK!7UlH
+"4I5Me,'+Fe,01Ge,97Kdf@kGrVurIr;ZiHrVurIr;ZrK!!(LE!!UgOdf9Bsr;ZrK!!(LF!!(LI
+!!C[MdfBBrrr<&JrW)uIJH16$g]7?us&Jdm!!`B%!<1sWr;Zg.pAb'k!"XY\JcCB&ak?cas7+eD
+RK36b_V,$Z!:9^dM?!;'"I]>f<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LC!!(LI!!(LH!!:ULe+WhBe+!D<e+s%Hdf9Bs
+kl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(LB!!(LG!!(LI!<:LK!7UlH
+"4I5Me,'+Fe,01Ge,97Kdf@kGrVurIr;ZiHrVurIr;ZrK!!(LE!!UgOdf9Bsr;ZrK!!(LF!!(LI
+!!C[MdfBBrrr<&JrW)uIJH16$g]7?us&Jdm!!`B%!<1sWr;Zg.pAb'k!"XY\JcCB&ajgESs7+V?
+OT>:Y_US[L!:9^dK)bPp"H`]\<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYQFr6tZGrR:cHqpYHC!7UH<qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M
+!7U`D!7UlHrR:`G!7UcErmUlI!7UcErmLlJdt%LM!8ISS,6([:s8AqtXPj-WWW96rs8AqtYCZ_)
+s+C?ng]=#Hn_=/:!;lf5g]<uHm/I*Fs7Y4NScJXf<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYQFr6tZGrR:cHqpYHC!7UH<qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M
+!7U`D!7UlHrR:`G!7UcErmUlI!7UcErmLlJdt%LM!8ISS,6([:rr<*!!!!8^s8;ot&,-&%!!!O\
+s+13&s2isqRfDp3!La#cs2*IjRK2^S!K$jMg'!iEqc-XH~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYQFr6tZGrR:cHqpYHC!7UH<qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M
+!7U`D!7UlHrR:`G!7UcErmUlI!7UcErmLlJdt%LM!8ISS,6([:rr<*!!!!8^s8;ot&,-&%!!!O\
+s+13&s2idlOoOt%!KdBZs2*:eOT=bJ!J:@FeHD!7qGgOG~>
+s!!!oc2[jnhZ*Z*NW9(.JH16$ciF(is&JdmrMfk#i;`bU!3c+rrMfk$JcC<$KE''K!M9>]g]<uH
+qu=Og!M0;XrrJ)Yp=oeB!;fbrJ,~>
+s!!!oc2[jnhZ*Z*NW9(.JH16$ciF(is&Jdmr;Zg-i;``U!"\f'r;Zg.JcC<$KE''I!Lj&Yg&[WB
+qu=Oe!La#TrrIuVp=]Y<!;fbrJ,~>
+s!!!oc2[jnhZ*Z*NW9(.JH16$ciF(is&Jdmr;Zg-i;``U!"\f'r;Zg.JcC<$KE''D!KmEPeH(d4
+qu=O`!KdBKrrI`Op=0;.!;]\qJ,~>
+s!!!oJH3.Z!7QK!JH4$ss!%JCpAb)k!3b>\rMfk$pAb)k!3^tRJcCB&akZprn_=/:!;lf5g]<uH
+m/I*Fs7Y4NScJXf<Ib~>
+s!!!oJH3.Z!7QK!JH4$ss!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcCB&akHdpn_+#4!;lf5g&[WB
+m/I*Cs7Y.LRK34b<Ib~>
+s!!!oJH3.Z!7QK!JH4$ss!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcCB&ajpFkn^RZ&!;lf5eH(d4
+m/I*<s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCpAb)k!3b>\rMfk$pAb)k!3^tRJcCB&[[mI!qu=L(!!)Bc!K@'Pg]X2K
+qc-XH~>
+s!!!oJH16$JH1B(s!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcCB&[[I0rqu=L$!!)Bc!K$jMg'!iE
+qc-XH~>
+s!!!oJH16$JH1B(s!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcCB&[ZLOiqu=Kp!!)Bc!J:@FeHD!7
+qGgOG~>
+s!!!oJH16$JH1B(s!%JCpAb)k!3b>\rMfk$pAb)k!3^tRJcCE'ZiL%(^B!X#!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcCE'ZiL%(^B!X#!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcCE'ZiL%(^B!X#!J:@FeHD!7qGgOG~>
+s!#5YrR:`GrR:]FrmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!n..u
+kPtV3JH16$WrW/Ds&JdmrMfk$i;`bU!3c+rrMfk$JcC<$JcC<$g]%;5s7Y4NScJXf<Ib~>
+s!#5YrR:`GrR:]FrmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!n..u
+kPtV3JH16$WrW/Ds&Jdmr;Zg.i;``U!"\f'r;Zg.JcC<$JcC<$g]%;2s7Y.LRK34b<Ib~>
+s!#5YrR:`GrR:]FrmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!n..u
+kPtV3JH16$WrW/Ds&Jdmr;Zg.i;``U!"\f'r;Zg.JcC<$JcC<$g]%;+s7XtGOT>5X<Ib~>
+s!$_.!7TU$!7UlH!n..ur;ZrK!!(LB!!(LF!!(L=!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB
+!!C[M!7UE;"4I5Me+WhEdf9Bso)Jd>jo>J3!7U]C!7UK=!7UB:!7UfF!7UWA!7UQ?!7QK!JH4R-
+s!%JCpAb)k!3b>\rMfk$pAb)k!3^tRJcC<$JcFL)!K@'Pg]X2Kqc-XH~>
+s!$_.!7TU$!7UlH!n..ur;ZrK!!(LB!!(LF!!(L=!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB
+!!C[M!7UE;"4I5Me+WhEdf9Bso)Jd>jo>J3!7U]C!7UK=!7UB:!7UfF!7UWA!7UQ?!7QK!JH4R-
+s!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcC<$JcFL)!K$jMg'!iEqc-XH~>
+s!$_.!7TU$!7UlH!n..ur;ZrK!!(LB!!(LF!!(L=!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB
+!!C[M!7UE;"4I5Me+WhEdf9Bso)Jd>jo>J3!7U]C!7UK=!7UB:!7UfF!7UWA!7UQ?!7QK!JH4R-
+s!%JCpAb'k!"\#fr;Zg.pAb'k!"XY\JcC<$JcFL)!J:@FeHD!7qGgOG~>
+s!$_.!7TU$!7UlH!n..ur;ZoJ!7UZB!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiH
+q#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(L&!!(L?!!(K!!.b.-!<48C<VHIk
+WW93[s8AqtYP/"pWW96]s+/CFb^muhbl>ocrrJ)Yp=oeB!;fbrJ,~>
+s!$_.!7TU$!7UlH!n..ur;ZoJ!7UZB!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiH
+q#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(L&!!(L?!!(K!!.b.-!<48C<VHIk
+!!!Mes8;ot&,-&%!!!Pgs+/CFb^muhbl>ocrrIuVp=]Y<!;fbrJ,~>
+s!$_.!7TU$!7UlH!n..ur;ZoJ!7UZB!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiH
+q#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(L&!!(L?!!(K!!.b.-!<48C<VHIk
+!!!Mes8;ot&,-&%!!!Pgs+/CFb^muhbl>ocrrI`Op=0;.!;]\qJ,~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UoIs3guKe+`nCe,'+Fe*?u8df@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+Jdf9Bs
+!<1IG!<:OI!!1OKrmU`E!7UoI!7UoI#1EPPe'e<Gr;clHquHcGr;cfFrrE#Hr;cfFrrE#HrVurI
+r;ZoJ!!)uHJH16$n,WJ4s&JdmrMfk!i;`bU!3c+rrMfk$JcC<$JcC<$g]%;5s7Y4NScJXf<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UoIs3guKe+`nCe,'+Fe*?u8df@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+Jdf9Bs
+!<1IG!<:OI!!1OKrmU`E!7UoI!7UoI#1EPPe'e<Gr;clHquHcGr;cfFrrE#Hr;cfFrrE#HrVurI
+r;ZoJ!!)uHJH16$n,WJ4s&Jdm!!3'!!!_B]r;Zg.pAb'k!"XY\JcC<$JcFL)!K$jMg'!iEqc-XH~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hec5d#!7UoIs3guKe+`nCe,'+Fe*?u8df@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+Jdf9Bs
+!<1IG!<:OI!!1OKrmU`E!7UoI!7UoI#1EPPe'e<Gr;clHquHcGr;cfFrrE#Hr;cfFrrE#HrVurI
+r;ZoJ!!)uHJH16$n,WJ4s&Jdm!!3'!!!_B]r;Zg.pAb'k!"XY\JcC<$JcFL)!J:@FeHD!7qGgOG~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("Eue,B@Hdf]["!7LrIe,01Ge,04Fe*R,;df9Bsr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHp&G*ArVurIr;ZoJ!7UlH"4I5M
+e,B=Ie,97He,B@Ie,B=Ie,97He,B@Ie,B=Ie,97He,97He,B=Pdf9Bs!7Lqsr;ZiHqZ$WFrVurI
+r;ZrK!!(LB!!C[M!7UiG!7UlH!n..ur;ZiHJH16$nGrS5s&Jdm!3H.!!<2Kf!3Z:#p](2l!3c+r
+rMfk$pAY-+rjVs=JcC<$JcC<$li.!Es7Y4NScJXf<Ib~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("Eue,B@Hdf]["!7LrIe,01Ge,04Fe*R,;df9Bsr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHp&G*ArVurIr;ZoJ!7UlH"4I5M
+e,B=Ie,97He,B@Ie,B=Ie,97He,B@Ie,B=Ie,97He,97He,B=Pdf9Bs!7Lqsr;ZiHqZ$WFrVurI
+r;ZrK!!(LB!!C[M!7UiG!7UlH!n..ur;ZiHJH16$nGrS5s&Jdm!!`B%!<2Kf!"Su.!!2ior;Zg.
+pAY*nrVup/pAY+Qr[Rt#JcC<$JcC<$li.!Bs7Y.LRK34b<Ib~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me("Eue,B@Hdf]["!7LrIe,01Ge,04Fe*R,;df9Bsr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHp&G*ArVurIr;ZoJ!7UlH"4I5M
+e,B=Ie,97He,B@Ie,B=Ie,97He,B@Ie,B=Ie,97He,97He,B=Pdf9Bs!7Lqsr;ZiHqZ$WFrVurI
+r;ZrK!!(LB!!C[M!7UiG!7UlH!n..ur;ZiHJH16$nGrS5s&Jdm!!`B%!<2Kf!"Su.!!2ior;Zg.
+pAY*nrVup/pAY+Qr[Rt#JcC<$JcC<$li.!;s7XtGOT>5X<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OD!!C[Me'n9r!7UoI!7U]C!7UE;s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH!7UlH"Od>Ne'n3p!7UcE
+!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UiG$e#+)!7LoJdf@hse,97He,'+Fe,9:He,01Ge,'.C
+e,KCJe,01Ge,97Ldf9Bsdt%LM!:Bje,6([:rrB>&WW;e`rrE&sWW93rs8AqtYP.trXo>=#Y4hkq
+Xo>=#XF^D&s+13$s6K[cN;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OD!!C[Me'n9r!7UoI!7U]C!7UE;s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH!7UlH"Od>Ne'n3p!7UcE
+!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UiG$e#+)!7LoJdf@hse,97He,'+Fe,9:He,01Ge,'.C
+e,KCJe,01Ge,97Ldf9Bsdt%LM!:Bje,6([:rr<f4!!)6QrrN*#rVup-p](0l!"\f'!"&W)!"AT$
+!"8c+!!\#SJcC<$JcG'9!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L"!<:OD!!C[Me'n9r!7UoI!7U]C!7UE;s3prI!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH!7UlH"Od>Ne'n3p!7UcE
+!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UiG$e#+)!7LoJdf@hse,97He,'+Fe,9:He,01Ge,'.C
+e,KCJe,01Ge,97Ldf9Bsdt%LM!:Bje,6([:rr<f4!!)6QrrN*#rVup-p](0l!"\f'!"&W)!"AT$
+!"8c+!!\#SJcC<$JcG'9!J:@FeHD!7qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LB!!:ULe,97He,B=Ie+`nCe+!D<e,01Ge,97He*?u6
+e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97He,9:He,B=Ie+s%E
+e,97He,97He,97He,B=Ie,97He,B=Ie,01Rdf@hsdf9Bs!7Lqsr;ZiHqZ$WFqZ-ZFrVurIqu?`G
+r;ZrK!!(LG!!(LH!!(LH!<:N!!.b.>!<48C<VHFm\G`E-md^;Wq#.2mXS;bnWW96rrrB;%WqQJk
+WW95Rs+13$s+149rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LB!!:ULe,97He,B=Ie+`nCe+!D<e,01Ge,97He*?u6
+e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97He,9:He,B=Ie+s%E
+e,97He,97He,97He,B=Ie,97He,B=Ie,01Rdf@hsdf9Bs!7Lqsr;ZiHqZ$WFqZ-ZFrVurIqu?`G
+r;ZrK!!(LG!!(LH!!(LH!<:N!!.b.>!<48C<VHFm/H#PKbjk]5lhpe`#5A/r!!!Q'rr<`3!!!)o
+rr<-"!!!U^s+13$s+149rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(L#!!(LB!!:ULe,97He,B=Ie+`nCe+!D<e,01Ge,97He*?u6
+e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97He,9:He,B=Ie+s%E
+e,97He,97He,97He,B=Ie,97He,B=Ie,01Rdf@hsdf9Bs!7Lqsr;ZiHqZ$WFqZ-ZFrVurIqu?`G
+r;ZrK!!(LG!!(LH!!(LH!<:N!!.b.>!<48C<VHFm/H#PKbjk]5lhpe`#5A/r!!!Q'rr<`3!!!)o
+rr<-"!!!U^s+13$s+149rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LB!!C[M!7UlH"4I5Me,01Ge,97He+*J=e+s%H
+df9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(LB!!(LG!!(LI!<:LK
+!7UlH"4I5Me,'+Fe,04Ge,B=Ie,97He,B=Ie,97Kdf9BsqZ%#Q!7Lqs!!(IJdf@kq!!(LF!!(LI
+!!(LH!!C[M!7UoI!n..urW)uIrr<&JrW!#K!7UoIs3guKe,97Hdt%LM!:^'h,6([:rrC%:WW:lF
+rrD6[WqZPlWW96rrrBM+WW;bfrrDckWW9JYs+13$s+149rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LB!!C[M!7UlH"4I5Me,01Ge,97He+*J=e+s%H
+df9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(LB!!(LG!!(LI!<:LK
+!7UlH"4I5Me,'+Fe,04Ge,B=Ie,97He,B=Ie,97Kdf9BsqZ%#Q!7Lqs!!(IJdf@kq!!(LF!!(LI
+!!(LH!!C[M!7UoI!n..urW)uIrr<&JrW!#K!7UoIs3guKe,97Hdt%LM!:^'h,6([:rr>pp!!&MY
+rrBS,!;HNl!!!Q'rr=AD!!)0VrrD3[!!"9qs+13$s+149rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LB!!C[M!7UlH"4I5Me,01Ge,97He+*J=e+s%H
+df9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(LB!!(LG!!(LI!<:LK
+!7UlH"4I5Me,'+Fe,04Ge,B=Ie,97He,B=Ie,97Kdf9BsqZ%#Q!7Lqs!!(IJdf@kq!!(LF!!(LI
+!!(LH!!C[M!7UoI!n..urW)uIrr<&JrW!#K!7UoIs3guKe,97Hdt%LM!:^'h,6([:rr>pp!!&MY
+rrBS,!;HNl!!!Q'rr=AD!!)0VrrD3[!!"9qs+13$s+149rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYQFrmUfGrR:`G!7UfFrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01HdfBBrrW)lF!<CUI!!C[M!7UcE
+!n..urVurIrW!#K!!)rGrrDuGrrE#Hr;ciGrW)rH!<CUJ!<1IH!<1FL!7LoJrR6;tJH50>s!%JC
+pAY-DrMfk:nc&U5r2TMkrMfk$pAY-0rMfk[q#:?WrMfk5ec5Yn`;fj]rr<"Brr<"Bb5_Kco`+r8
+cN!ogJcC<$hu<_9s7Y4NScJXf<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYQFrmUfGrR:`G!7UfFrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01HdfBBrrW)lF!<CUI!!C[M!7UcE
+!n..urVurIrW!#K!!)rGrrDuGrrE#Hr;ciGrW)rH!<CUJ!<1IH!<1FL!7LoJrR6;tJH50>s!%JC
+pAY,Gr;Zgrnc&T$quHKkr;Zg.pAY+`r;Zi*q#:?)r;Zgaec5Yn`;fj]rr<"Brr<"Bb5_Kco`+r8
+cN!ogJcC<$hu<_6s7Y.LRK34b<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmTX&qpYQFrmUfGrR:`G!7UfFrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01HdfBBrrW)lF!<CUI!!C[M!7UcE
+!n..urVurIrW!#K!!)rGrrDuGrrE#Hr;ciGrW)rH!<CUJ!<1IH!<1FL!7LoJrR6;tJH50>s!%JC
+pAY,Gr;Zgrnc&T$quHKkr;Zg.pAY+`r;Zi*q#:?)r;Zgaec5Yn`;fj]rr<"Brr<"Bb5_Kco`+r8
+cN!ogJcC<$hu<_/s7XtGOT>5X<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCpAY-[r2Kb`oD\j[XSf*ms8AqtYP.trci'jDa8#Z7b5J=?
+cK"p+eouuEs8R<3s8R<@s8R<*s8R<@s8R<Bs8R<Bs8R;cs8R<8s8R;gs8R:os+14-rrJ)Yp=oeB
+!;fbrJ,~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCpAY-7r;Zj"a7K<3cj9OLp](0l!"\f'!,qf9!*T*s!+Gg+
+!,^cr!hsn5pAb/:n,NE3r;Ze@k5YI*r;Ze@rr<"Brr<"Bb5_Kco`+r8cN!ogJcC<$hu<_6s7Y.L
+RK34b<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCpAY-7r;Zj"a7K<3cj9OLp](0l!"\f'!,qf9!*T*s!+Gg+
+!,^cr!f;-PpAb/:n,NE3r;Ze@k5YI*r;Ze@rr<"Brr<"Bb5_Kco`+r8cN!ogJcC<$hu<_/s7XtG
+OT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCp&>$#rMfq%hYm3K!rh5cql9DjrMfk$pAY-Rr2KeOrql]rhlH^U!93)>
+"TF+!H1Ue1s**r3s*+D@s**W*s*+5;s*)H^s*+,8s*'%oJcDbM!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JCp&>"=r;Zm/SGDpZ!r]2;qZ-Bjr;Zg.pAY,sr;Zm"P5b@Y!M9Jm!!'"Z
+rri7HGC08^s8R<3s8R<@s8R<*s8R<;s8R;^s8R<8s8R:os+13MrrIuVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCp&>"=r;Zm/SGDpZ!r]2;qZ-Bjr;Zg.pAY,sr;Zm"P5b@Y!M9Jm!!'"Z
+rrhq=GD6%js8R<3s8R<@s8R<*s8R<;s8R;^s8R<8s8R:os+13MrrI`Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCp&>$Lql1%._pmDsi8EMIeAniiWqZPlWW96rrrN#"r2Kt1ceI@3d(0(S
+!Nl4Zrrhe7I<VI\s8R<3s8R<@s8R<*s8R<;s8R;^s8R<8s8R:os+13MrrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCp&>#cqZ%!<9n&1qUSFHHIodH^!;HNl!!!Q'rrMa#qu?pKDj-iZF>!Ik
+!=SGYrrgtuMKd_Is8R<3s8R<@s8R<*s8R<;s8R;^s8R<8s8R:os+13MrrIuVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCp&>#cqZ%!<9n&1qUSFHHIodH^!;HNl!!!Q'rrMa#qu?pKDj-iZF>!Ik
+!=SGYrrf*@I<Y/Ss8R<3s8R<@s8R<*s8R<;s8R;^s8R<8s8R:os+13MrrI`Op=0;.!;]\qJ,~>
+s!!!oJH3+YrR9a+rR6;tJH5EEs!%JCo`"p/kc4CWrMfk$p&>$@n>ZK8j8T7nGKY2\p](8;"T59H
+KY[Te#lVW&I!qF:s8Vt?!<;q?s8N<%_NB4oRG.Z?s*"P@T6^>6qfi)?s*+JBs*+JBs*+JBs*"YG
+\Uf.$q>UBul'$FRj`bqErs&;7KR&9Tqu6WqG6RuVJUF-drr32gP^8ANGB`l_$gX%'NoYD.s8.+f
+mJd+orHrkRs*&\d\Uf.$q>UBuq7qZ/Ks1CQs8R9NrjdZ2Y5eI-K7'Hlrr<"Brr3/uZ\Ng]^OcE9
+s60I`N;rV,"J,Vj<E4P~>
+s!!!oJH3+YrR9a+rR6;tJH5EEs!%JCo`"nckQ(AWr;Zg.p&>#?n,NH0j8T7>GNj=/p](8;"SeF2
+Mq%b+#lD#eH@VaWs8Vt?!<;q?s8N<#[>K9\U@%s[s*"P9Oa-d'qfi)?s*+JBs*+JBs*+JBs*"YE
+W-j)urr2p%d>E4<pigrXrs&%sIX6pcrr2rtG6RoCI"/@!rr32PMKtZcGB`l_$e1&ZReV)Ns7LV_
+qu6U(qg!J`s*&\bW-j)urr2p%nudFfMnT,hs8R9Nr2G1!^]4/-J:P!*rr<"Brr3/lVh02Td"24J
+s60I`M?!;'"I]>f<E4P~>
+s!!!oJH3+YrR9a+rR6;tJH5EEs!%JCo`"nckQ(AWr;Zg.p&>#?n,NH0j8T74GKP-@p](8;"QYSh
+PjA>K#k"[FH%`?qs8Vt?!<;q?s8N;kWJ#PMY5&"rs*"P!LNr^rqfi)?s*+JBs*+JBs*+JBs*"Y;
+RX0Y(rr2p%]RtU3r-*A\rrqY[H[Cq#rVunA"nJ+.KYm`frs$8lI&d*gGPV7H^k@*8r-*AbeTccG
+rr3DnG^]PjGB`VHHA'07rr3/dTR2$Kc2I\BG7*o2I#6DRlC!$S`r5r;GQ.UGi15=DRH&kuJcFs6
+!J:@FeHD!7qGgOG~>
+s!#8ZqpYKD!7UlHrR:WD!n.,LqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3p34!7UWA!7Ta(
+!7U66s3pZA!7T^'!7QK!JH5EEs!%JCo`"sh_s+2qs8AqtYP%nrr4qm'!PA6irs&@FIK-BnfD,CG
+G8%dQpnW/Rs8AL6`;/tpH.W)rGB`ubs*+GA&,i&E`;/tpH.W)rGB^[ZnG<1bGPqL@GQ.XBGQ.XB
+GQ.XBG7VdLr5!TBs8Vb<J*-O3GB`o`#Q'/$r:e$OPQ(U^G7VdLr5!TBs8Ve>IcU:,GB`o`%/,$s
+jS5m%GQ7]bGF&7.(@ZO$s8R:eaP6X/GEr4.qh*;opVD';rr<"B$cq$!`HSGeg&/g5RK!6dGQ7[I
+qi,m@q=M=Ns+146rrJ)Yp=oeB!;fbrJ,~>
+s!#8ZqpYKD!7UlHrR:WD!n.,LqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3p34!7UWA!7Ta(
+!7U66s3pZA!7T^'!7QK!JH5EEs!%JCo`"sb:$DZPs8;ot&,#r'p-S<M!AsH0rs&.@K`?^Mp%\Re
+G8$\?nVDGTs8%IsebnZbHh7:;GB`ubs*+GA&,M$-ebnZbHh7:;GB]SHh>70OGPqL@GQ.XBGQ.XB
+GQ.XBG7U\;q4`)Gs8V8,M=U55GB`o`#PX29rUR"5[Jp4+G7U\;q4`)Gs8VA/M"1#.GB`o`%-i(n
+naW8rGQ7]2GJjF[(>F%us8R:eWTj5QGJ*tUpPe)0nuHuBrr<"B$`E1aVK^a[kPD'"_Z'T8GQ7[I
+p3h>?qs:>6s+146rrIuVp=]Y<!;fbrJ,~>
+s!#8ZqpYKD!7UlHrR:WD!n.,LqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3p34!7UWA!7Ta(
+!7U66s3pZA!7T^'!7QK!JH5EEs!%JCo`"sb:$DZPs8;ot&,#r'p-S<M!AsH0rs%)"XT*]nqtU3k
+G8%4UjF2ILs6G)gj8I\[M#./OGB`ubs*+GA&*nY!j8I\[M#./OGB^1`]))I,GPqL@GQ.XBGQ.XB
+GQ.XBG7UbFo8%VPs8To[VtfDjGB`o`#Mbj8rT]Gfi;WcVG7UbFo8%VPs8U&_V>0,eGB`o`%)mIf
+puK57GQ7\sGNf&+(8H)rs8R:eX7Gk<GNJl)gmm^/lAp/Irr<"B$`W[hMKeE]nb%c`kl1V^GQ7[I
+gj4h;rSs/os+146rrI`Op=0;.!;]\qJ,~>
+s!$_.!7TEt!7UoIs3prI!7UlH!7UlHs3pfE!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M!7UZB
+"4I5Me*m>>df9BspAb<E!!(L5!!(LA!!(L3!!(LB!!(L5!!(LA!!(L6!!(L>!!(K!!.b.E!<48C
+<V$.jiOA?W!P#91WqZPlWW96prrW,DXS/XqXj?n)rs%M-QN-2nOSJkUG6tMRs7CMfs4_afrr32p
+GD6(sGB`ubs*+GA!o%phrr35qGD6(sGB^7cs8R<@s8R<Bs8R<Bs8R<Bs8R9RYQ+Y!GC9Gj`cn`g
+s7CMZp&>*mGC'8gs*#!Ws8Vq>I/j5fGHh,Io65ETruB+(YlFapGBa)epih)\s8U8dYQ+WHGH_&H
+qKI>`rrW1DHN*sEG71PQs8$qcXoJFtGC9Dis*+MC!n):dJcC<$jSo7>s7Y4NScJXf<Ib~>
+s!$_.!7TEt!7UoIs3prI!7UlH!7UlHs3pfE!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M!7UZB
+"4I5Me*m>>df9BspAb<E!!(L5!!(LA!!(L3!!(LB!!(L5!!(LA!!(L6!!(L>!!(K!!.b.E!<48C
+<V$.jV^_-9!@eES!;HNl!!!Q%rrVn1#5/#u$#oOsrs#oU`rF&&[eTn&G7!C2s5\Bes/^Fgrr32b
+GFAL2GB`ubs*+GA!j$Uirr35cGFAL2GB`-Cs8R<@s8R<Bs8R<Bs8R<Bs8R9RirB&MGCokpOE]je
+s5nNLp&>*kGCKPks*#"5s8V\7K)bk6GNJl)j*,_Dru@2Gjo>A@GBa)emWX-Zs8S:,j8].'GN/Z&
+o65f_rrW+BIfBBIG73C0s7CM`iW&rMGD#nps*+MC!hFP`JcC<$jSo7;s7Y.LRK34b<Ib~>
+s!$_.!7TEt!7UoIs3prI!7UlH!7UlHs3pfE!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M!7UZB
+"4I5Me*m>>df9BspAb<E!!(L5!!(LA!!(L3!!(LB!!(L5!!(LA!!(L6!!(L>!!(K!!.b.E!<48C
+<V$.jV^_-9!@eES!;HNl!!!Q%rrVn1#5/#u$#oOsrs"R/l2R&nj7rZSG7!pAs0-^gs,;0frr320
+GKp0fGB`ubs*+GA!fV?hrr351GKp0fGB`]Ss8R<@s8R<Bs8R<Bs8R<Bs8R9RoDej9GGG3<Jp6nf
+s0?imp&>*`GEi+,s*#"Fs8UAgU]:@HGP(q8YBP3eru?Z8o`+rpGBa)ea*3gJs8R^qo`+r8GOtk7
+c?H&[rrV_7PlC^_G74$Bs3Z%AoDej<GGkH?s*+MC!f)!eJcC<$jSo74s7XtGOT>5X<Ib~>
+s!$_.!7THu!7UoI!n..urVurIr;ZiHrW!#K!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHlMpq6p&G*Ar;ZiHiW&u-l2Uh5p&G*Ag].?'JH16$
+pAk4;s&JRg"n1$_]!AI;WX,Z/Z+8!/n,KTiWqZPlWW96nrs\PQ_mZeMX0/hDbi&<Urs+j7iW&h%
+Hi3^>s*"e9s8W%AHN0CWh#@<Xrc`\gs*&\bs8R<ArrSU4h#@<Yrc`\gs*&\Pq#CA<r;Ze@rr<"B
+rr<"Brr<"B&+0Dsrc`Ves,2*fs8W%AGPV7?c^'%ZG5umes8R9RmJm4cGBj/fN-FXgs8@.cqYpeZ
+GO5A0rHEJbrt2nfVZ6XIHM[[AGB`HSs8I4err3&GQ@AgW!-nMCs*"k<s8W(BGO>G1rc`Vds8R<C
+rrS:+kCNYas5a1\N;rV,"J,Vj<E4P~>
+s!$_.!7THu!7UoI!n..urVurIr;ZiHrW!#K!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHlMpq6p&G*Ar;ZiHiW&u-l2Uh5p&G*Ag].?'JH16$
+pAk4;s&JRg&^Z861)UB"!!!-4(G9!NdJjaV!!!)ps8;ot&+]`/i/UMX'*A=G+?aD6n)F?QrdK+e
+s7ghfrqZToG7"0Hs8$qes*o7err33#GCBMkGB`ubs*+GA!e5Fgrr36$GCBMkGB`oYs8R<@s8R<B
+s8R<Bs8R<Bs8R9Rqu?]pGBs5gI!>Jfs8."aqYpZs^lNmBG5umes8R9Rqu?]pGBs5gI!>Jfs8$q`
+qYpeJGPhF?qKI/_rtg]>f`1kqIK'9HGB`ras8@.es8W)6O*pqN!-nMCs*"kJs8W%AGPhF?rHEPd
+s8R<CrrRUmq18Qss5a1\M?!;'"I]>f<E4P~>
+s!$_.!7THu!7UoI!n..urVurIr;ZiHrW!#K!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHlMpq6p&G*Ar;ZiHiW&u-l2Uh5p&G*Ag].?'JH16$
+pAk4;s&JRg&^Z861)UB"!!!-4(G9!NdJjaV!!!)ps8;ot&+]`/i/UMX'*A=G+?aD6n)F?Pr-Nbf
+s5A3gq#CA<$2so(lZ\<fH[#Adrs&(=NrT-'GPqL@GQ%OCH[#Adrs/.>NrT-'GQ%=:s*+D@s*+JB
+s*+JBs*+JBs*#"Ps8Vk<IK0=nGQ%RAm!![Mrr`/)ML,8G!."SDs*#"Ps8Vk<IK0=nGQ%RAlZ[RL
+rs*jorVuo`GBa&d#(_!fs7CT!rr<"B$iU,*pih/ds80-[HN&*gH2djDG74BLs7ge^rVuomGC]\m
+s*+MC!d](gJcC<$jSo74s7XtGOT>5X<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#qZ$WFq#CWJ!!(IJ!7UiG!7U66!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHp]19ArW)oGrr<)K!<1IH!<1FJ!7UoIrmUTA
+s3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gp&G*Aqu?cH!<1II!!1OKrmUfGs3poH!7UoI
+!7UiG!7QK!JH5EEs!%JChu<\[ri,t#\,QI$qKDqHq>^J=!;uir%sN9uI!9j]G^+FVGlRefGPqL@
+GQ%ONI!9j]G^+FVGlRefGQ%=:s*+D@s*+JBs*+JBs*+JBs*+GAs*+MC!dT"grr<"BqYpfQGED+g
+s*&\ds8R<As8R<CrrRIir;Q`rGP_=@H$B2cs8R<Brs&.?IfK"`NW/tXGQ%RAGQ7[JfQWGBrVq(c
+rr<"BrVunArVunArr<"Bs8N.HGQ!*mJcFg2!K@'Pg]X2Kqc-XH~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#qZ$WFq#CWJ!!(IJ!7UiG!7U66!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHp]19ArW)oGrr<)K!<1IH!<1FJ!7UoIrmUTA
+s3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gp&G*Aqu?cH!<1II!!1OKrmUfGs3poH!7UoI
+!7UiG!7QK!JH5EEs!%JChu<ZerVup)\,QHkqKDr&q>^J='E8%3rc`VeG^"FYG^+FVGlRefGPqL@
+GQ%ONG^"FYG^+FVGlRefGQ.C;s*+D@s*+JBs*+JBs*+JBs*+GAs*+MC#C(Ils8W(BGP_=EX`pr<
+rr.+crr<"BrVunAs8N=KGQ.XBrc`S_rs*dmrr<#tGBa&d#3L,`s5S=,rr<"BrVunAs8N>+GHUK8
+rc`Scs8R<As8R<As8R<Bs8R<CrrI@gJcC<$j8T.:s7Y.LRK34b<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#qZ$WFq#CWJ!!(IJ!7UiG!7U66!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHp]19ArW)oGrr<)K!<1IH!<1FJ!7UoIrmUTA
+s3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gp&G*Aqu?cH!<1II!!1OKrmUfGs3poH!7UoI
+!7UiG!7QK!JH5EEs!%JChu<ZerVup)\,QH8qKDr4q>^J=rr3Q-GC':6GBnIYG^"@Ws8R:er;Ze@
+rVm:NGBnIYG^"@Ws8R:ep](8;r;Ze@rr<"Brr<"Brr<"BrVunAs8N+EGQ.UDr-*A]rs+R.`V'9/
+GBa&ds*+GAs*+MC!I/hfrrW+BGP_=?G^'/e!rR7drr325GHChGGMrK#s*+GAs*+MC#EF#Ip&Fr6
+GQ.XBGQ%RAGQ%RAGQ.XBGQ7[DG^"`=JcFd1!J:@FeHD!7qGgOG~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,01Ge+s%Hdf9BsrVurIr;ciGm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LD!!(LH!!:ULe,97Kdf@kGrW!#K
+!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(LA!!(LG!<:OI
+!!C[M!7UoI!7UlH!7UlH!7UoI!7UiG!7QK!JH5EEs!%JChu<\Zri,t(\,QNSGE`%+!p4]\q>^J=
+$1.]lrHESfP'?-cs8R<@s8R<ArrS@-kkY8YGPD.;GPqL@GQ.XBGQ.XBGQ.XBGQ%RAGQ7[JMg+Rg
+s8@.cqYpeWGO5A0r-*Aas8R<As8R<Crs+L,m/R+aGB`o`#E3lns8W%AGQ%OFX`qG-GL$3fs*+GA
+s*+MC#DmZks8W"@GQ.XBGQ%RAGQ%RAGQ.XBGQ7[EOE]l=s+142rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,01Ge+s%Hdf9BsrVurIr;ciGm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LD!!(LH!!:ULe,97Kdf@kGrW!#K
+!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(LA!!(LG!<:OI
+!!C[M!7UoI!7UlH!7UlH!7UoI!7UiG!7QK!JH5EEs!%JChu<ZdrVup9\,QMsGJO4X!l0#Iq>^J=
+$2ac&qfdGfI<YP`s8R<@s8R<ArrRUmqYC0kGPD.;GPqL@GQ.XBGQ.XBGQ.XBGQ%RAGQ7[JI!>Jf
+s8."aqYpeIGPhF?pigr]s8R<As8R<Crs*pqqu?]mGB`o`#CLams8Vq>GQ%OFLNi!QGOth6s*+GA
+s*+MC#CC[ls8Vk<GQ.XBGQ%RAGQ%RAGQ.XBGQ7[EI<YL<s+142rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,01Ge+s%Hdf9BsrVurIr;ciGm/R7;!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LD!!(LH!!:ULe,97Kdf@kGrW!#K
+!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(LA!!(LG!<:OI
+!!C[M!7UoI!7UlH!7UlH!7UoI!7UiG!7QK!JH5EEs!%JChu<ZdrVup9\,QM`GNSo)!g@iQq>^J=
+$2so(m!"EgH?]>`s8R<@s8R<ArrRLjrV?KnGPD.;GPqL@GQ.XBGQ.XBGQ.XBGQ%RAGQ7[JH?]>f
+s6OrRqYpeGGQ%RAiHKMFs8R<As8R<Crs*jorVuo`GB`o`#C:Ums8VD/GQ%OFIWtL?GP_==s*+GA
+s*+MC#C1Ols8V&%GQ.XBGQ%RAGQ%RAGQ.XBGQ7[EH?]:<s+142rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LH!!(LG!<:OI!!(LI!!(LE!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LC!<:OG!<:OH!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf9CGdf9CFe,97He+NbAe,01Ge,97Kdf9Bsq#CEDr;ZiH
+rVurIqu?`GJH16$pAk4;s&Jal!3uO*!O)ImrrE#rWW9W?rr`4LGi8T$"8mIilh^Y]G6tPSs7CMe
+s4MUdq>UMDGPh@=!do4hrr3&QGF\L/s*+5;!do4hrVunArr<"Brr<"Brr<"BrVunAs8N>CGI.>L
+olkWVrs+'unc/XVGBa&ds*+GAs*+MC#KM%ns8V_8GP_=Ea*4fgs7CMZrVm#jGCtd%rVunArVunA
+s8N=SGOb_5m<<dRs8R<As8R<As8R<Bs8R<CrrUVmU4N>qs5a1\N;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LH!!(LG!<:OI!!(LI!!(LE!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LC!<:OG!<:OH!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf9CGdf9CFe,97He+NbAe,01Ge,97Kdf9Bsq#CEDr;ZiH
+rVurIqu?`GJH16$pAk4;s&Jal!#>J@!>#"srrMutrVupP\Gl[-H$K,`rr`%@H2@C;s*"e2s8V2)
+OoMD)aSGi;H$B8drrRIirr2p!WHZGZs8R<;rrRIirr)lsGQ.XBGQ.XBGQ.XBGQ%RAGQ7[JOE]pg
+s5nNLqYpeGGPqL@d<Bg6s8R<As8R<Crs+[1jo>AAGB`o`#Ea5ls8V/(GQ%OEginp/LAh/PGQ%RA
+GQ7[JH$B2ds3Z%7rr<"BrVunArVunArr<"Bs8N.lGLM-CJcFg2!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LH!!(LG!<:OI!!(LI!!(LE!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LC!<:OG!<:OH!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf9CGdf9CFe,97He+NbAe,01Ge,97Kdf9Bsq#CEDr;ZiH
+rVurIqu?`GJH16$pAk4;s&Jal!#>J@!>#"srrMutrVupP\GlZsG^B;err_2(J,T6Ds*"eAs8T?J
+aT%0BkkY5ZG^')c!I/herrS+&kkY8YGPD+<G^')cs*+JBs*+JBs*+JBs*+GAs*+MC#D.0ms8TBK
+GP_=EG^'/es.4FYrr<"BrVunAs8N=UGP(q8Y]k<frs+."o`+rqGBa#c"KZg^H*I8Is*+GAs*+MC
+#C(Ils8S[7GQ.XBGQ%RAGQ%RAGQ.XBGQ7[ELNi-:s+142rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LH!!(LH!!(LG!;k7B!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!<:OG!<:OJ!!(LH!!:ULe,97He+!D@
+df@hse,97He,B=Ie,'+Fe,97Jdf@kq!!:ULe+`nCe+NbAe,04Ge,B=Ldf9Bsq#CEDqu?fI!7UfF
+!7QK!JH5EEs!%JCp&>#urMfkco)A^\rMfk;\GlWrGCobm!lK5NqZ$S>'u8r+VKg#YrM+VBm/?\5
+W;ln#GJ=(Urt;JY^Ae04rM+VBm/?\5W;lmAGPD+>Y'7VZrr<"Brr<"Brr<"Brr<"BrVunAs8N>s
+H@P)QZZgWirs-MeRJH6>GBa&ds*+GAs*+MC#PNLnjnQ'(GP_=Ep3V8Mponsdr;QklGB]SUs8R<A
+s8R<Crs-MeRJH6>GBa&ds*+GAs*+GAs*+JBs*+MC#5aC*a85G@]DqnTpAb/:jT#7(nGiN4[K$8N
+rr<"BeGoPmnc&WKs7Y4NScJXf<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LH!!(LH!!(LG!;k7B!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!<:OG!<:OJ!!(LH!!:ULe,97He+!D@
+df@hse,97He,B=Ie,'+Fe,97Jdf@kq!!:ULe+`nCe+NbAe,04Ge,B=Ldf9Bsq#CEDqu?fI!7UfF
+!7QK!JH5EEs!%JCp&>"3r;ZiCo)A^Dr;Zgt\GlWSGEDb&!g%WMqZ$S>'Vb0hM0S:bqi#g<o)A7/
+RfEDBGM`;u!etpUrr3E(N-W>3rq"R,s8R:ep\t;LGM`;us*+JBs*+JBs*+JBs*+GAs*+MC#Np>i
+o(&T#GP_=EQZp(>igt@<rr<"BrVunAs8N>gG_u"]Tm(_Wrs.e5M=U21GBa#c"TEsrGL-6fs*+GA
+s*+MC#FBYHr8O;lGQ.XBGQ%RAGQ%RAGQ.XBGQ7[Ip3h>@r9^Mrs8R<:s8R<(s8R<4s8R;Ns8R<B
+s8R;ms8R<5rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LH!!(LH!!(LG!;k7B!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LA!<:OG!<:OJ!!(LH!!:ULe,97He+!D@
+df@hse,97He,B=Ie,'+Fe,97Jdf@kq!!:ULe+`nCe+NbAe,04Ge,B=Ldf9Bsq#CEDqu?fI!7UfF
+!7QK!JH5EEs!%JCp&>"3r;ZiCo)A^Dr;Zgt\GlW!GJj@Y!ePX^qZ$S>'X@GpIXCegm!sQ3p\jL#
+MuWg+GO>A/!e,@\rr3DnJ:>l>rU%[as8R:ep\t;DGO>A/s*+JBs*+JBs*+JBs*+GAs*+MC#JkYa
+q<#P<GP_=EKQkrDdDC*Orr<"BrVunAs8N>AGc(8t^it#!rs-GdVYK8gGBa#c"T3XkGO5;.s*+GA
+s*+MC#D@<Nr6`B*GQ.XBGQ%RAGQ%RAGQ.XBGQ7[Igj4k=rT'6Us8R<:s8R<(s8R<4s8R;Ns8R<B
+s8R;ms8R<5rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!(LH!!(LI!!(LB!!C[M!7UlH!7UK=!7UcE
+"4I5Me*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsp](<Cr;ZoJ!7UlH
+!n..ur;ZoJ!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97H
+e+NbAe,01HdfBBrrVurIq#CEDqu?fI!7UfF!7QK!JH5EEs!%JCp&>$(rMfkGo)A^ArMfkL\GlW4
+GH1T@!qLP`qZ$S>"T53FK>.?b,Q>rUJ9Z[=df9@@UOdZ6s8VefJTuD=s8L92J9Z[=df9>kGPD+C
+p7m1`GQ7\eGQ.XBGQ.XBGQ.XBGQ%RAGQ.UHk`^:PjEGkFrs/J,J9m[PGBa&ds*+GAs*+JB#3qCt
+NoP>-q>UZaPBi2KGB`ub"6t)Tm/?taGQ%RAGQ7[Jr3:cuRdPBDrr<"BrVunArVunArr<"Brr3/t
+Z%[FY^q9XHGP;(:GNAf(GPV:=GP_@>GQ7[Im^8(%H]Yu;rs.JbMLBr5ZK1WWs**?"s*+JBs*)um
+s*+#5!K@'Pg]X2Kqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!(LH!!(LI!!(LB!!C[M!7UlH!7UK=!7UcE
+"4I5Me*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsp](<Cr;ZoJ!7UlH
+!n..ur;ZoJ!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97H
+e+NbAe,01HdfBBrrVurIq#CEDqu?fI!7UfF!7QK!JH5EEs!%JCp&>"Kr;ZhDo)A]Gr;ZhR\GlVa
+GMi>u!oJ3UqZ$S>"S\:/MUMM(,Q5EAI<gUIhuE`AR!j4's8VAOI<]u9s8B`sI<gUIhuE_#GPD+C
+lBm!EGQ7\eGQ.XBGQ.XBGQ.XBGQ%RAGQ.UHd#!%:pNLlYrs/@oI!qmhGBa&ds*+GAs*+JB#1ABS
+RJ1oLq>UZIMKtWaGB`ub"3>\3qu-QpGQ%RAGQ7[Jq4`7bVYbR]rr<"BrVunArVunArr<"Brr3/l
+V1<iQd(B>XGP;(:GNAf(GPV:=GP_@>GQ7[IiN.i\I[84Srs8VQVMBMLOh:/Ts8R<"s8R<Bs8R;m
+s8R<5rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!(LH!!(LI!!(LB!!C[M!7UlH!7UK=!7UcE
+"4I5Me*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsp](<Cr;ZoJ!7UlH
+!n..ur;ZoJ!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97H
+e+NbAe,01HdfBBrrVurIq#CEDqu?fI!7UfF!7QK!JH5EEs!%JCp&>"Kr;ZhDo)A]Gr;ZhR\GlVY
+GOk\3!igIHqZ$S>"QPJePNr/I,PJL(I!^gXm/R+6OaD=ss8UN0H['c7s7WgZI!^gXm/R*0GPD+C
+dZJm$GQ7\eGQ.XBGQ.XBGQ.XBGQ%RAGQ.UH]RkL1q0.2^rs.eSH@iX)GBa&ds*+GAs*+JB#/5_:
+W;Lj`q>UZ5K6sQpGB`ub".".]rVccrGQ%RAGQ7[Jl'?XI\,CMprr<"BrVunArVunArr<"Brr3/Y
+Rs]RNj1G?kGP;(:GNAf(GPV:=GP_@>GQ7[IeY@bBJtCcors8SESqMBBRDo$os8R<"s8R<Bs8R;m
+s8R<5rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:`Gr6kWGqpYHC!7UoIrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZArR:`GrR:cH!7UlH!n.,LrmLlJe,B@He+WhBe,B=Kdf9CGe,KFHe,KCJ
+e,97Jdf9CIdfTU!!!)uHrW)lFp](<Cqu?`Gq>^NEqZ-QCr;ZiHq>^NEJH16$pAk4;s&Jal!71VD
+!O)1grrMerrMfkbJcEjl!rR7hao;G.GD1VJq#CA<jT#7(q>^J=pAYAT_s@9m[s+2:rsJV!H*-*&
+p>)HfY4VboGM`B"GQ.XBGLZZmGOb\6N;rV,"J,Vj<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:`Gr6kWGqpYHC!7UoIrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZArR:`GrR:cH!7UlH!n.,LrmLlJe,B@He+WhBe,B=Kdf9CGe,KFHe,KCJ
+e,97Jdf9CIdfTU!!!)uHrW)lFp](<Cqu?`Gq>^NEqZ-QCr;ZiHq>^NEJH16$pAk4;s&Jal!-.r;
+!>"5_rrM'ir;Zi@JcEjl!r7%hao;FdGF=$^q#CA<jT#7(q>^J=pAYAac11f"Tm*sCrsJ:[HFiA=
+o?rbH_Y!m.GM`B"GQ.XBGLZZmGOb\6M?!;'"I]>f<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:`Gr6kWGqpYHC!7UoIrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUfGs3pZArR:`GrR:cH!7UlH!n.,LrmLlJe,B@He+WhBe,B=Kdf9CGe,KFHe,KCJ
+e,97Jdf9CIdfTU!!!)uHrW)lFp](<Cqu?`Gq>^NEqZ-QCr;ZiHq>^NEJH16$pAk4;s&Jal!-.r;
+!>"5_rrM'ir;Zi@JcEjl!p"Qjao;F/GKtd>q#CA<jT#7(q>^J=pAYAnf(T(&Lj.\QrsIS8K?!EZ
+nAg-2g%>=EGM`B"GQ.XBGLZZmGOb\6K)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*d/X0q^&\,\rr<&JjT,8.JH16$pAk4;s&Jal!9j?\!OhFirrM8frMfk,JcEgk
+!q:Dfao;G#GIiA*q#CA<jT#7(q>^J=nc&[hGBs/e"8\(*g&1jPrl')Pp&G&9hZ*V"rr<"BeGoPm
+nc&WKs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*d/X0q^&\,\rr<&JjT,8.JH16$pAk4;s&Jal!5&./!@?%brrKPHr;ZgFJcEgk
+!nhdbao;FDGNj\Yq#CA<jT#7(q>^J=nc&[eGC0;g"7ptmmem(erht%Rp&G&9hZ*V"rr<"BeGoPm
+nc&WHs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*d/X0q^&\,\rr<&JjT,8.JH16$pAk4;s&Jal!5&./!@?%brrKPHr;ZgFJcEgk
+!i1%eao;F$GP-Oeq#CA<jT#7(q>^J=nc&[TGDH.s"5/!dq>C6pqMf^Sp&G&9hZ*V"rr<"BeGoPm
+nc&WAs7XtGOT>5X<Ib~>
+s!!!oJH2nS!7QK!JH4:%s!%JCp&>'l]_e]2]?]*drnmn7f?1JtWW:q-s31KIQ/qo0P^(EprrW"h
+LR%o>G74D\K7C'(rNq3)U\t,ks*+JB&,NVfH&'07s*&\d\Uf.$q>UBuq7qZ/Ks1CQrs&G=OaMSF
+gA_-PGPV:=GP_@>GP_=@rHESdrrT0Ebkh>KriC@bs8W&1N-]l8a8c$\s8N<!^k?ueYP\>!s*"VD
+WdBE7rr33$_NB4oRG.Z?s*+JBs*"VDWdBE7rr33$_NB4oRG.Z?s*"kIT6^J:l'$FRj`bqErs%eR
+HB.'1GQ.UHrPF\EI@8gdrrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH2nS!7QK!JH4:%s!%JCp&>'l2Z!I]1i85BUSFQOLLD>&!!&[Cs31KIWpK`CIX1A(rrVeC
+T9]HVG74>JItYT:qPJdnZi9t(s*+JB&+QQLH&p>Ps*&\bW-j)urr2p%nudFfMnT,hrs&A.ML'fI
+mJd.cGPV:=GP_@>GP_=@qKIAerr`7VGjP;,%K;3/mJm4_Y(h4NRb%N9GQ7[InudFfMnT,hs8R9G
+pmQJdeGfIPqmD<-J>2H1s8R<Bs8R9GpmQJdeGfIPqmD<-J>2H1s8R9No9":ts3Z^LReV)Nq>UZK
+MKtZcGBa&d#5bfcH@VaWqu6\Rs7Y.LRK34b<Ib~>
+s!!!oJH2nS!7QK!JH4:%s!%JCp&>'l2Z!I]1i85BUSFQOLLD>&!!&[Cs31KI]Cc$KH[bb4rrVG4
+`KgK'G7*o2I#6DRlC!$S`r5r;GQ.UQi15=DRH+>IGB`VHHA'07rr3/dTR2$Kc2IYHm\tkbKWb+L
+s8R<=s8R<>s8R<>rrVJ0OT,7^qgNneqYq$$IX:ehs6QP5G_2aSs8.$?rrqY[H[Cq#rVunA"QYSh
+PjA>K#4AIDH%`?qrr<"Brr<"B"QYShPjA>K#4AIDH%`?qrr<"B$epG]s8T`aI&d*gGPV7C^k@*8
+r-*Aars%njKR&6Rq"t'lK)bPp"H`]\<E4P~>
+s!!!oJH16$JH1B(s!%JCo`"sZXR)qf_>]#cbl7k-S:,^Fbf]qfGBoDAQ2gl.$cq$!`HSGeg&/g5
+RK!6dGQ7[lqi,m@q=M?"s*&\.g\em3Q2gm]K@0Vk_0;+Cs8AL6`;/tpH.W)rGB`l_s*+>>s*+A?
+"8'6N[/U(En99]gs7V>:GBa)enooces1EQPo)7m]s8R:erVm-"K@0Vk_0;+Bs8R9V^uY9dGfB^]
+SU&0Lnst'Xs8R:err<"B+2Ht4Uj0lYrLJ5Pq=:)%fDkkpGIuo)s7L\fk4l6+GP_=Pp3V8Lpo\gb
+s8W%gH,TOLSU&ibrrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCo`"s7#ODEk8,e)>bl7jpPBqVEhTGj#GC#qZQ2gl.$`E1aVK^a[kPD'"
+_Z'T8GQ7[lp3h>?qs:?_s*&[dl1q&t]`8$+N8aa+X*:uOs8%IsebnZbHh7:;GB`l_s*+>>s*+A?
+"7E"2d/O%afQX"gs6>0:GBa)ehfkFes,qTCp\a'Is8R:erVm,sN8aa+X*:uNs8R9VU%.Z/Gj>>*
+L3qJKl%FETs8R:err<"B+//5pLj84bqM'@Ir98l]oDei7GF\0Ys6"W`o(&T#GP_=Pl?J-TnXt)M
+s8VqMHe&&YKR<=grrIuVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCo`"s7#ODEk8,e)>bl7j`Mg9iJo#gt7GC?apQ2gl.$`W[hMKeE]nb%c`
+kl1V^GQ7[lgj4h;rSs1Cs*&[fo(.Z]jo>A9SEp.=O*BO^s6G)gj8I\[M#./OGB`l_s*+>>s*+D@
+"TIP@IdI(6)l@i-s8U5ib]e:2s/C4es8R[peGB$pP5kQ+GQ%OHgmm^/lAp/Irr<"B'<q8mIXCeg
+l[=QKrRu[UqZ$S>GQ.XBG9='ajF2ILs6G)gj8I\[M#./OGB^1`])TTkVtfDjGB`o`'#f*lpuK57
+GQ7^/I>?k]g3neRr;QeLs7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCoD\jUY3r:j_>8`_JcD>As*"jQs8Vq>HEI5IqKI>ds8R<CrrUVmU&4li
+G6P2Ms8$qeqYpg"GC';hgNT1ers&+>L&_0sGQ.X8GQ7^CGQ%R@G6*'/rVmPLGI7DM_KWb=GQ7^@
+GC';hI!=!8s8R<<rrW1DHN*sEG6tMRs7CMfs4_afrr32pGD6(sGBa&ds*"dRs8V_8KE'\MSGrNn
+oQQ#hs*&[jrr35CGI%8KoQPNUrsZtmYlFapGBa)egNT1errVh:L&CrON;rV,"J,Vj<E4P~>
+s!!!oJH16$JH1B(s!%JCoD\j)%.4)r7Ibs/JcD>As*"k0s8V_8IGt5+oQPres8R<CrrSa8dej(E
+G6R"+s7:GdqYpfuGCKSlXEVnfrs%V0RK*;2GQ.X8GQ7^CGQ%R@G6*9MrVmOjGO,;/Nd'?(GQ7^=
+GC9GjH$A<Gs8R<<rrW+BIfBBIG7!C2s5\Bes/^Fgrr32bGFAL2GBa&ds*"e2s8V/(P5hV-bl7VI
+k'*6ns*&\Jrr34bGNSr*k')%GrsY'7jo>A@GBa)eXEVnfrrV>,RJd'cM?!;'"I]>f<E4P~>
+s!!!oJH16$JH1B(s!%JCoD\j)%.4)r7Ibs/JcD>As*"kBs8UJjJb/pAd<DMfs8R<CrrRt"mJHq`
+G6RU<s3>h`qYpfjGEi.-N-FUers#iSc2[ffGQ.X8GQ7^CGQ%R@G6*`orVmO^GP;(:JTnhPGQ7^+
+GE)Y&G^&]Ts8R<<rrV_7PlC^_G7!pAs0-^gs,;0frr320GKp0fGBa&ds*"eAs8T<IaT%3Cli-nh
+[!0dps*&\Zrr34TGP2"9Z?LNhrsXO(o`+rpGBa)eN-FUerrTQOc2@SBK)bPp"H`]\<E4P~>
+s!$b/!7U66s3pH;qpYKD!7UlHrR:WD!7UlHrmU?:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:
+!7Tj+!7UWA!7Ta(!7U66s3poHrR9j.!Rh&Gdt%LY!<48C<V$.koZ=0)WWKTardk*#s.02iG73g<
+s8I4dmJm4cGBj,es*+MC!g%Whqu?\?"mu?irc`VdrrUN4If=NpGlRf3GMN2t#6&gms8R:err;Y8
+s8W+Cqu6cdVg,`Nrs=[/li7!BGOfs%rr3:KGlRfKGBf7hmJd.cGPqIBc^'%ZG5umes8R9Lm/R+a
+GC':WGMN2t#6&gms8R:err<"B$1.]lrHESfR<RHcrs/OIHN4"hGO#2-#E*fms8W%AGP_=JN-FXg
+s8@.cs8SL2h#@<Trc`\drrJ)Yp=oeB!;fbrJ,~>
+s!$b/!7U66s3pH;qpYKD!7UlHrR:WD!7UlHrmU?:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:
+!7Tj+!7UWA!7Ta(!7U66s3poHrR9j.!Rh&Gdt%LY!<48C<V$.ki*HTX!!4=4rdk*#s.02iG74<J
+s8@.cqu?]pGBs2fs*+MC!e#:gqu?\?$iBu(rHEPes8KfpI/\<nGlRenGPD+:#5i[ns8R:err;Y8
+s8W+Cr;Qp!k)O`<rr3a]GP_@>I!>F2GQ7^BGBj/fMKa<<bP2#9s*+GA"9-)sI/\<iGlIaCG7"0H
+s8$qes*o7err33#GCBMkGBa&ds*"eHs8Vq>I/e\?p\t0tr-*Shs*&\`rr34NGPhF?qfd8\rsX:!
+qu?]mGBa)eIs:YdrrW+BIJj*GM?!;'"I]>f<E4P~>
+s!$b/!7U66s3pH;qpYKD!7UlHrR:WD!7UlHrmU?:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:
+!7Tj+!7UWA!7Ta(!7U66s3poHrR9j.!Rh&Gdt%LY!<48C<V$.ki*HTX!!4=4rdk*#s.02iG74BL
+s7ge^rVuomGC]\ms*+MC!d](gqu?\?$iU,*pih/ds80-[HN&*lH2mnkGPhC>#4m&!s8R:err;Y8
+s8W+Cr;QotgOXeBrr3a[GQ%RAH$Ah'GQ7^>GC9GjJ9Q7>e,94Fs*+GA"8fE^HN&*gH2djDG7"6J
+s6Flfs*Jterr32oGE2_'GBa&ds*"eJs8VD/N;n6Kqu6U#o665ps*&\crr34LGQ%RAm!![MrsX3t
+rVuo`GBa)eH[#AdrrVe9Nr8nXK)bPp"H`]\<E4P~>
+s!%.:!7UZB!7U35!7U66!7UoIs3prI!7UlH!7UlHs3prI!7U?9!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(L;!!(L+!!(LA!!(L3!!(LB!!(L5!!(LI!!(LH!!(LC
+!!(L;!!:ULdt%LT!<48C<Ug"mq;KT6['6Y2WWoQ/\AZq`rdk*#s-s&gGQ%RAGQ%RAGQ.XBGQ7[E
+H?]>bs8R<As8R<Crta72OQufEGBa)eI!9j]G^+FVGlRefGPV:=GP_@>GP_=@qKI;cru69.r;ZeC
+GPu`0s8Vt?I/j6E\;5?QH+EtTGBa#c#M=6^lM^a,GQ.XBG6%R?rss<us*T$9H$FRXGBj/fGBa&d
+s*"J@rr3ORGlN/8H$OXZGB\<3s*&\crr3%FGQ%O@s*+>>!dT"frr<"Bs8N@PGBnIYG^"@Vr;QeV
+s7Y4NScJXf<Ib~>
+s!%.:!7UZB!7U35!7U66!7UoIs3prI!7UlH!7UlHs3prI!7U?9!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(L;!!(L+!!(LA!!(L3!!(LB!!(L5!!(LI!!(LH!!(LC
+!!(L;!!:ULdt%LT!<48C<Ug#"n"jbc+;+kY!!*9<.o(Z6rdk*#s-s&gGQ%RAGQ%RAGQ.XBGQ7[D
+G^'#as*+GAs*+MC(9Me`nc&N3GQ7\fGBnIYG^"@Vs8R:eq>^J=qZ$S>qYpWgGCfbn)gHT+s8R=f
+rc`Sds7UYhs8VenJTl<aeGoPmGQ%OHX`pr<rr.+crr<"B'E8%3rc`VeG^"FYG^+FVGlRefGQ.XB
+G81&Vs8I4es*/a5H$FRXGBj/fGBa&crs*dmrr<#tGB`o`&pSX"s8W(BGQ7\fGBnIYG^"@Vr;QeS
+s7Y.LRK34b<Ib~>
+s!%.:!7UZB!7U35!7U66!7UoIs3prI!7UlH!7UlHs3prI!7U?9!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(L;!!(L+!!(LA!!(L3!!(LB!!(L5!!(LI!!(LH!!(LC
+!!(L;!!:ULdt%LT!<48C<Ug#"n"jbc+;+kY!!*9<.o(Z6rdk*#s-s&gGQ%RAGQ%RAGQ.XBGQ7[D
+G^'#as*+GAs*+MC(63UXp&Fr6GQ7\fGBnIYG^"@Ws8R:eq>^J=qZ$S>qYpWDGFea5!I/hfrt]j'
+rHEJcs4MUos8V2RHZs[dmf3<2GQ%OHNd&J8s87(brr<"Brr3Q-GC':6GBnIYG^"@Ws8R:err<"B
+rr3Q-GC':6GBnIYG^"@Ws8R:erVlnCGQ.UDr-*A]rrI@grr3H*GBa)eG^"FYG^+FVH2R[CK)bPp
+"H`]\<E4P~>
+s!$b/!7U35!7U97!7UoI!n..urVurIr;ZiHrW!,N!7LoJe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L,!!(LA!!(LH!!(L-!!(L5!!(LI!!(LH
+!!(LC!!(L<!!C[M!7QK!L]IH!s&FXMJcC<$q>^J=rVunArVunArr<"Bs8N.^GN\l's*+GAs*+MC%
+#K2ps8W"@GQ7]+GNel&s*+;=s*+>>s*+;=!I&efrsjm0mJm3CGOp$&s8UbrX8Mu&m^m[hs8R:er
+Vm+ZGO5A0r-*Aas8R9Lm/R+aGC':PGNel&s*+JBs*"e9s8W%AHN0.PkkY8YGQ%OHMg+Rgs8@.cq
+Ypt_GO5A0rHEJcs,qTipAY/Ps7Y4NScJXf<Ib~>
+s!$b/!7U35!7U97!7UoI!n..urVurIr;ZiHrW!,N!7LoJe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L,!!(LA!!(LH!!(L-!!(L5!!(LI!!(LH
+!!(LC!!(L<!!C[M!7QK!L]IH!s&FXMJcC<$q>^J=rVunArVunArr<"Bs8N.KGPV.9s*+GAs*+MC%
+"!3qs8Vk<GQ7\kGP_.8s*+;=s*+>>s*+>>!rdCgrr3IUGPhF?I!>F2GQ7]KGLHEh#N`"1IfKFlG
+Q%OHH[#Aes7ge^rr<"B$2ac&qfdGfI<YP`s8R<Bs8R9Lqu?]nGC9F=GP_.8s*+GA#CLams8Vt?G
+P_=JI!>Jfs8$q`s8RLkqY'piM?!;'"I]>f<E4P~>
+s!$b/!7U35!7U97!7UoI!n..urVurIr;ZiHrW!,N!7LoJe*R,8e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L,!!(LA!!(LH!!(L-!!(L5!!(LI!!(LH
+!!(LC!!(L<!!C[M!7QK!L]IH!s&FXMJcC<$q>^J=rVunArVunArr<"Bs8N.HGPq@<s*+GAs*+MC%
+!d'qs8V&%GQ7\hGQ%@;s*+;=s*+>>s*+>>!rI1grr3IRGQ%RAH$Ah'GQ7]'GO>A/#l`YDGE`(,G
+Ba#c#C1Ols8V&%GQ.XBG7"6Js6Orgs*Anfq>^J=rr<"B$2so(m!"EgH?]>`s8R<Ars*jorVuoaG
+B`o`%!m-rs8VD/GQ7\hGQ%78!J:@FeHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8qZ$WFq#C`M!!(IJ!7LoJe*$c5
+df@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L9!<(CG!<(CH
+!!1OKrmUiHrmLlJe,B@He+WkBdfBHtr;clHr;cfFrr<)K!<1IH!<(CG!<(CE!!(LI!!:UL!<1FK
+!7LrIe,KFHe,9:Fe,'+Jdf9Bs!<1Gu!/ppX,6(Yos+13$s7u]pGQ%RAGQ%RAGQ.XBGQ7[EdW_G_
+s8R<As8R<CrsXF%nc/XVGBa)eflrt^s8R<=s8R<>s8R<>rrW"?IK'6U\p(dds1ropGB`c#H*7#D
+#QAplrr7@iqu6U#J9UP`s6Y#Srr<"B$*jO1oQPoeflrt^s8R<Bs8R9LZ2ajrGCokJGF\L/s*+GA
+#K:nns8Vb9GP_=Ja*4fgs7CMZs8UbrSG)s`N;rV,"J,Vj<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8qZ$WFq#C`M!!(IJ!7LoJe*$c5
+df@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L9!<(CG!<(CH
+!!1OKrmUiHrmLlJe,B@He+WkBdfBHtr;clHr;cfFrr<)K!<1IH!<(CG!<(CE!!(LI!!:UL!<1FK
+!7LrIe,KFHe,9:Fe,'+Jdf9Bs!<1Gu!/ppX,6(Yos+13$s7u]pGQ%RAGQ%RAGQ.XBGQ7[ESp/Z\
+s8R<As8R<CrsX0sr;ZfEGBa)eWHZGZs8R<=s8R<>s8R<>rrV\6KDtl[Lj/:es,D6ZGB`PaHGfUZ
+#Q8jks8R@grr2p&H$B2ds3Z%7rr<"B$0D3ej`cjeWHZGZs8R<Bs8R9Ljo>ABGEMp)GKBU[s*+GA
+#EX/ns8V5*GP_=JOa#pes5\BJs8T'BaS,W7M?!;'"I]>f<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8qZ$WFq#C`M!!(IJ!7LoJe*$c5
+df@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L9!<(CG!<(CH
+!!1OKrmUiHrmLlJe,B@He+WkBdfBHtr;clHr;cfFrr<)K!<1IH!<(CG!<(CE!!(LI!!:UL!<1FK
+!7LrIe,KFHe,9:Fe,'+Jdf9Bs!<1Gu!/ppX,6(Yos+13$s7u]pGQ%RAGQ%RAGQ.XBGQ7[ELNi._
+s8R<As8R<CrsX-rrr<"iGBa)eMg+C\s8R<=s8R<>s8R<>rrU;dWW)o,Is:\fs+,C.GB`8FJD9r#
+#5*1ds8R=frVm+IGQ.XBSp,DXs8R9Lo`+rrGKBfBGNel&s*+JBs*"eAs8T?JaT%0BkkY8YGQ%OH
+Jp6nfs0?imqYptUGP(q8Y]k<ks,2*bpAY/Fs7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IF!!(LE!!C[M!7UoI
+"Od>NdfBBrm/R7;!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L:
+!!(L;!!(LH!!:ULe,97Kdf@kGrW!#K!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=I
+e,'+Hdf@kq!!(LH!!(LI!!q$Rdf9Bs!7TEr!!C[M!7UiG!7UlH!7UlH!7UoIs3prI!7QK!N<&u&
+s&FXM!rmIgmf3<2JcCl4s*+GAs*+GAs*+JBs*+MC$N#g.a85G@s8R:erVunAs8NkRGFA9oRs0)V
+s8A^;Z0_G`gSk/PGB`l_s*+>>s*+MC#EdU4rofu!\c2U;l?A3es7V;8G_)*dk5G;qNm[S!g382L
+s/pR[rr<#;GFA9oRs0)Us8R9V^ub?gGf0R[UNj'1rV,'Fs8R:err<"B'>W`)VKg#YrM+VBm/?\5
+W;lmAGQ%OHom2,Mq6P9hrr<"Bs8N`*H[b)OY]k<ks8A^;Z0_G`gSk&M!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IF!!(LE!!C[M!7UoI
+"Od>NdfBBrm/R7;!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L:
+!!(L;!!(LH!!:ULe,97Kdf@kGrW!#K!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=I
+e,'+Hdf@kq!!(LH!!(LI!!q$Rdf9Bs!7TEr!!C[M!7UiG!7UlH!7UlH!7UoIs3prI!7QK!N<&u&
+s&FXM!rmIgmf3<2JcCl4s*+GAs*+GAs*+JBs*+MC$MJmqf_k-:s8R:erVunAs8Nk$GJ!e4Sp,DY
+s8.b#_t*fud[L49GB`l_s*+>>s*+MC#G^5Rr8*6Sg]%3]aEO]bs65'7H%_Tuo)8RrT%j,=aENjJ
+s+YaSrr34iGJ!e4Sp,DXs8R9VU@Rl3Gj58*N-W>3rq"R,s8R:err<"B';G'gM0S:bqi#g<o)A7/
+RfED3GQ%OHkBMpUnt^JRrr<"Bs8N_rG_u"]Tm(_\s8.b#_t*fud[L+6!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IF!!(LE!!C[M!7UoI
+"Od>NdfBBrm/R7;!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L:
+!!(L;!!(LH!!:ULe,97Kdf@kGrW!#K!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=I
+e,'+Hdf@kq!!(LH!!(LI!!q$Rdf9Bs!7TEr!!C[M!7UiG!7UlH!7UlH!7UoIs3prI!7QK!N<&u&
+s&FXM!rmIgmf3<2JcCl4s*+GAs*+GAs*+JBs*+MC$J]rbjSe/)s8R:erVunAs8NjfGLZQ<_KU5(
+s6P8bd.dM+aG^)uGB`l_s*+>>s*+MC#I<Ojq9j_=nc&OsR!7<bs2]W4HAA-4qYgF%XlTERX*;5V
+s*f1Zrr34VGLZQ<_KU5's8R9VZ2!F0HhRL+J:>l>rU%[as8R:err<"B'=%>oIXCegm!sQ3p\jL#
+MuWg$GQ%OH_0DsTk/)=drr<"Bs8N_LGc(8t^it#&s6P8bd.dM+aG]ur!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UlH!7UiGs3prI!7UoI"Od>N
+e'n9r!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7U?9
+!7UE;s3plGs3poH!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!!)rG!!)oFr;ZiH
+rW!2P!7Lqsdf@kq!!C[M!7UfFs3piF!7U]C!7QK!N<&u&s&FXM!rmIgmf3<2JcCl4s*+GAs*+GA
+s*+JBs*+JB$2Li[G_j08s*&\cs8R<Crs/J,J9m[PGBa&d$i\D=J9Z[=df9>kGPV:=GP_@>GQ7[I
+lE#_bJ==j`rr`4^H//&l(@/)WG_)[Xs8VefJTuD=r3:cuRdPBDrr<"B"T53FK>.?b$i\D=J9Z[=
+df9>kGQ.XBG6IiBH\9'3rsShNR=KO6T[Nl?GB`ub#3_7rNoYD/rr<"Brr32fPBi2KGBa&d#QDu9
+J9Z[=des+GN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UlH!7UiGs3prI!7UoI"Od>N
+e'n9r!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7U?9
+!7UE;s3plGs3poH!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!!)rG!!)oFr;ZiH
+rW!2P!7Lqsdf@kq!!C[M!7UfFs3piF!7U]C!7QK!N<&u&s&FXM!rmIgmf3<2JcCl4s*+GAs*+GA
+s*+JBs*+JB$1XjBH'$DQs*&\cs8R<Crs/@oI!qmhGBa&d$iRl)I<gUIhuE_#GPV:=GP_@>GQ7[I
+gnK@EK;.?'rr`.HHM-q1(>Ya:G_N?us8VAOI<]u9q4`7bVYbR]rr<"B"S\:/MUMM($iRl)I<gUI
+huE_#GQ.XBG6IZ-H&C&LrsSe@PC7_3WSdaUGB`ub#1/3PReM#Nrr<"Brr32NMKtWaGBa&d#Q;H%
+I<gUIhu*KTM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UlH!7UiGs3prI!7UoI"Od>N
+e'n9r!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7U?9
+!7UE;s3plGs3poH!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!!)rG!!)oFr;ZiH
+rW!2P!7Lqsdf@kq!!C[M!7UfFs3piF!7U]C!7QK!N<&u&s&FXM!rmIgmf3<2JcCl4s*+GAs*+GA
+s*+JBs*+JB$/V/!H^Wpos*&\cs8R<Crs.eSH@iX)GBa&d$hgreI!^gXm/R*0GPV:=GP_@>GQ7[I
+cC00,LTL%Err_b:K)>3?(=/FtH&TH8s8UN0H['c7l'?XI\,CMprr<"B"QPJePNr/I$hgreI!^gX
+m/R*0GQ.XBG6HrcH'@OmrsSP-NI6)3ZL%VkGB`ub#/#P7Wqgjcrr<"Brr32:K6sQpGBa&d#PPNa
+I!^gXm/6kaK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66!7UlH!7UlH!7UiGqpPQGe,97H
+e+!D<e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*[29e*[59
+e,04Ge,KCJe,97Jdf@kq!!(L<!!LaNdf@kq!!(LI!!(LF!!(LH!!:ULe,97Jdf@kl!!(LI!!q$R
+!7Lqs!7TEr!!C[M!7U`Ds3poH!7U]C!7QK!N<&u&s&FXMli7!/JcC<$Z2XpsI"1G9s8R;drrW+B
+HfG&+N;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66!7UlH!7UlH!7UiGqpPQGe,97H
+e+!D<e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*[29e*[59
+e,04Ge,KCJe,97Jdf@kq!!(L<!!LaNdf@kq!!(LI!!(LF!!(LH!!:ULe,97Jdf@kl!!(LI!!q$R
+!7Lqs!7TEr!!C[M!7U`Ds3poH!7U]C!7QK!N<&u&s&FXMli7!/JcC<$Z2Xp_H&MORs8R;drrW"?
+IcCA.M?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66!7UlH!7UlH!7UiGqpPQGe,97H
+e+!D<e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*[29e*[59
+e,04Ge,KCJe,97Jdf@kq!!(L<!!LaNdf@kq!!(LI!!(LF!!(LH!!:ULe,97Jdf@kl!!(LI!!q$R
+!7Lqs!7TEr!!C[M!7U`Ds3poH!7U]C!7QK!N<&u&s&FXMli7!/JcC<$Z2Xp?Gbk;ms8R;drrV8*
+Q/_fEK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97He,97He,B=I
+e+WhEdf9Bsr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH
+!!C[M!7U97!7UK=!7UlH!n..ur;ZoJ!7UlH!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZoJ
+!7UlH!n..urW)uI!<CUI!!(LH!!(LI!!(LF!!1OKrmUiH!7UoI!n..ur;ZrK!!(LG!!(LH!!(K!
+!0%!Y,6(Yos6K^bGCfdFs02M0n;;V.meue+Qdk$ps*)Zd!q:Dfir9%<s7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97He,97He,B=I
+e+WhEdf9Bsr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH
+!!C[M!7U97!7UK=!7UlH!n..ur;ZoJ!7UlH!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZoJ
+!7UlH!n..urW)uI!<CUI!!(LH!!(LI!!(LF!!1OKrmUiH!7UoI!n..ur;ZrK!!(LG!!(LH!!(K!
+!0%!Y,6(Yos6K^bGCfdFs02M0gjXn!oDS*uMsfU)s*)Zd!nhdbir9%9s7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97He,97He,B=I
+e+WhEdf9Bsr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH
+!!C[M!7U97!7UK=!7UlH!n..ur;ZoJ!7UlH!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZoJ
+!7UlH!n..urW)uI!<CUI!!(LH!!(LI!!(LF!!1OKrmUiH!7UoI!n..ur;ZrK!!(LG!!(LH!!(K!
+!0%!Y,6(Yos6K^bGCfdFs02M0`-RTspA=*eNqq]7s*)Zd!i1%eir9%2s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,B@Fdf9CFe,01Ge,B@G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He*?u6e+!G:e,B@Ge,KCJe,97Jdf9CI
+dfBHtrW)rHpAb3BrW!#K!!)rGrrE#Hrr<&Jr;ZoJ!!*#I!s$dM!<(CG!;t=G!<(CH!!(LD!<1IH
+!<(CG!!(LF!<(At!/ppX,6(Z(rsP?@bl@^WJH,ZGGC0>hs*+JBs*"YG\Uf.$q>UBul]c^UjEGhI
+rs&>.ML'iHj8T&dS9N3Ws1X$`s8$qdq>^J=$i[\hJ$/hM["Eb$r;Q^#q7qZ/Ks1CQs8R9HrjdT-
+T_\Te#5Q&fH%iI!rr32ePBr8NGBa&d#5uE$I!qF:rr<"B!rAO7JcD/<#lVf3JU)g5]^Ok[s*)fh
+#*n9Jl]cY<ir9%<s7Y4NScJXf<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,B@Fdf9CFe,01Ge,B@G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He*?u6e+!G:e,B@Ge,KCJe,97Jdf9CI
+dfBHtrW)rHpAb3BrW!#K!!)rGrrE#Hrr<&Jr;ZoJ!!*#I!s$dM!<(CG!;t=G!<(CH!!(LD!<1IH
+!<(CG!!(LF!<(At!/ppX,6(Z(rsO@$oDeiJM?!VIGC]\ms*+JBs*"YEW-j)urr2p%e;AO?pigr]
+rs&(oKR&6No`"juJ9UVbs,)[5s7:Gbq>^J=$iHuRKYRQ`VLX3'rr2p%nudFfMnT,hs8R9Hr2>!m
+YQ"P$#4epGHAfK9rr32MMKtZcGBa&d#5bfcH@VaWrr<"B!qVP!JcD/<#l;/qIX6^=`VJNns*)fh
+#-.%hi-ot>ir9%9s7Y.LRK34b<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,B@Fdf9CFe,01Ge,B@G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He*?u6e+!G:e,B@Ge,KCJe,97Jdf9CI
+dfBHtrW)rHpAb3BrW!#K!!)rGrrE#Hrr<&Jr;ZoJ!!*#I!s$dM!<(CG!;t=G!<(CH!!(LD!<1IH
+!<(CG!!(LF!<(At!/ppX,6(Z(rsO0tqZ$SG^&S,VGF\[4s*+JBs*"Y;RX0Y(rr2p%^k@*8r-*Aa
+rs%JUJU33_qu6U'H[#>ds+%f_s3,\Wq>^J=$M'^7M:MXkR='b/rVm&cTR2$Kc2I\BG6RQ+HA'07
+rr3/dTR2$Kc2IYH]RtU3r-*Aars%njKR&6Rq#:<nG66NSG_,m_rs8%uMgKf-V9o2#s8R;hrs$+-
+r6]k?pu;;SK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*iW/l)g&M-%^An8_JH16$li@&0s&G-[$e]`ls8IIqnc.s"M#RGSGQ.XBG::Pe
+r5!TBs8Ve>IcU:,GBa)eqiH-Kqrs)dhuE`0GFAL1IXUbdm!"9]s8R9XaP$L1GHJ%$r5ElJs8VtK
+dJWaTGE`%+s*$!7g\em3Q2gm]K@0Vk_0;+Cs7L\fk4l6+GQ7^ASU&0Lnst'Xs8R:e]ArC3s+14?
+s8R;hrrqJRI<q"!iVrq;s7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*iW/l)g&M-%^An8_JH16$li@&0s&G-[$_V^ks871hr;Y,fT`4ukGQ.XBG:9HT
+q4`)Gs8VA/M"1#.GBa)ep3qGHrS;jMp](8dGL?HgH@#Mhd!)/Ys8R9XVs!oRGM8AGqPJJRs8VhP
+iVi>JGI@GMs*#uml1q&t]`8$+N8aa+X*:uOs6"W`o(&T#GQ7^>L3qJKl%FETs8R:eSFG?cs+14?
+s8R;hrrpi7H@2.;iVrq8s7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*iW/l)g&M-%^An8_JH16$li@&0s&G-[$]'#os7:YfrVr:0g&D$OGQ.XBG:9N_
+o8%VPs8U&_V>0,eGBa)ehKk4IqojAJqu?\PGO>G%I=D.pR<R?[s8R9XWU]Y=GO2'oonmtWs8UlE
+li$+0GMrK#s*#uoo(.Z]jo>A9SEp.=O*BO^s1rrXpu]D:GQ7^/I>?k]g3neRs8R:eXnTDXs+14?
+s8R;hrrp8tH%;[\iVrq1s7XtGOT>5X<Ib~>
+s!!!oJH2/>!7QK!JH5$:s!%JCO8fUYGD-"hI^cEYd<DDcs8R<Bs8R9WYQ+Y!GC9GjaEOlgs7:GY
+s8UPlUAk0(m<=Bds71Aes7LiMXT-[lV"t&jG71PQs8$qcXoJFtGC98e!rdCirr<"B"g@t+qKI>`
+rt56SHN4#bGI%8KoQPNZs4_afrr35qGD6(sGB^6As+138rrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH2/>!7QK!JH5$:s!%JCO8fUFGEr3lL5+giP]u$as8R<Bs8R9WirB&MGCokpP'?$fs5S<I
+s8Sa9ec,R[ds%Mcs5/$cs6,2ljo:Qhhtd<PG73C0s7CM`iW&rMGD#bl!rR7krr<"B"lfR^o65f_
+rt50QIfKG0GNSr*k')%Ls/^Fgrr35cGFAL2GB`,!s+138rrIuVp=]Y<!;fbrJ,~>
+s!!!oJH2/>!7QK!JH5$:s!%JCO8fT`GLHMq\:4)MKQm"ds8R<Bs8R9WoDej9GGG3<K6Qtfs0$Wj
+s8Rn!mf*4tTm,#ds.jkes00"^o`'Sgo(i=cG74$Bs3Z%AoDej<GGk<;!qCK!rr<"B"nVcoc?H&[
+rt4dFPlLc8GP2"9Z?LNms,;0frr351GKp0fGB`\1s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCO8fUcG^KJIOlVB!PBc3gs8R<Bs8R9WmJm4cGBj/fN-FXgs8@.cs8S:,
+k5PAlr-*Jes87+gs5&n!M>rcajn\rVG73g<s8I4dmJm4cGBj,e!md0]rc\?err<"B"mu?irc`Vd
+rrUN4If=O%GlRf%GO5A0rHEJcs-\)drr36&GC';hGB`>'s+138rrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCO8fU`G^f[l\@A=6IX(\fs8R<Bs8R9Wqu?]pGBs5gI!>Jfs8$q`s8ROl
+q>UC*q0.;fs7pngs/EN<U]5dfq>('jG7j`Ps8@.cqu?]pGBs5grkOSBrc\?err<"B$iBu(rHEPe
+s8KfpI/\=#GlRekGPhF?qfd8as*o7err36$GCBMkGB`n7s+138rrIuVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCO8fULGa8;ejH/-rH?fAes8R<Bs8R9WrVuomGCBMkH?]>fs6FlQs8RCh
+r;Q^-j`cpgs5eKjs,5s"g])SEr;$BmG7jfRs7ge^rVuomGC]_nqm20+rc\?frr<"B$iU,*pih/d
+s80-[HN&+!H2mnjGQ%RAm!![Rs*Jterr35pGE2_'GBa":s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCNrKEaGM8k'pNud]IJs3GGQ.XBGQ%RAGQ7[EH$B2cs8R<CrrRRlr;HWr
+GBj,e$)i(%Uq-5HqfdJ`s8R<As8R<As8R<Crs.2#OQufEGBa&ds*+GAs*+MC%+occlM^a,GQ7\g
+GQ%O@s*+MC%=EAFH$FRXGBj/fGBa":s+138rrJ)Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCNrKE<GP6XUm==kRKDkiMGQ.XBGQ%RAGQ7[OG^'/es8I4ds8R@grr2p!
+rc`Yers==%p4D]!JG",=q#CA<rVunArVunAs8N>+GHUK8rc`Scs8R<As8R<CrunLgY4;MjGBa)e
+G^'/es8I4ds8R=fH$OXZGB\<3s*&\dJcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCNrKE6GPcd^\XM)nW;ZbrGQ.XBGQ%RAGQ7[DG^'/e#5i[hs8R=frVlrr
+GC9Di$%7$pI.t1?ep"(fs8R<As8R<As8R<Crs+R.`V'9/GBa&ds*+GAs*+MC$]]GMp&Fr6GQ7\f
+GQ.USr-*Abs*/a5H$FRXGBs5gGB\W<JcCu7!J:@FeHD!7qGgOG~>
+s!$b/!7U66s3pH;qpYKD!7UlHrR:WD!n.,LqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7TBs
+!7TU$!7QK!JH3:^s!%JCNrKFBGFWsRrdr"2MuE\UGQ.XBGQ%RAGQ7[ON-FXgs8@.cs8S7+k5PA^
+r-*Jdrs@P+S9ao/K#2_iq#CA<rVunArVunAs8N=\GO5A0r-*Aas8R<As8R<Crt^H8m/R+`GBa)e
+Mg+Rgs8@.cs8S7+kkY8YGCfdFs-3NaN;rV,"J,Vj<E4P~>
+s!$b/!7U66s3pH;qpYKD!7UlHrR:WD!n.,LqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7TBs
+!7TU$!7QK!JH3:^s!%JCNrKEbGLUs;rHcb5WVuksGQ.XBGQ%RAGQ7[OI!>Jfs8$q`s8ROlq>UBq
+q0.;ers>ZKe9_)lHHp`6q#CA<rVunArVunAs8N=NGPhF?pigr]s8R<As8R<Crt]s*qu?]kGBa)e
+I!>Jfs8."as8RLkqYC0kGCfdFs-3NaM?!;'"I]>f<E4P~>
+s!$b/!7U66s3pH;qpYKD!7UlHrR:WD!n.,LqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7TBs
+!7TU$!7QK!JH3:^s!%JCNrKEDGL(m?pj&9OhYmKSGQ.XBGQ%RAGQ7[OH?]>fs6FlQs8RChr;Q]t
+k'*$grs=U-c[u/kH'rm5q#CA<rVunArVunAs8N=LGQ%RAiHKMFs8R<As8R<Crt]m(rVuoVGBa)e
+H?]>fs6OrRs8RChrV?KnGCfdFs-3NaK)bPp"H`]\<E4P~>
+s!%.:!7UZB!7U35!7U66!7UoIs3prI!7UlH!7UlHs3pfE!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9Bsp&P-Adf9Bsf`2$$JH16$])_jTs&G*Z$1rFhJH,YdHZuRis8R<B
+s8R<As8R<CrsZqlZ2ajrGBa)eds%PcrrVV4M#RD\oQP\5s8Tr_GHCT>s*+GAs*+GAs*+MC#Cq$g
+s8VJ1GQ.XBGQ%RAGQ7[YJ9UP`s6Y#Ss8U&^ZiC'uGBa)eflrt^s8R:os+137rrJ)Yp=oeB!;fbr
+J,~>
+s!%.:!7UZB!7U35!7U66!7UoIs3prI!7UlH!7UlHs3pfE!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9Bsp&P-Adf9Bsf`2$$JH16$])_jTs&G*Z$0HGdMuWg8JTp8Ts8R<B
+s8R<As8R<CrsY$6jo>AAGBa)eT6JibrrU_pT`4rtk')Q<s8S".GNS]#s*+GAs*+GAs*+MC#C1Ok
+s8UJjGQ.XBGQ%RAGQ7[YH$B2ds3Z%7s8S1)kl:\FGBa)eWHZGZs8R:os+137rrIuVp=]Y<!;fbr
+J,~>
+s!%.:!7UZB!7U35!7U66!7UoIs3prI!7UlH!7UlHs3pfE!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9Bsp&P-Adf9Bsf`2$$JH16$])_jTs&G*Z$*8?#_Z0XdH[#,\s8R<B
+s8R<As8R<CrsXL'o`+rqGBa)eLj/:drrSp=e,K@RXET02s8RUrGP(\1s*+GAs*+GAs*+MC#C(Il
+s8S[7GQ.XBGQ%RAGQ7[YG^'/es.4FYs8R[pp&G&tGBa)eMg+C\s8R:os+137rrI`Op=0;.!;]\q
+J,~>
+s!$b/!7U35!7U97!7UoI!n..urVurIr;ZiHrW!#K!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp](BE!7T?r!7TX%!7QK!JH3:^s!%JCNrKFaHZt_Ss6+ZO
+mf!1cGQ.XBGQ%RAGQ7[Up3V8Mponsds8VtUHHuHRNdBO\rsAXNGEi.-k]_:>q#CA<rVunArVunA
+s8N>CGFA9oRs0)Us8R<As8R<Cruf:)RJH6>GBa)eom2,Mq6P9hs8W%mGd6W6pY2YHs*&[<s+137
+rrJ)Yp=oeB!;fbrJ,~>
+s!$b/!7U35!7U97!7UoI!n..urVurIr;ZiHrW!#K!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp](BE!7T?r!7TX%!7QK!JH3:^s!%JCNrKF_G^%++s20&*
+qu-QpGQ.XBGQ%RAGQ7[Ul$/'UnY(/Ns8Vb?IGXqZI=CnhrsARIGJsO]_fpA&q#CA<rVunArVunA
+s8N=jGJ!e4Sp,DXs8R<As8R<CrudYP]DUZ[GBa)ekBMpUnt^JRs8VtTH,K4Po?s*-s*&[<s+137
+rrIuVp=]Y<!;fbrJ,~>
+s!$b/!7U35!7U97!7UoI!n..urVurIr;ZiHrW!#K!7UfF!7UH<!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp](BE!7T?r!7TX%!7QK!JH3:^s!%JCNrKFRG^&BOs-._S
+rVccrGQ.XBGQ%RAGQ7[U_g&'RjhQ(as8Uo$Np?PfHB.n%rsA+<GNf),P]qKQq#CA<rVunArVunA
+s8N=WGLZQ<_KU5's8R<As8R<Crucu=eGR_2GBa)e_0DsTk/)=ds8VG9IaIifmDt4cs*&[<s+137
+rrI`Op=0;.!;]\qJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8qZ$WFq#CWJ!!(IJ!7UiG!7U66
+!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*AdJs9rkQ(M/rrE#Hrr<)K
+!<1Gu!.b-b!<48C<K7"`ZZj@fs7pkfr;Ze@rr<"BrVunArr32fPBi2KGBa&d#5Y`aH@VUGr;R#.
+GJsO]q0.;^s8R<As8R<As8R<Crs/J,J9m[PGBa&ds*+GAs*+MC#Q1iWHCF8GGQ.UHk`^:PjEGkJ
+rsShNR=KO6T[Nl?GB\W<JcCu7!K@'Pg]X2Kqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8qZ$WFq#CWJ!!(IJ!7UiG!7U66
+!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*AdJs9rkQ(M/rrE#Hrr<)K
+!<1Gu!.b-b!<48C<K7"`L3N1fs7(;fr;Ze@rr<"BrVunArr32NMKtWaGBa&d#4e^FH%W*fr;R"V
+GOb_5nTT`^s8R<As8R<As8R<Crs/@oI!qmhGBa&ds*+GAs*+MC#Pk*AIAZmcGQ.UHd#!%:pNLl]
+rsSe@PC7_3WSdaUGB\W<JcCu7!K$jMg'!iEqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8qZ$WFq#CWJ!!(IJ!7UiG!7U66
+!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*AdJs9rkQ(M/rrE#Hrr<)K
+!<1Gu!.b-b!<48C<K7"`IWtVfs29,fr;Ze@rr<"BrVunArr32:K6sQpGBa&d#2l)'HAT*,r;R"N
+GPV:=`-8Q^s8R<As8R<As8R<Crs.eSH@iX)GBa&ds*+GAs*+MC#O.P#K"(]&GQ.UH]RkL1q0.2b
+rsSP-NI6)3ZL%VkGB\W<JcCu7!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IF!!(LE!!C[M!7UoI
+!7UiG!7U97"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+NbAe'S-qe*d;7
+e,01Jdf9Bsr;ZrK!7TEr!!(K!!.b-c!<48C<It17rrW+BH\)3Js+UIRN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IF!!(LE!!C[M!7UoI
+!7UiG!7U97"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+NbAe'S-qe*d;7
+e,01Jdf9Bsr;ZrK!7TEr!!(K!!.b-c!<48C<It17rrW"?IY%NMs+UIRM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IF!!(LE!!C[M!7UoI
+!7UiG!7U97"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+NbAe'S-qe*d;7
+e,01Jdf9Bsr;ZrK!7TEr!!(K!!.b-c!<48C<It17rrV8*Q%Asds+UIRK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UlH!7UiGs3prI!7UoI!7UlH
+!7U<8s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7T9p!7U*2!7UlH
+s3poH!7UlH!7QK!JH3Ics!%JCJcCu7!q:DfJcC<$L&V14s7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UlH!7UiGs3prI!7UoI!7UlH
+!7U<8s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7T9p!7U*2!7UlH
+s3poH!7UlH!7QK!JH3Ics!%JCJcCu7!nhdbJcC<$L&V11s7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UlH!7UiGs3prI!7UoI!7UlH
+!7U<8s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7T9p!7U*2!7UlH
+s3poH!7UlH!7QK!JH3Ics!%JCJcCu7!i1%eJcC<$L&V1*s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66!7UlH!7UlH!7UiGqpYNE!7U?9
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7T9p!7U-3!7UcEs3puJ
+!7UlH!7QK!JH3Ics!%JCJcD,;#*n9Jl]cY<JcC<$L&V14s7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66!7UlH!7UlH!7UiGqpYNE!7U?9
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7T9p!7U-3!7UcEs3puJ
+!7UlH!7QK!JH3Ics!%JCJcD,;#-.%hi-ot>JcC<$L&V11s7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66!7UlH!7UlH!7UiGqpYNE!7U?9
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7T9p!7U-3!7UcEs3puJ
+!7UlH!7QK!JH3Ics!%JCJcD,;#.sO*d<g?;JcC<$L&V1*s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97He,97He,B=I
+e+WhBe,B=Ie*[29e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`GqZ$WF
+cN!sol2Uh5qu?`Gr;ZoJ!7UlH!7QK!JH3Ics!%JCJcD,;"lu2%HB?@%s+13'rrJ)Yp=oeB!;fbr
+J,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97He,97He,B=I
+e+WhBe,B=Ie*[29e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`GqZ$WF
+cN!sol2Uh5qu?`Gr;ZoJ!7UlH!7QK!JH3Ics!%JCJcD,;"k&T\I$riBs+13'rrIuVp=]Y<!;fbr
+J,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97He,97He,B=I
+e+WhBe,B=Ie*[29e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`GqZ$WF
+cN!sol2Uh5qu?`Gr;ZoJ!7UlH!7QK!JH3Ics!%JCJcD,;"i?1CJ>;[ds+13'rrI`Op=0;.!;]\q
+J,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,B@Fdf9CFe,01Ge,B=I
+e*[55e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe'S-qe*@#2e,KFHe,KCJe,97Hdt%LM
+!5JU7,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,B@Fdf9CFe,01Ge,B=I
+e*[55e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe'S-qe*@#2e,KFHe,KCJe,97Hdt%LM
+!5JU7,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,B@Fdf9CFe,01Ge,B=I
+e*[55e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe'S-qe*@#2e,KFHe,KCJe,97Hdt%LM
+!5JU7,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*`W5nbJH16$SH/[6s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*`W5nbJH16$SH/[6s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*`W5nbJH16$SH/[6s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!#8ZqpYQFrR:]FrmUlIqpYKD!7UB:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pZArR:?<!7U'1!n..u
+kPtV3pAk6Bh#IH(JH16$g]7?us&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!#8ZqpYQFrR:]FrmUlIqpYKD!7UB:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pZArR:?<!7U'1!n..u
+kPtV3pAk6Bh#IH(JH16$g]7?us&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!#8ZqpYQFrR:]FrmUlIqpYKD!7UB:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pZArR:?<!7U'1!n..u
+kPtV3pAk6Bh#IH(JH16$g]7?us&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!$_.!7TEt!n..ur;ZrK!!(LB!!(LI!<:O;!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+`nCe,97He+<V?e)gW3df@kl!!(L=!!(LA!!(LF!!(L/!!(K!!.b.*!<48C<It1$
+s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!$_.!7TEt!n..ur;ZrK!!(LB!!(LI!<:O;!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+`nCe,97He+<V?e)gW3df@kl!!(L=!!(LA!!(LF!!(L/!!(K!!.b.*!<48C<It1$
+s+13$s-<TbM?!;'"I]>f<E4P~>
+s!$_.!7TEt!n..ur;ZrK!!(LB!!(LI!<:O;!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+`nCe,97He+<V?e)gW3df@kl!!(L=!!(LA!!(LF!!(L/!!(K!!.b.*!<48C<It1$
+s+13$s-<TbK)bPp"H`]\<E4P~>
+s!$_.!7THu"4I5Me,97Jdf@kk!!(LI!!:ULe*m>;e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!C[M!7U04!7UT@!7Ta(!7QK!JH4I*s!%JCJcC<$
+JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$_.!7THu"4I5Me,97Jdf@kk!!(LI!!:ULe*m>;e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!C[M!7U04!7UT@!7Ta(!7QK!JH4I*s!%JCJcC<$
+JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$_.!7THu"4I5Me,97Jdf@kk!!(LI!!:ULe*m>;e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!C[M!7U04!7UT@!7Ta(!7QK!JH4I*s!%JCJcC<$
+JcC<$Q2^l:s7XtGOT>5X<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#q#CKF!7U]C!7UfF!7U66!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHoDem?o`,*C!!(LH!!:UL!<(CH!!1OKrmU`E"Od>NdfBBrr;clH
+rVuuJ!<1IE!!(LI!<(CE!!(LG!<:OH!<:LK!7UE;rmLlJdt%LM!8ISS,6(Yos+13$s+138rrJ)Y
+p=oeB!;fbrJ,~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#q#CKF!7U]C!7UfF!7U66!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHoDem?o`,*C!!(LH!!:UL!<(CH!!1OKrmU`E"Od>NdfBBrr;clH
+rVuuJ!<1IE!!(LI!<(CE!!(LG!<:OH!<:LK!7UE;rmLlJdt%LM!8ISS,6(Yos+13$s+138rrIuV
+p=]Y<!;fbrJ,~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#q#CKF!7U]C!7UfF!7U66!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHoDem?o`,*C!!(LH!!:UL!<(CH!!1OKrmU`E"Od>NdfBBrr;clH
+rVuuJ!<1IE!!(LI!<(CE!!(LG!<:OH!<:LK!7UE;rmLlJdt%LM!8ISS,6(Yos+13$s+138rrI`O
+p=0;.!;]\qJ,~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,'+Jdf9Bs!<1IG!<1IF!!(L7!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UT@!7UT@!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH
+!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!(LH!!(LF!!(LH!!LaNdf@kl!;t:H!7UoI
+s3lN!JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,'+Jdf9Bs!<1IG!<1IF!!(L7!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UT@!7UT@!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH
+!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!(LH!!(LF!!(LH!!LaNdf@kl!;t:H!7UoI
+s3lN!JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,'+Jdf9Bs!<1IG!<1IF!!(L7!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UT@!7UT@!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH
+!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!(LH!!(LF!!(LH!!LaNdf@kl!;t:H!7UoI
+s3lN!JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LI!<:OI!<:OI!!(LF!!(LH!!(L9!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LB!<:O@!!(LH!!(LH!!LaN!7TEp!!(LE!!(LH
+!!(LH!!(LH!!(LI!!(LH!!(LI!!(LG!<:OE!!(LF!!(LH!!LaNdf@kf!!(LH!!(K!!.b.*!<48C
+<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LI!<:OI!<:OI!!(LF!!(LH!!(L9!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LB!<:O@!!(LH!!(LH!!LaN!7TEp!!(LE!!(LH
+!!(LH!!(LH!!(LI!!(LH!!(LI!!(LG!<:OE!!(LF!!(LH!!LaNdf@kf!!(LH!!(K!!.b.*!<48C
+<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LI!<:OI!<:OI!!(LF!!(LH!!(L9!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LB!<:O@!!(LH!!(LH!!LaN!7TEp!!(LE!!(LH
+!!(LH!!(LH!!(LI!!(LH!!(LI!!(LG!<:OE!!(LF!!(LH!!LaNdf@kf!!(LH!!(K!!.b.*!<48C
+<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!C[M!7UiG!7UlH!7UfF!7UlH!7UB:!7UiG!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U]C!7UN>!7UlH!7UlH!7UlHs3prI!7UcE!7UlH
+!7UlH!7UlH!7UoI!7UlH!7UoI!7UcEs3plG!7UfF!7UlH"OdA"!7UK=!7UlH!7QK!JH4I*s!%JC
+JcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!C[M!7UiG!7UlH!7UfF!7UlH!7UB:!7UiG!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U]C!7UN>!7UlH!7UlH!7UlHs3prI!7UcE!7UlH
+!7UlH!7UlH!7UoI!7UlH!7UoI!7UcEs3plG!7UfF!7UlH"OdA"!7UK=!7UlH!7QK!JH4I*s!%JC
+JcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!C[M!7UiG!7UlH!7UfF!7UlH!7UB:!7UiG!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U]C!7UN>!7UlH!7UlH!7UlHs3prI!7UcE!7UlH
+!7UlH!7UlH!7UoI!7UlH!7UoI!7UcEs3plG!7UfF!7UlH"OdA"!7UK=!7UlH!7QK!JH4I*s!%JC
+JcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!:ULe,'+Fe,97Jdf@kq!!(LH!!(L;!!(LE
+!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UoI!7UN>!7UiG!7UoIs3guK
+e,97Kdf9BsqZ$WFquHcGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!(LH!!(LF!!(LH!!LaNdf@kf
+!!(LI!<:N!!.b.*!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!:ULe,'+Fe,97Jdf@kq!!(LH!!(L;!!(LE
+!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UoI!7UN>!7UiG!7UoIs3guK
+e,97Kdf9BsqZ$WFquHcGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!(LH!!(LF!!(LH!!LaNdf@kf
+!!(LI!<:N!!.b.*!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!:ULe,'+Fe,97Jdf@kq!!(LH!!(L;!!(LE
+!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UoI!7UN>!7UiG!7UoIs3guK
+e,97Kdf9BsqZ$WFquHcGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!(LH!!(LF!!(LH!!LaNdf@kf
+!!(LI!<:N!!.b.*!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:cHqpYQFrR:`GrR:`Gr6t3:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUlIqpY<?!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01HdfBBrrW)lF!<CUI!!C[M!7UfF
+rR:`Gr6tZGr6tZG!7UoI!7UH<rmLlJdt%LM!8ISS,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:cHqpYQFrR:`GrR:`Gr6t3:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUlIqpY<?!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01HdfBBrrW)lF!<CUI!!C[M!7UfF
+rR:`Gr6tZGr6tZG!7UoI!7UH<rmLlJdt%LM!8ISS,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:cHqpYQFrR:`GrR:`Gr6t3:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUlIqpY<?!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01HdfBBrrW)lF!<CUI!!C[M!7UfF
+rR:`Gr6tZGr6tZG!7UoI!7UH<rmLlJdt%LM!8ISS,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!#8ZqpYQFrR:]FrmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3p]BqpY'8!7U04!7U'1
+!n..ur;ZiHr;ZiHqZ$WFrW)lFr;ciGq>^TG!7U-3!n..ur;ZiHiW0#-S,`Q<mf3@:jo>D1jo>D1
+pAk6Bec>^os&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!#8ZqpYQFrR:]FrmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3p]BqpY'8!7U04!7U'1
+!n..ur;ZiHr;ZiHqZ$WFrW)lFr;ciGq>^TG!7U-3!n..ur;ZiHiW0#-S,`Q<mf3@:jo>D1jo>D1
+pAk6Bec>^os&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!#8ZqpYQFrR:]FrmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3p]BqpY'8!7U04!7U'1
+!n..ur;ZiHr;ZiHqZ$WFrW)lFr;ciGq>^TG!7U-3!n..ur;ZiHiW0#-S,`Q<mf3@:jo>D1jo>D1
+pAk6Bec>^os&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!$_.!7TEt!n..ur;ZrK!!(LB!!(LF!!(L=!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+`nCe*I&7e*-i4e)gW3df@kq!!(LI!<:OG!<:OI!!(LH!!C[M!7UZB!n..up](<C
+nc/a?!7UlH!7Tm,!7UfF!7UWA!7U'1!7T<q!7UiG!7UB:!7U'1!7U'1!7UWA!7UfF!7Ta(s!%JC
+JcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$_.!7TEt!n..ur;ZrK!!(LB!!(LF!!(L=!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+`nCe*I&7e*-i4e)gW3df@kq!!(LI!<:OG!<:OI!!(LH!!C[M!7UZB!n..up](<C
+nc/a?!7UlH!7Tm,!7UfF!7UWA!7U'1!7T<q!7UiG!7UB:!7U'1!7U'1!7UWA!7UfF!7Ta(s!%JC
+JcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$_.!7TEt!n..ur;ZrK!!(LB!!(LF!!(L=!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+`nCe*I&7e*-i4e)gW3df@kq!!(LI!<:OG!<:OI!!(LH!!C[M!7UZB!n..up](<C
+nc/a?!7UlH!7Tm,!7UfF!7UWA!7U'1!7T<q!7UiG!7UB:!7U'1!7U'1!7UWA!7UfF!7Ta(s!%JC
+JcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$_.!7THu"4I5Me,97Jdf@kk!!(LF!!(L<!!(LH!!:ULe,97He*?u6e,97He+*J=e,97He+itD
+e,97He+*J=e,97He+itDe*?u6e*?u6e)gW1e,B=Ldf9BsrW!#K!7UlH!n..urVurIr;ZoJ!7UZB
+"4I5Me*-i4e,B=Ldf9BshuEc+mf3@:jo>D1d/X0qqu?`Gn,NI;jo>D1jo>D1o`,!@ec>^os&FXM
+JcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$_.!7THu"4I5Me,97Jdf@kk!!(LF!!(L<!!(LH!!:ULe,97He*?u6e,97He+*J=e,97He+itD
+e,97He+*J=e,97He+itDe*?u6e*?u6e)gW1e,B=Ldf9BsrW!#K!7UlH!n..urVurIr;ZoJ!7UZB
+"4I5Me*-i4e,B=Ldf9BshuEc+mf3@:jo>D1d/X0qqu?`Gn,NI;jo>D1jo>D1o`,!@ec>^os&FXM
+JcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$_.!7THu"4I5Me,97Jdf@kk!!(LF!!(L<!!(LH!!:ULe,97He*?u6e,97He+*J=e,97He+itD
+e,97He+*J=e,97He+itDe*?u6e*?u6e)gW1e,B=Ldf9BsrW!#K!7UlH!n..urVurIr;ZoJ!7UZB
+"4I5Me*-i4e,B=Ldf9BshuEc+mf3@:jo>D1d/X0qqu?`Gn,NI;jo>D1jo>D1o`,!@ec>^os&FXM
+JcC<$JcD#8!J:@FeHD!7qGgOG~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#q#CKF!7U]C!7UfF!7U66!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CHE!<1I9!!(L6!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+Fe,B=L
+df9Bsqu?`GqZ$WFrVurIr;ZoJ!7UZB"Od>NdfBBrr;clHrVuuJ!<1IE!!(LI!!C[M!7UH<!Rh&J
+e,B@Ge,01Ge,04Ge,9:Fe,KFHe,9:Fe,KCKdfBBrp]19Ar;cfFrr<)K!<1I:!<(CH!!(LH!!1OK
+rR:`G!Rh&Je+<V?e,B=Ie,B=Kdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUlI!7UlH"4I8!!<1IE!!(LI
+!<(CE!!(LG!<:OH!<:LK!7UZBrR:cH!7UlH!7UfFs!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#q#CKF!7U]C!7UfF!7U66!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CHE!<1I9!!(L6!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+Fe,B=L
+df9Bsqu?`GqZ$WFrVurIr;ZoJ!7UZB"Od>NdfBBrr;clHrVuuJ!<1IE!!(LI!!C[M!7UH<!Rh&J
+e,B@Ge,01Ge,04Ge,9:Fe,KFHe,9:Fe,KCKdfBBrp]19Ar;cfFrr<)K!<1I:!<(CH!!(LH!!1OK
+rR:`G!Rh&Je+<V?e,B=Ie,B=Kdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUlI!7UlH"4I8!!<1IE!!(LI
+!<(CE!!(LG!<:OH!<:LK!7UZBrR:cH!7UlH!7UfFs!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#HfDkp#q#CKF!7U]C!7UfF!7U66!n..ur;ZiHlMpq6r;ZiHnc/[=
+r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CHE!<1I9!!(L6!!C[M!7UlH!n.,LrR:cH!Rh&Je,'+Fe,B=L
+df9Bsqu?`GqZ$WFrVurIr;ZoJ!7UZB"Od>NdfBBrr;clHrVuuJ!<1IE!!(LI!!C[M!7UH<!Rh&J
+e,B@Ge,01Ge,04Ge,9:Fe,KFHe,9:Fe,KCKdfBBrp]19Ar;cfFrr<)K!<1I:!<(CH!!(LH!!1OK
+rR:`G!Rh&Je+<V?e,B=Ie,B=Kdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUlI!7UlH"4I8!!<1IE!!(LI
+!<(CE!!(LG!<:OH!<:LK!7UZBrR:cH!7UlH!7UfFs!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,'+Jdf9Bs!<1IG!<1IG!<1I7!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`Ds3prI!7UB:!7U<8!7UoI!7UlH!n..ur;ZrK
+!!(LI!!(LH!!(LG!<:OF!!(LF!!(LI!;t=G!!1OKrmUcF!7UoIs3prI!7UlH!7UoIs3prI!7UlH
+!7UiGs3pZAr6k]Ie'n9r!n..ur;ZiHr;ZiHqZ$WFrVurIr;ZrK!!(LG!!(LH!!C[Me'n9r!7U]C
+!7UiG!7UlH"4I8!e,B=Ie+`q@e,'+Hdf@kq!!C[M!7UiGs3prI!7UWA!7UlH!7UoI!7UfF"4I5M
+e,B=Ie,97He,97He,B=Kdf@kq!!C[Me'n9r!7UlH!7UoI!7UlH!7UlH!7UfF!7UlH"OdA"!7UQ?
+!n..ur;ZiHqZ-X?s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,'+Jdf9Bs!<1IG!<1IG!<1I7!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`Ds3prI!7UB:!7U<8!7UoI!7UlH!n..ur;ZrK
+!!(LI!!(LH!!(LG!<:OF!!(LF!!(LI!;t=G!!1OKrmUcF!7UoIs3prI!7UlH!7UoIs3prI!7UlH
+!7UiGs3pZAr6k]Ie'n9r!n..ur;ZiHr;ZiHqZ$WFrVurIr;ZrK!!(LG!!(LH!!C[Me'n9r!7U]C
+!7UiG!7UlH"4I8!e,B=Ie+`q@e,'+Hdf@kq!!C[M!7UiGs3prI!7UWA!7UlH!7UoI!7UfF"4I5M
+e,B=Ie,97He,97He,B=Kdf@kq!!C[Me'n9r!7UlH!7UoI!7UlH!7UlH!7UfF!7UlH"OdA"!7UQ?
+!n..ur;ZiHqZ-X?s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me(4U!e,'+Jdf9Bs!<1IG!<1IG!<1I7!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`Ds3prI!7UB:!7U<8!7UoI!7UlH!n..ur;ZrK
+!!(LI!!(LH!!(LG!<:OF!!(LF!!(LI!;t=G!!1OKrmUcF!7UoIs3prI!7UlH!7UoIs3prI!7UlH
+!7UiGs3pZAr6k]Ie'n9r!n..ur;ZiHr;ZiHqZ$WFrVurIr;ZrK!!(LG!!(LH!!C[Me'n9r!7U]C
+!7UiG!7UlH"4I8!e,B=Ie+`q@e,'+Hdf@kq!!C[M!7UiGs3prI!7UWA!7UlH!7UoI!7UfF"4I5M
+e,B=Ie,97He,97He,B=Kdf@kq!!C[Me'n9r!7UlH!7UoI!7UlH!7UlH!7UfF!7UlH"OdA"!7UQ?
+!n..ur;ZiHqZ-X?s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LI!<:OI!<:OI!!(LF!!(LF!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(L?!!(L9!!(L:!!(LH!!(LH!!LaN!7TEp!!(LE
+!!(LG!!C[M!7UiG!7UfF!7UoI!n..ur;clHrVurIrVurIr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurI
+qu?iJ!!(L<!!(LH!!:ULe,97He,97He,'+Fe,9:He,01Ge,04CdfBHtr;ZiHp](<Cqu?`GqZ$WF
+r;ZiHnGrL9!<CUI!!C[M!7UiG!7UlH!7UZB!7UiG!7UoI!n.,Lr6tZG!7UcE!7UiG!7UiG!7UlH
+!n..ur;ZiHrVurIquHcGq>^NEqZ$WFr;ZuL!7Lqsp]16@!<CUI!!(LF!<48C<It1$s+13$s-<Tb
+N;rV,"J,Vj<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LI!<:OI!<:OI!!(LF!!(LF!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(L?!!(L9!!(L:!!(LH!!(LH!!LaN!7TEp!!(LE
+!!(LG!!C[M!7UiG!7UfF!7UoI!n..ur;clHrVurIrVurIr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurI
+qu?iJ!!(L<!!(LH!!:ULe,97He,97He,'+Fe,9:He,01Ge,04CdfBHtr;ZiHp](<Cqu?`GqZ$WF
+r;ZiHnGrL9!<CUI!!C[M!7UiG!7UlH!7UZB!7UiG!7UoI!n.,Lr6tZG!7UcE!7UiG!7UiG!7UlH
+!n..ur;ZiHrVurIquHcGq>^NEqZ$WFr;ZuL!7Lqsp]16@!<CUI!!(LF!<48C<It1$s+13$s-<Tb
+M?!;'"I]>f<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!(LI!<:OI!<:OI!!(LF!!(LF!!(L;!<:OI!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(L?!!(L9!!(L:!!(LH!!(LH!!LaN!7TEp!!(LE
+!!(LG!!C[M!7UiG!7UfF!7UoI!n..ur;clHrVurIrVurIr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurI
+qu?iJ!!(L<!!(LH!!:ULe,97He,97He,'+Fe,9:He,01Ge,04CdfBHtr;ZiHp](<Cqu?`GqZ$WF
+r;ZiHnGrL9!<CUI!!C[M!7UiG!7UlH!7UZB!7UiG!7UoI!n.,Lr6tZG!7UcE!7UiG!7UiG!7UlH
+!n..ur;ZiHrVurIquHcGq>^NEqZ$WFr;ZuL!7Lqsp]16@!<CUI!!(LF!<48C<It1$s+13$s-<Tb
+K)bPp"H`]\<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!C[M!7UiG!7UlH!7UfF!7UfF!7UH<!7UiG!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UQ?!7U?9!7UB:!7UlH!7UlH!7UlHs3prI!7UcE
+!7UiG"4I5Me,01Ge,'+Fe,B=Ldf9BsrVurIr;ZiHrVurIr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurI
+qu?iJ!!(L<!!(LH!!:ULe,97He,97He,'+Fe,'.Fe,B=Ie,01Ge,'+Fe,97He+`nCe,01Ge,'.F
+e,B=Ie+*J=e,97Jdf@kq!!C[M!7UiG!7UlH!7UZB!7UfF"k*J#!!(LH!!C[M!7UcE!7UiG!7UiG
+!7UlH!n..ur;ZiHrVurIq>gQEqu?`GqZ$WFr;ZuL!7Lqsq#CEDr;ZoJ!7UlH!7UfFs!%JCJcC<$
+JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!C[M!7UiG!7UlH!7UfF!7UfF!7UH<!7UiG!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UQ?!7U?9!7UB:!7UlH!7UlH!7UlHs3prI!7UcE
+!7UiG"4I5Me,01Ge,'+Fe,B=Ldf9BsrVurIr;ZiHrVurIr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurI
+qu?iJ!!(L<!!(LH!!:ULe,97He,97He,'+Fe,'.Fe,B=Ie,01Ge,'+Fe,97He+`nCe,01Ge,'.F
+e,B=Ie+*J=e,97Jdf@kq!!C[M!7UiG!7UlH!7UZB!7UfF"k*J#!!(LH!!C[M!7UcE!7UiG!7UiG
+!7UlH!n..ur;ZiHrVurIq>gQEqu?`GqZ$WFr;ZuL!7Lqsq#CEDr;ZoJ!7UlH!7UfFs!%JCJcC<$
+JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kt!!C[M!7UiG!7UlH!7UfF!7UfF!7UH<!7UiG!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UQ?!7U?9!7UB:!7UlH!7UlH!7UlHs3prI!7UcE
+!7UiG"4I5Me,01Ge,'+Fe,B=Ldf9BsrVurIr;ZiHrVurIr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurI
+qu?iJ!!(L<!!(LH!!:ULe,97He,97He,'+Fe,'.Fe,B=Ie,01Ge,'+Fe,97He+`nCe,01Ge,'.F
+e,B=Ie+*J=e,97Jdf@kq!!C[M!7UiG!7UlH!7UZB!7UfF"k*J#!!(LH!!C[M!7UcE!7UiG!7UiG
+!7UlH!n..ur;ZiHrVurIq>gQEqu?`GqZ$WFr;ZuL!7Lqsq#CEDr;ZoJ!7UlH!7UfFs!%JCJcC<$
+JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!:ULe,'+Fe,97Jdf@kq!!:ULe,97He+*J=
+e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`GrVurIr;ZiHm/R.8nGiR<
+qu?`GrW)uI!<CUI!!C[M!7UfF!7UiG!7UlH!7UlH!7UfF!7UoI!7UoI"4I5Me,97Kdf9BsquHcG
+rVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!(L=!!(LH!!:ULe,97He,97He,'+Fe,B=Ie,97Kdf9Bs
+rW!#K!7UlH!n..ur;ZiHp](<CrW!#K!7UlH"4I8!!<1I;!!(LI!<:LK!7UoIs3puJ!7UoI!n..u
+r;ZiHp](<Cq>^]J!7LoJe,B@Ie,KCJe,'+Fe,'+Fe,01Ge,B@IdfBHtr;ZrK!!(LG!!(LH!!(LH
+!!(LF!!(LH!!LaNdf@kq!!(LI!!(LI!<:LK!7UoIs3piFs!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf
+<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!:ULe,'+Fe,97Jdf@kq!!:ULe,97He+*J=
+e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`GrVurIr;ZiHm/R.8nGiR<
+qu?`GrW)uI!<CUI!!C[M!7UfF!7UiG!7UlH!7UlH!7UfF!7UoI!7UoI"4I5Me,97Kdf9BsquHcG
+rVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!(L=!!(LH!!:ULe,97He,97He,'+Fe,B=Ie,97Kdf9Bs
+rW!#K!7UlH!n..ur;ZiHp](<CrW!#K!7UlH"4I8!!<1I;!!(LI!<:LK!7UoIs3puJ!7UoI!n..u
+r;ZiHp](<Cq>^]J!7LoJe,B@Ie,KCJe,'+Fe,'+Fe,01Ge,B@IdfBHtr;ZrK!!(LG!!(LH!!(LH
+!!(LF!!(LH!!LaNdf@kq!!(LI!!(LI!<:LK!7UoIs3piFs!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b
+<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(L(!!(LH!!:ULe,'+Fe,97Jdf@kq!!:ULe,97He+*J=
+e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`GrVurIr;ZiHm/R.8nGiR<
+qu?`GrW)uI!<CUI!!C[M!7UfF!7UiG!7UlH!7UlH!7UfF!7UoI!7UoI"4I5Me,97Kdf9BsquHcG
+rVurIr;ZiHrVurIr;ZrK!!(LG!!(LH!!(L=!!(LH!!:ULe,97He,97He,'+Fe,B=Ie,97Kdf9Bs
+rW!#K!7UlH!n..ur;ZiHp](<CrW!#K!7UlH"4I8!!<1I;!!(LI!<:LK!7UoIs3puJ!7UoI!n..u
+r;ZiHp](<Cq>^]J!7LoJe,B@Ie,KCJe,'+Fe,'+Fe,01Ge,B@IdfBHtr;ZrK!!(LG!!(LH!!(LH
+!!(LF!!(LH!!LaNdf@kq!!(LI!!(LI!<:LK!7UoIs3piFs!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X
+<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:cHqpYQFrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUiHrR:*5!7UH<!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01Ge,97Jdf9CGe,KFGdfBHt
+r;ZoJ!!)uHrVurIqu?cH!<1IH!;t:H!7UlH"4I5Me,01Ge,97He+*J=e,97Jdf9CHe,B@Fe,KFG
+e,KFHe,9:Ge,B@Ge,KCJe,97He+WkAe,B@Ge,KCJe*I)6dfTU!!!*#I!<CUJ!<1II!!(LH!!(LC
+!!(LD!!(LH!<1FM!7LoJe,'+Fe,'+Fe,'.EdfTU!!7UlH"4I5Me,'.De,B@Fe,KFGe,KCJe,B=I
+e,B@He,B@HdfTU!!!*#I!<CUG!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:cHqpYQFrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUiHrR:*5!7UH<!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01Ge,97Jdf9CGe,KFGdfBHt
+r;ZoJ!!)uHrVurIqu?cH!<1IH!;t:H!7UlH"4I5Me,01Ge,97He+*J=e,97Jdf9CHe,B@Fe,KFG
+e,KFHe,9:Ge,B@Ge,KCJe,97He+WkAe,B@Ge,KCJe*I)6dfTU!!!*#I!<CUJ!<1II!!(LH!!(LC
+!!(LD!!(LH!<1FM!7LoJe,'+Fe,'+Fe,'.EdfTU!!7UlH"4I5Me,'.De,B@Fe,KFGe,KCJe,B=I
+e,B@He,B@HdfTU!!!*#I!<CUG!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UfFrR:`GrR:]FrmTU%rR:cHqpYQFrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfG
+s3pB9s3plGrmUiHrR:*5!7UH<!7UfFrmLrLdf9CHe,B=Ie,'+Fe,01Ge,97Jdf9CGe,KFGdfBHt
+r;ZoJ!!)uHrVurIqu?cH!<1IH!;t:H!7UlH"4I5Me,01Ge,97He+*J=e,97Jdf9CHe,B@Fe,KFG
+e,KFHe,9:Ge,B@Ge,KCJe,97He+WkAe,B@Ge,KCJe*I)6dfTU!!!*#I!<CUJ!<1II!!(LH!!(LC
+!!(LD!!(LH!<1FM!7LoJe,'+Fe,'+Fe,'.EdfTU!!7UlH"4I5Me,'.De,B@Fe,KFGe,KCJe,B=I
+e,B@He,B@HdfTU!!!*#I!<CUG!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*iW/l)JH2hQ!7QK!li7%7lN$r/s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH2hQ!7QK!li7%7lN$r/s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH2hQ!7QK!li7%7lN$r/s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$Z2amRJH44#s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$Z2amRJH44#s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$Z2amRJH44#s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYKD!7UcE!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:
+!7U04!7U'1!n..ukPtV3q#L<@JH16$eH#Uns&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYKD!7UcE!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:
+!7U04!7U'1!n..ukPtV3q#L<@JH16$eH#Uns&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYKD!7UcE!7UE;rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:
+!7U04!7U'1!n..ukPtV3q#L<@JH16$eH#Uns&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFrW)uIqZ-ZFnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>
+df9BspAb<E!!(L;!!C[M!7UZB"4I5Me*m>;e*-i4e)gW3df@kl!!(L=!!(LH!!(LD!!(K!!.b.#
+!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFrW)uIqZ-ZFnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>
+df9BspAb<E!!(L;!!C[M!7UZB"4I5Me*m>;e*-i4e)gW3df@kl!!(L=!!(LH!!(LD!!(K!!.b.#
+!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFrW)uIqZ-ZFnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>
+df9BspAb<E!!(L;!!C[M!7UZB"4I5Me*m>;e*-i4e)gW3df@kl!!(L=!!(LH!!(LD!!(K!!.b.#
+!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,B=Kdf@kp!!:ULe+!D<e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L6!!(L1!!C[M!7U04!7UQ?!7QK!JH41"
+s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,B=Kdf@kp!!:ULe+!D<e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L6!!(L1!!C[M!7U04!7UQ?!7QK!JH41"
+s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,B=Kdf@kp!!:ULe+!D<e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L;!!(L6!!(L1!!C[M!7U04!7UQ?!7QK!JH41"
+s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHqZ$WFr;ZrK!!(L7
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*m>;e*?u9df9Bs
+r;ZoJ!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFr;clHqZ$WFJH16$dfBCls&FXM
+JcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHqZ$WFr;ZrK!!(L7
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*m>;e*?u9df9Bs
+r;ZoJ!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFr;clHqZ$WFJH16$dfBCls&FXM
+JcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHqZ$WFr;ZrK!!(L7
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*m>;e*?u9df9Bs
+r;ZoJ!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFr;clHqZ$WFJH16$dfBCls&FXM
+JcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LF!!(LI
+!!(LI!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UB:
+!7U<8!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LF!!(LG
+!<1Gu!.b."!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LF!!(LI
+!!(LI!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UB:
+!7U<8!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LF!!(LG
+!<1Gu!.b."!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LF!!(LI
+!!(LI!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UB:
+!7U<8!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LF!!(LG
+!<1Gu!.b."!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UcE!7UoI!7UoI
+!7UB:s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7U?9!7UB:
+!7UlH!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UcE!7U`D!7QK!JH44#
+s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UcE!7UoI!7UoI
+!7UB:s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7U?9!7UB:
+!7UlH!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UcE!7U`D!7QK!JH44#
+s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UcE!7UoI!7UoI
+!7UB:s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7U?9!7UB:
+!7UlH!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UcE!7U`D!7QK!JH44#
+s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+s%Ee,B@Ee+!D<
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*[29e*d8:e,97H
+e,97He,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie+s%Ee+itDdt%LM!7_)L,6(Yo
+s+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+s%Ee,B@Ee+!D<
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*[29e*d8:e,97H
+e,97He,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie+s%Ee+itDdt%LM!7_)L,6(Yo
+s+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+s%Ee,B@Ee+!D<
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He*[29e*d8:e,97H
+e,97He,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie+s%Ee+itDdt%LM!7_)L,6(Yo
+s+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LD
+!!(LE!!(L<!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5M
+e*I&7e+!D<e,01Ge,B@IdfBHtr;ZrK!!(LF!!(LG!<:OI!!(LH!!(LI!!(LH!!C[M!7U`D!7UoI
+!7UlH!7QK!JH44#s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LD
+!!(LE!!(L<!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5M
+e*I&7e+!D<e,01Ge,B@IdfBHtr;ZrK!!(LF!!(LG!<:OI!!(LH!!(LI!!(LH!!C[M!7U`D!7UoI
+!7UlH!7QK!JH44#s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LD
+!!(LE!!(L<!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5M
+e*I&7e+!D<e,01Ge,B@IdfBHtr;ZrK!!(LF!!(LG!<:OI!!(LH!!(LI!!(LH!!C[M!7U`D!7UoI
+!7UlH!7QK!JH44#s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.Ce,01G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He*?u6e+!D<e,'.EdfTU!!!)uHrVurI
+qZ$WFqu?cH!<1IH!;t:H!7UlH"4I5Me,'.Ce,KFHdt%LM!7V#K,6(Yos+13$s+138rrJ)Yp=oeB
+!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.Ce,01G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He*?u6e+!D<e,'.EdfTU!!!)uHrVurI
+qZ$WFqu?cH!<1IH!;t:H!7UlH"4I5Me,'.Ce,KFHdt%LM!7V#K,6(Yos+13$s+138rrIuVp=]Y<
+!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.Ce,01G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He*?u6e+!D<e,'.EdfTU!!!)uHrVurI
+qZ$WFqu?cH!<1IH!;t:H!7UlH"4I5Me,'.Ce,KFHdt%LM!7V#K,6(Yos+13$s+138rrI`Op=0;.
+!;]\qJ,~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpPNFqpYQFrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs
+!7U04!7U'1!n..ukPtV3nc/[=`;fnejo>J3!7U-3!7UfF!n..uj8f5/iW&u-YQ4\Is&FXMJcC<$
+JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpPNFqpYQFrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs
+!7U04!7U'1!n..ukPtV3nc/[=`;fnejo>J3!7U-3!7UfF!n..uj8f5/iW&u-YQ4\Is&FXMJcC<$
+JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpPNFqpYQFrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs
+!7U04!7U'1!n..ukPtV3nc/[=`;fnejo>J3!7U-3!7UfF!n..uj8f5/iW&u-YQ4\Is&FXMJcC<$
+JcD#8!J:@FeHD!7qGgOG~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFqZ$]H!7UlH!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(L4!!(L1!!:ULe+`nCe+*J=e+*J=e(4R"e*m>;
+e)gW3df@kl!!(L=!!(LF!!:ULe)LE.e)C?-e("Eue,97He*?u6e+j"D,6(Yos+13$s+138rrJ)Y
+p=oeB!;fbrJ,~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFqZ$]H!7UlH!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(L4!!(L1!!:ULe+`nCe+*J=e+*J=e(4R"e*m>;
+e)gW3df@kl!!(L=!!(LF!!:ULe)LE.e)C?-e("Eue,97He*?u6e+j"D,6(Yos+13$s+138rrIuV
+p=]Y<!;fbrJ,~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFqZ$]H!7UlH!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;
+!!C[M!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(L4!!(L1!!:ULe+`nCe+*J=e+*J=e(4R"e*m>;
+e)gW3df@kl!!(L=!!(LF!!:ULe)LE.e)C?-e("Eue,97He*?u6e+j"D,6(Yos+13$s+138rrI`O
+p=0;.!;]\qJ,~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,'+Idf9Bsr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7U66!7U'1"4I5Me*-i4e+!D<e(4R"e+!D<
+e)gW4df9Bskl:_4q>^TG!7Ts.!7Tp-!7T9p!7Tp-s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,'+Idf9Bsr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7U66!7U'1"4I5Me*-i4e+!D<e(4R"e+!D<
+e)gW4df9Bskl:_4q>^TG!7Ts.!7Tp-!7T9p!7Tp-s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,'+Idf9Bsr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7U66!7U'1"4I5Me*-i4e+!D<e(4R"e+!D<
+e)gW4df9Bskl:_4q>^TG!7Ts.!7Tp-!7T9p!7Tp-s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHqZ$WFrVurIr;ZiH
+m/R4:!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7U66"4I5M
+e,97Jdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUfGs3prI!Rh&Je,'+Fe,B@Ge,B@Ge,KCKdfBBrpAk0@
+rW)rH!s$dM!<(CH!!1OKrmUlIrR:?<"4I5Me,97Jdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUfGs3prI
+!Rh&Je,'+Fe,B@Hdf]["!7LrIe,KCJe,97Jdf9CHe+E\@e,9:Fe,KCJe,97Kdf@hsrmUiHrR:cH
+!Rh&Je*-l2e,KCJe,97He,B@Ie,B@Ge+NbAe,B=Ie,B@Ie+j"D,6(Yos+13$s+138rrJ)Yp=oeB
+!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHqZ$WFrVurIr;ZiH
+m/R4:!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7U66"4I5M
+e,97Jdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUfGs3prI!Rh&Je,'+Fe,B@Ge,B@Ge,KCKdfBBrpAk0@
+rW)rH!s$dM!<(CH!!1OKrmUlIrR:?<"4I5Me,97Jdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUfGs3prI
+!Rh&Je,'+Fe,B@Hdf]["!7LrIe,KCJe,97Jdf9CHe+E\@e,9:Fe,KCJe,97Kdf@hsrmUiHrR:cH
+!Rh&Je*-l2e,KCJe,97He,B@Ie,B@Ge+NbAe,B=Ie,B@Ie+j"D,6(Yos+13$s+138rrIuVp=]Y<
+!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHqZ$WFrVurIr;ZiH
+m/R4:!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7U66"4I5M
+e,97Jdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUfGs3prI!Rh&Je,'+Fe,B@Ge,B@Ge,KCKdfBBrpAk0@
+rW)rH!s$dM!<(CH!!1OKrmUlIrR:?<"4I5Me,97Jdf9CHe,KCKdfBBrqZ$cJ!!(IJrmUfGs3prI
+!Rh&Je,'+Fe,B@Hdf]["!7LrIe,KCJe,97Jdf9CHe+E\@e,9:Fe,KCJe,97Kdf@hsrmUiHrR:cH
+!Rh&Je*-l2e,KCJe,97He,B@Ie,B@Ge+NbAe,B=Ie,B@Ie+j"D,6(Yos+13$s+138rrI`Op=0;.
+!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LG!<1IH
+!<(C6!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7U<8
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!:UL
+e,97Kdf@kGrW!#K!!)rGqZ$]H!7UoI"4I5Me,97Kdf@kGrW!&L!!(L=!!(LI!!(LH!!:ULe,97K
+df9BsrVurIr;ZiHrW)uIrVurIr;ZiHrW)uIrVurIr;ZiHrVurIrW)uI!W^]urW!#K!7UlH!n..u
+r;ZoJ!!)rGr;ZiHq#CKF!7UlH"4I8!e,B=Kdf@kq!!C[Me'n9r!7U]Cr6tZGr6kZHe,97Ndf9Bs
+!!(LG!!(LH!!(LF!;t=G!!(LI!!(LH!!(LD!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LG!<1IH
+!<(C6!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7U<8
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!:UL
+e,97Kdf@kGrW!#K!!)rGqZ$]H!7UoI"4I5Me,97Kdf@kGrW!&L!!(L=!!(LI!!(LH!!:ULe,97K
+df9BsrVurIr;ZiHrW)uIrVurIr;ZiHrW)uIrVurIr;ZiHrVurIrW)uI!W^]urW!#K!7UlH!n..u
+r;ZoJ!!)rGr;ZiHq#CKF!7UlH"4I8!e,B=Kdf@kq!!C[Me'n9r!7U]Cr6tZGr6kZHe,97Ndf9Bs
+!!(LG!!(LH!!(LF!;t=G!!(LI!!(LH!!(LD!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LG!<1IH
+!<(C6!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TBs!7U<8
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!:UL
+e,97Kdf@kGrW!#K!!)rGqZ$]H!7UoI"4I5Me,97Kdf@kGrW!&L!!(L=!!(LI!!(LH!!:ULe,97K
+df9BsrVurIr;ZiHrW)uIrVurIr;ZiHrW)uIrVurIr;ZiHrVurIrW)uI!W^]urW!#K!7UlH!n..u
+r;ZoJ!!)rGr;ZiHq#CKF!7UlH"4I8!e,B=Kdf@kq!!C[Me'n9r!7U]Cr6tZGr6kZHe,97Ndf9Bs
+!!(LG!!(LH!!(LF!;t=G!!(LI!!(LH!!(LD!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7U]C!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHdJs9rmf3@:
+r;ZiHr;ZuL!!(Ksqu?`Gq>^NEr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIquHcGquHcGr;ZiHr;ZiH
+p]16@!<CUJ!!:UL!;k4G!7UlH"4I5Me+3P>e,97He,97Ldf9Bse,01Ge+s%Ee,97He,97He,97H
+e,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97Ldf9Bse+3P>e,9:EdfBHtr;ZoJ!7UlH!n..u
+qZ$WFr;ZiHlN$h2rW)uIqZ$WFr;ZiHoDf$C!7Lqsr;ZiHq#LF=s&FXMJcC<$JcD#8!K@'Pg]X2K
+qc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7U]C!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHdJs9rmf3@:
+r;ZiHr;ZuL!!(Ksqu?`Gq>^NEr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIquHcGquHcGr;ZiHr;ZiH
+p]16@!<CUJ!!:UL!;k4G!7UlH"4I5Me+3P>e,97He,97Ldf9Bse,01Ge+s%Ee,97He,97He,97H
+e,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97Ldf9Bse+3P>e,9:EdfBHtr;ZoJ!7UlH!n..u
+qZ$WFr;ZiHlN$h2rW)uIqZ$WFr;ZiHoDf$C!7Lqsr;ZiHq#LF=s&FXMJcC<$JcD#8!K$jMg'!iE
+qc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7U]C!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHdJs9rmf3@:
+r;ZiHr;ZuL!!(Ksqu?`Gq>^NEr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIquHcGquHcGr;ZiHr;ZiH
+p]16@!<CUJ!!:UL!;k4G!7UlH"4I5Me+3P>e,97He,97Ldf9Bse,01Ge+s%Ee,97He,97He,97H
+e,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97Ldf9Bse+3P>e,9:EdfBHtr;ZoJ!7UlH!n..u
+qZ$WFr;ZiHlN$h2rW)uIqZ$WFr;ZiHoDf$C!7Lqsr;ZiHq#LF=s&FXMJcC<$JcD#8!J:@FeHD!7
+qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+`nEdf@kq!!(L<
+!!(LG!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(Kr!!(L:!!(LH
+!!(LH!!(LH!<:OI!!(LE!!(LH!!(LH!!(LH!!(LI!!(LH!!(LI!!(LE!<:OG!<:OJ!!(LH!!(LD
+!!(LH!!:UL!<1IH!!(LF!!(LH!!C[M!7UN>!7UlH!7UlH!7UlHs3prI!7UcE!7UlH!7UlH!7UlH
+!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH!7UlHs3pW@!7UoI!7UlH!n..ur;ZoJ!7UlH
+!n..uqZ$WFr;ZiHlMpq6q#LHDqZ$WFr;ZiHoDf$C!7Lqsr;ZiHq#LF=s&FXMJcC<$JcD#8!K@'P
+g]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+`nEdf@kq!!(L<
+!!(LG!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(Kr!!(L:!!(LH
+!!(LH!!(LH!<:OI!!(LE!!(LH!!(LH!!(LH!!(LI!!(LH!!(LI!!(LE!<:OG!<:OJ!!(LH!!(LD
+!!(LH!!:UL!<1IH!!(LF!!(LH!!C[M!7UN>!7UlH!7UlH!7UlHs3prI!7UcE!7UlH!7UlH!7UlH
+!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH!7UlHs3pW@!7UoI!7UlH!n..ur;ZoJ!7UlH
+!n..uqZ$WFr;ZiHlMpq6q#LHDqZ$WFr;ZiHoDf$C!7Lqsr;ZiHq#LF=s&FXMJcC<$JcD#8!K$jM
+g'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+`nEdf@kq!!(L<
+!!(LG!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(Kr!!(L:!!(LH
+!!(LH!!(LH!<:OI!!(LE!!(LH!!(LH!!(LH!!(LI!!(LH!!(LI!!(LE!<:OG!<:OJ!!(LH!!(LD
+!!(LH!!:UL!<1IH!!(LF!!(LH!!C[M!7UN>!7UlH!7UlH!7UlHs3prI!7UcE!7UlH!7UlH!7UlH
+!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH!7UlHs3pW@!7UoI!7UlH!n..ur;ZoJ!7UlH
+!n..uqZ$WFr;ZiHlMpq6q#LHDqZ$WFr;ZiHoDf$C!7Lqsr;ZiHq#LF=s&FXMJcC<$JcD#8!J:@F
+eHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LG
+!!(LH!!:ULe,97He+*J=e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`G
+r;ZrK!!(Kp!!(L<!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe,04Ge,B=Ie,97He,B=Ie,97Kdf9Bs
+qu?`Gr;ZoJ!7UlH!n..ur;ZiHq#CEDrW)uI!<CUG!!(LH!!:ULe,97Kdf9BsrVurIp](<Cqu?`G
+rW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@IdfKNue,B=Kdf@kr
+!<:LK!7UlH!7UWA!7UoI!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!n..ur;ZiHlMpq6r;[&N!!(IJ
+!7UiG!7UlH!7UoI!7U]C"OdA"!7UlH!7U`Ds!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LG
+!!(LH!!:ULe,97He+*J=e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`G
+r;ZrK!!(Kp!!(L<!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe,04Ge,B=Ie,97He,B=Ie,97Kdf9Bs
+qu?`Gr;ZoJ!7UlH!n..ur;ZiHq#CEDrW)uI!<CUG!!(LH!!:ULe,97Kdf9BsrVurIp](<Cqu?`G
+rW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@IdfKNue,B=Kdf@kr
+!<:LK!7UlH!7UWA!7UoI!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!n..ur;ZiHlMpq6r;[&N!!(IJ
+!7UiG!7UlH!7UoI!7U]C"OdA"!7UlH!7U`Ds!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LG
+!!(LH!!:ULe,97He+*J=e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`G
+r;ZrK!!(Kp!!(L<!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe,04Ge,B=Ie,97He,B=Ie,97Kdf9Bs
+qu?`Gr;ZoJ!7UlH!n..ur;ZiHq#CEDrW)uI!<CUG!!(LH!!:ULe,97Kdf9BsrVurIp](<Cqu?`G
+rW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@IdfKNue,B=Kdf@kr
+!<:LK!7UlH!7UWA!7UoI!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!n..ur;ZiHlMpq6r;[&N!!(IJ
+!7UiG!7UlH!7UoI!7U]C"OdA"!7UlH!7U`Ds!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.De,B@G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+!D<e,'.EdfTU!!!)uHrVurI
+qZ$WFqu?cH!<1IH!;t:H!7UlH"4I5Me,'.De,B@Ge,KCJe,97He+`qBdfTU!!!)uHrW)oGrr<&J
+r;ZiHrW)rHpAb3BqZ-WE!s$dM!<(CG!!(LF!!(LG!!1OKrmUiHr6kZHe,97Kdf9BsqZ-WE"9?mN
+dfBBrrW)rH!s$dM!<(C@!;t=G!<1FL!7LoJrmLrLdf@kq!!:UL!<(CH!!(LH!!(L5!<(CH!!(LH
+!!:UL!;t=F!<1I@!!:ULe,B@Fe,'.F,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.De,B@G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+!D<e,'.EdfTU!!!)uHrVurI
+qZ$WFqu?cH!<1IH!;t:H!7UlH"4I5Me,'.De,B@Ge,KCJe,97He+`qBdfTU!!!)uHrW)oGrr<&J
+r;ZiHrW)rHpAb3BqZ-WE!s$dM!<(CG!!(LF!!(LG!!1OKrmUiHr6kZHe,97Kdf9BsqZ-WE"9?mN
+dfBBrrW)rH!s$dM!<(C@!;t=G!<1FL!7LoJrmLrLdf@kq!!:UL!<(CH!!(LH!!(L5!<(CH!!(LH
+!!:UL!;t=F!<1I@!!:ULe,B@Fe,'.F,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.De,B@G
+e+!G8e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+!D<e,'.EdfTU!!!)uHrVurI
+qZ$WFqu?cH!<1IH!;t:H!7UlH"4I5Me,'.De,B@Ge,KCJe,97He+`qBdfTU!!!)uHrW)oGrr<&J
+r;ZiHrW)rHpAb3BqZ-WE!s$dM!<(CG!!(LF!!(LG!!1OKrmUiHr6kZHe,97Kdf9BsqZ-WE"9?mN
+dfBBrrW)rH!s$dM!<(C@!;t=G!<1FL!7LoJrmLrLdf@kq!!:UL!<(CH!!(LH!!(L5!<(CH!!(LH
+!!:UL!;t=F!<1I@!!:ULe,B@Fe,'.F,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*`W5nbQN.$7r;ZiHJH1Z0s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*`W5nbQN.$7r;ZiHJH1Z0s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*`W5nbQN.$7r;ZiHJH1Z0s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$rW)oGJH1W/s!%JCJcC<$JcC<$V#LDpr;ZP`!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$rW)oGJH1W/s!%JCJcC<$JcC<$V#LDpr;ZP\!K$jMg'!iEqc-XH~>
+s!!!oJH16$rW)oGJH1W/s!%JCJcC<$JcC<$V#LDpr;ZPS!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCm/N-jJcC<$N;oU,!M0;hrrAYd!!/&Yp=oeB!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCm/N-jJcC<$N;oU*!La#drrAM`!!.rVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCm/N-jJcC<$N;oU%!KdB[rrA2W!!.]Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCm/N-jJcC<$N;oU,!M0;hrrJ\kqYpSTs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCm/N-jJcC<$N;oU*!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCm/N-jJcC<$N;oU%!KdB[rrJ5^qYpSJs7XtGOT>5X<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UiG!7UB:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=
+!7U'1!n..ukPtV3qZ$]H!7Tm,!7SpfrmUB;!7RnI!7U`DqpVqQ!7UfF!7Tg*s!%JCm/N-jJcC<$
+N;p6>s.8c9!M0;hrrJ\kqYpSTs7Y4NScJXf<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UiG!7UB:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=
+!7U'1!n..ukPtV3qZ$]H!7Tm,!7SpfrmUB;!7RnI!7U`DqpVqQ!7UfF!7Tg*s!%JCm/N-jJcC<$
+N;p6<s-iK3!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UiG!7UB:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=
+!7U'1!n..ukPtV3qZ$]H!7Tm,!7SpfrmUB;!7RnI!7U`DqpVqQ!7UfF!7Tg*s!%JCm/N-jJcC<$
+N;p67s,lj%!KdB[rrJ5^qYpSJs7XtGOT>5X<Ib~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHr;clHn,NI;r;[&N!!(IJ!7U04"4I5Me*m>>
+df9BspAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW3df@kl!!(L=!!(LF!!:ULe):9,e&MFge,B=I
+e+*J=e("Eue+NbAe*?u6e+itDe+itDe("Eue+NbAe*-i4e,'+Fe)(0*,6([0s,YBTs+13/s0LJ]
+T)\?9!M0;hrrJ\kqYpSTs7Y4NScJXf<Ib~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHr;clHn,NI;r;[&N!!(IJ!7U04"4I5Me*m>>
+df9BspAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW3df@kl!!(L=!!(LF!!:ULe):9,e&MFge,B=I
+e+*J=e("Eue+NbAe*?u6e+itDe+itDe("Eue+NbAe*-i4e,'+Fe)(0*,6([0s,YBTs+13/s0LD[
+RfDp3!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHr;clHn,NI;r;[&N!!(IJ!7U04"4I5Me*m>>
+df9BspAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW3df@kl!!(L=!!(LF!!:ULe):9,e&MFge,B=I
+e+*J=e("Eue+NbAe*?u6e+itDe+itDe("Eue+NbAe*-i4e,'+Fe)(0*,6([0s,YBTs+13/s0L5V
+OoOt%!KdB[rrJ5^qYpSJs7XtGOT>5X<Ib~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Jdf@kr!!:ULe*m>;e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!C[M!7U04!7UcE!n..ui;`l,`rH+g
+mJm79aT)=iiW&u-q#CEDaT)=ikl:_4qZ$WFhZ3[#s&JFcO3E1TJcC]/ZePSQs7+kFScJ]g!M0;f
+rrJ)Yp=oeB!;fbrJ,~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Jdf@kr!!:ULe*m>;e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!C[M!7U04!7UcE!n..ui;`l,`rH+g
+mJm79aT)=iiW&u-q#CEDaT)=ikl:_4qZ$WFhZ3[#s&JFcO3E1TJcC]/Ze>GKs7+eDRK39c!La#b
+rrIuVp=]Y<!;fbrJ,~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Jdf@kr!!:ULe*m>;e,97Jdf@kq!!(L6!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!C[M!7U04!7UcE!n..ui;`l,`rH+g
+mJm79aT)=iiW&u-q#CEDaT)=ikl:_4qZ$WFhZ3[#s&JFcO3E1TJcC]/Zdf)=s7+V?OT>=Z!KdBY
+rrI`Op=0;.!;]\qJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;ZrK!!(LG!!(L6
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ
+!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFrW)rH"9?mNdfBBrrr<&Jr;ZoJ!!)uH
+pAk3A!s$dM!<(CG!<(CG!<:LK!7UoIrR:cH!Rh&Je*-i4e,'.De,KCKdfBBrrr<&JrVurIl2Uk6
+!<1II!!1OKrmUfGs3prI!Rh&Je,KFHe+WhCdfBBrr;clHr;ciG!<CUE!!1OKrmU-4!Rh&Je,KCK
+dfBBrr;clHrVuuJ!<1II!<(C?!<(CG!<1FL!7LoJrmLuMdf@hsrmUiHrR:`GrR:`GrR:TCs!%JC
+m/N-jJcC<$N;re1!!'Uc!M9>]g]<uHr;Qeh!;c]rN;rV,"J,Vj<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;ZrK!!(LG!!(L6
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ
+!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFrW)rH"9?mNdfBBrrr<&Jr;ZoJ!!)uH
+pAk3A!s$dM!<(CG!<(CG!<:LK!7UoIrR:cH!Rh&Je*-i4e,'.De,KCKdfBBrrr<&JrVurIl2Uk6
+!<1II!!1OKrmUfGs3prI!Rh&Je,KFHe+WhCdfBBrr;clHr;ciG!<CUE!!1OKrmU-4!Rh&Je,KCK
+dfBBrr;clHrVuuJ!<1II!<(C?!<(CG!<1FL!7LoJrmLuMdf@hsrmUiHrR:`GrR:`GrR:TCs!%JC
+m/N-jJcC<$N;re/!!'Ua!Lj&Yg&[WBr;Qed!;c]rM?!;'"I]>f<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;ZrK!!(LG!!(L6
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ
+!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFrW)rH"9?mNdfBBrrr<&Jr;ZoJ!!)uH
+pAk3A!s$dM!<(CG!<(CG!<:LK!7UoIrR:cH!Rh&Je*-i4e,'.De,KCKdfBBrrr<&JrVurIl2Uk6
+!<1II!!1OKrmUfGs3prI!Rh&Je,KFHe+WhCdfBBrr;clHr;ciG!<CUE!!1OKrmU-4!Rh&Je,KCK
+dfBBrr;clHrVuuJ!<1II!<(C?!<(CG!<1FL!7LoJrmLuMdf@hsrmUiHrR:`GrR:`GrR:TCs!%JC
+m/N-jJcC<$N;re*!!'U\!KmEPeH(d4r;Qe[!;c]rK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LG!!(L7!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LI!<:LL
+!7TEr!!:ULe,97Jdf@kq!!:UL!;t:H!7UoIs3piF!n..ur;[/Q!!(IJdf@hse,97Kdf@kGrVurI
+p]16@rrDuG!!)uHrVurIr;ZrK!!(LI!!UgOdf9Bsp&P$>rrDuG!W^]urW!&L!!(LI!!(LH!!(LI
+!<:OI!!C[M!7UfFr6k]Ie'n9r!7UlH!7UoI!7UoIs3pcDs3prI!7U]Cr6tZGr6k]Ie'n9r"4I5M
+e,B=Ie,97He,B@Ie,B=Ldf9BsqZ-QCqZ$]H!7UoIs3guKe,B@Ie,KCJe,B=Kdf@kq!!:ULe,97J
+df@kq!!(LF!<48C<UBaHbhi@&rkseBGM<)sGCfeCs8R;ls8R<Bs8R<BrsJbDNI#gKrkseBGL6Be
+g].>cg]=#Hn_=/:!;uitScJWe!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LG!!(L7!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LI!<:LL
+!7TEr!!:ULe,97Jdf@kq!!:UL!;t:H!7UoIs3piF!n..ur;[/Q!!(IJdf@hse,97Kdf@kGrVurI
+p]16@rrDuG!!)uHrVurIr;ZrK!!(LI!!UgOdf9Bsp&P$>rrDuG!W^]urW!&L!!(LI!!(LH!!(LI
+!<:OI!!C[M!7UfFr6k]Ie'n9r!7UlH!7UoI!7UoIs3pcDs3prI!7U]Cr6tZGr6k]Ie'n9r"4I5M
+e,B=Ie,97He,B@Ie,B=Ldf9BsqZ-QCqZ$]H!7UoIs3guKe,B@Ie,KCJe,B=Kdf@kq!!:ULe,97J
+df@kq!!(LF!<48C<UBaHbhi@&rNq?*GM<)sGCfeCs8R;ls8R<Bs8R<BrsJ_3LO"+DrNq?*GL6Be
+g&M,ag&[ZBn_+#4!;uitRK33a!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LG!!(L7!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LI!<:LL
+!7TEr!!:ULe,97Jdf@kq!!:UL!;t:H!7UoIs3piF!n..ur;[/Q!!(IJdf@hse,97Kdf@kGrVurI
+p]16@rrDuG!!)uHrVurIr;ZrK!!(LI!!UgOdf9Bsp&P$>rrDuG!W^]urW!&L!!(LI!!(LH!!(LI
+!<:OI!!C[M!7UfFr6k]Ie'n9r!7UlH!7UoI!7UoIs3pcDs3prI!7U]Cr6tZGr6k]Ie'n9r"4I5M
+e,B=Ie,97He,B@Ie,B=Ldf9BsqZ-QCqZ$]H!7UoIs3guKe,B@Ie,KCJe,B=Kdf@kq!!:ULe,97J
+df@kq!!(LF!<48C<UBaHbhi@&p8<LeGM<)sGCfeCs8R;ls8R<Bs8R<BrsJItJp;M>p8<LeGL6Be
+eGoT\eH(g4n^RZ&!;uitOT>7X!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UiG
+!7U?9s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH
+"Od>Ne'n!j!7UlH!n.,Lr6kWGqpYQF#1ES$!7Lqsr;ZoJ!7UlH!7U35!7UiG!7UlH"4I5Me,04F
+e*$c3e,97Kdf9Bsq#CEDrVurIr;ZrK!!(L@!!(LH!!(LH!!(LI!!(LH!!(L?!!(L6!!(LH!!C[M
+!7U`D!7UoI!7UlH"4I5Me+<Y<dfBHtr;ZoJ!7UlH"4I5Me,04Ce,KFJe,04Ge+`qC,6([0s,YC\
+rrCaNGM<)sGK^$dGDlM$GQ.XBGM)rqGQ.XBGQ.UBg&6*qs4R?pd/X!u!!'Uc!M9>]g]<uHr;Qeh
+!;c]rN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UiG
+!7U?9s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH
+"Od>Ne'n!j!7UlH!n.,Lr6kWGqpYQF#1ES$!7Lqsr;ZoJ!7UlH!7U35!7UiG!7UlH"4I5Me,04F
+e*$c3e,97Kdf9Bsq#CEDrVurIr;ZrK!!(L@!!(LH!!(LH!!(LI!!(LH!!(L?!!(L6!!(LH!!C[M
+!7U`D!7UoI!7UlH"4I5Me+<Y<dfBHtr;ZoJ!7UlH"4I5Me,04Ce,KFJe,04Ge+`qC,6([0s,YC\
+rrB+uGM<)sGK^$dGDlM$GQ.XBGM)rqGQ.XBGQ.UBX8R5Cs/Z*Bd/X!s!!'Ua!Lj&Yg&[WBr;Qed
+!;c]rM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UiG
+!7U?9s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH
+"Od>Ne'n!j!7UlH!n.,Lr6kWGqpYQF#1ES$!7Lqsr;ZoJ!7UlH!7U35!7UiG!7UlH"4I5Me,04F
+e*$c3e,97Kdf9Bsq#CEDrVurIr;ZrK!!(L@!!(LH!!(LH!!(LI!!(LH!!(L?!!(L6!!(LH!!C[M
+!7U`D!7UoI!7UlH"4I5Me+<Y<dfBHtr;ZoJ!7UlH"4I5Me,04Ce,KFJe,04Ge+`qC,6([0s,YC\
+rrA#VGM<)sGK^$dGDlM$GQ.XBGM)rqGQ.XBGQ.UBN;[r$s,?o#d/X!n!!'U\!KmEPeH(d4r;Qe[
+!;c]rK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,97He*d8:
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97H
+e,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97He,9:H
+e+`nCe,97Jdf@kq!!:ULe+s%Kdf@hsdf@kq!!:ULe,97He*6o5e,01Ge,97Kdf9Bsqu?iJ!!(L4
+!<:OI!!C[M!7U`D!7UoI!7UlH"4I5Me+E_@e,B=Ie,97He,B=Ie,97He+<V?e*@#6e,B=Ldf9Bs
+q#CEDrVurIr;ZrK!!(L@!!(LH!!:ULe,97Jdf@kq!!C[M!7UiG!7U]Cs3plGs3pfEs!%JCm/N-j
+hZ!\>GJO.0s8R;ds8R:ts8R;qs8R<=rs=d2_#464OE\M<ci<mt!!*#R"JI7H'4_!r"fEdO'4Cn<
+g_'U_.0UTFY:TquTA85K:D![MFoL/"V^V]]@0#`N"J5YKgh?Na!,2;c!M0;hrrJ\kqYpSTs7Y4N
+ScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,97He*d8:
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97H
+e,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97He,9:H
+e+`nCe,97Jdf@kq!!:ULe+s%Kdf@hsdf@kq!!:ULe,97He*6o5e,01Ge,97Kdf9Bsqu?iJ!!(L4
+!<:OI!!C[M!7U`D!7UoI!7UlH"4I5Me+E_@e,B=Ie,97He,B=Ie,97He+<V?e*@#6e,B=Ldf9Bs
+q#CEDrVurIr;ZrK!!(L@!!(LH!!:ULe,97Jdf@kq!!C[M!7UiG!7U]Cs3plGs3pfEs!%JCm/N-j
+hZ!\+GMN/Ms8R;ds8R:ts8R;qs8R<=rs=*th#79QI<XKFci<mr!!*#P"F_<l*.Rq@"b7No*.7ha
+g(FC7*!7OjL`Z^K`S0%Y4UVECO8di:J/\S1I/r]h"IfAEg1U6^!,)5`!La#drrJPgqYpSQs7Y.L
+RK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,97He*d8:
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97H
+e,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97He,9:H
+e+`nCe,97Jdf@kq!!:ULe+s%Kdf@hsdf@kq!!:ULe,97He*6o5e,01Ge,97Kdf9Bsqu?iJ!!(L4
+!<:OI!!C[M!7U`D!7UoI!7UlH"4I5Me+E_@e,B=Ie,97He,B=Ie,97He+<V?e*@#6e,B=Ldf9Bs
+q#CEDrVurIr;ZrK!!(L@!!(LH!!:ULe,97Jdf@kq!!C[M!7UiG!7U]Cs3plGs3pfEs!%JCm/N-j
+hZ!\(GNo+[s8R;ds8R:ts8R;qs8R<=rs=!ql2L__H?\WQci<mm!!*#K"CDcD.%U=e"^quF.%C;7
+eIhjh&dL;4B+tM6c.1@1/I)P?WrCNP@1`SiS,i!-"Hi`7eR\LV!+c#X!KdB[rrJ5^qYpSJs7XtG
+OT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!(LG!!(L;!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5M
+e+WhBe,01Ge,B@IdfBHtr;ZrK!!(LF!!(LG!<:OI!!(LH!!(LI!!(LH!!C[M!7UiG!7UoIs3h#L
+e'n9r!n..urW)uI!<CUI!!(LD!!(LI!<:LK!7UoIs3guKe,97Qdf9Bs!7Lqs!7UlH!n..ur;ZiH
+l2Uh5qu?`Gr;ZrK!!(LG!!(LI!!(L5!!1OKrmUiH!7U`D!7UoI!7UlH"4I5Me,B=Ie+itEdfBBr
+qu?`GrVurIrW)uIq#CEDr;ZiHlMpt7!<1IH!!(LD!!(LI!!(LH!!C[M!7UoI!7U`D!7UoIs3guK
+e,B@IdfBHtrW)uIrr<&Jqu?`Gr;ZoJ!7UlH!n..ur;ZiHqZ-X?s&JFcO3HJ\!dJqgf`1tqbQ%Td
+LB%9tf`1tqq>UM@GQ.UA!dJqgcN!ds&cg_B^^-7X^G]$GgqjAdf>'HJqqN+j(9uP]!uJ5qRLn90
+7U+$g]40RN_?l[_^cMPag]a;Lgt^X[qu?ang\fh-ScJ]g!M0;frrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!(LG!!(L;!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5M
+e+WhBe,01Ge,B@IdfBHtr;ZrK!!(LF!!(LG!<:OI!!(LH!!(LI!!(LH!!C[M!7UiG!7UoIs3h#L
+e'n9r!n..urW)uI!<CUI!!(LD!!(LI!<:LK!7UoIs3guKe,97Qdf9Bs!7Lqs!7UlH!n..ur;ZiH
+l2Uh5qu?`Gr;ZrK!!(LG!!(LI!!(L5!!1OKrmUiH!7U`D!7UoI!7UlH"4I5Me,B=Ie+itEdfBBr
+qu?`GrVurIrW)uIq#CEDr;ZiHlMpt7!<1IH!!(LD!!(LI!!(LH!!C[M!7UoI!7U`D!7UoIs3guK
+e,B@IdfBHtrW)uIrr<&Jqu?`Gr;ZoJ!7UlH!n..ur;ZiHqZ-X?s&JFcO3HJ\!I/h?s8R;ds8R:t
+s8R;qs8R<=rrI@grVlnCGKp0bg(FD>g6*)Mf;oRJg=hl.YLfrm!;kIh!&_OAEsFV<eT3%jg(K+c
+eZDBrg6WPXf<5nhmb.i5s4Z2[:Ab(m:>,R!!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!(LG!!(L;!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5M
+e+WhBe,01Ge,B@IdfBHtr;ZrK!!(LF!!(LG!<:OI!!(LH!!(LI!!(LH!!C[M!7UiG!7UoIs3h#L
+e'n9r!n..urW)uI!<CUI!!(LD!!(LI!<:LK!7UoIs3guKe,97Qdf9Bs!7Lqs!7UlH!n..ur;ZiH
+l2Uh5qu?`Gr;ZrK!!(LG!!(LI!!(L5!!1OKrmUiH!7U`D!7UoI!7UlH"4I5Me,B=Ie+itEdfBBr
+qu?`GrVurIrW)uIq#CEDr;ZiHlMpt7!<1IH!!(LD!!(LI!!(LH!!C[M!7UoI!7U`D!7UoIs3guK
+e,B@IdfBHtrW)uIrr<&Jqu?`Gr;ZoJ!7UlH!n..ur;ZiHqZ-X?s&JFcO3HJ\!I/h?s8R;ds8R:t
+s8R;qs8R<=rrI@grVlnCGKp0beIhl4ePA'5d#eUFe^[VZ]$Q`K!;k:c!+!Ue3?2>EauOCjeHhYj
+c'g-4ePnQ?d$=q;maVK's4,ZL9`+kk9[s!j!KdB[rrJ5^qYpSJs7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nCe,B@F
+e+*M9e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!7LrIe,B@HdfTU!!!)uHpAk3A!s$dM!<1FL!7LoJ
+rR:`G!7UoI!n.,LrR:cH!7UlH!7U35!7UfFrR:`G!7UiG!7UlH!7U66!7UcE!7UfFr6kZHe,97H
+e,B@He+`nCe+s(Be,KFIdfBHtp]19Al2Uh5q>^NEqZ-QC!<CUI!!(LI!<1IA!<1FL!7LoJrmLrL
+df9CIdf]["!!(LF!<(CG!<(CG!<(CC!<48C<UBbTbR0(]%K[+tJBZ4;!;t(@!<14B!"6qZ&e%da
+a^,Ve7`t_Srr<GL@hK2MbfO0)#tE):bQb:S*Wug$HMu(f!!gY]('2,L"hjlY"3W:sAb=4:s8R9F
+rk=)2rr35YTRqHBW:']^G6e/pRXf[7R`sdks*+JB#QDu7IX6mXq>UC!q5f*qT_!AOirAk!s8W+C
+"9-#gGlI^Ign97EKW+>;rs%8OJpE$Jmc+6Xrm@*^HB?/Hs8L90IX6mXq>UEoG74D\K7C-*rO.B-
+V>gJos*"kM\V#C9s8BBZIAQrBs8R<Cs8$s!rs/D'JUX<bGBa&ds*"JCoQS[^qqM;SgtZ(FrnI\#
+$JaEBB`?cfbQ.Oq%KN-Vgt;\#gt^QbgtWFFqqM3XB`?cfbQ.(d!M9>jg]?"erVusZfDF>(ScJ]g
+!M0;frrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nCe,B@F
+e+*M9e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!7LrIe,B@HdfTU!!!)uHpAk3A!s$dM!<1FL!7LoJ
+rR:`G!7UoI!n.,LrR:cH!7UlH!7U35!7UfFrR:`G!7UiG!7UlH!7U66!7UcE!7UfFr6kZHe,97H
+e,B@He+`nCe+s(Be,KFIdfBHtp]19Al2Uh5q>^NEqZ-QC!<CUI!!(LI!<1IA!<1FL!7LoJrmLrL
+df9CIdf]["!!(LF!<(CG!<(CG!<(CC!<48C<UBbUbR;R4-j]qg6C,j>!!)r@rrE&Brr<DH9+2JP
+bf36a%Uf7Zrr<DH9+2JPbf36a%Uf7Z#+S:$!Y.,PrQP9A#KK^P!ic5-ao0EcapS3KoZZk*s*"SC
+XakZqrs-i;J9m'[qu?M:#QDT'I<gL@gZ&85GQ.UIrP4MBI$)8Drr35nTRDBnr-*AEs8$s>s8R9F
+r2kKorr32JR=KU?[JTq&#0rWeHAT',ir9Sh_NB1mR+;6:rP4MBI$)8Drr<"B$N-lQKYd]cW.9E-
+rVunA$N-lQKYd]cW.9E-rVunAs8Vq>ir98STRDBnr-*Aas8R9Cs7CN^s81LQ!8?-AZMrP]Ync!H
+(UX1q!OMk(g(",+g=k'WbM(\#"PVQ3d/2Mt(UX1q!OMjpg&[ZBrn7D'3;rmY37[o[!La#drrJPg
+qYpSQs7Y.LRK34b<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nCe,B@F
+e+*M9e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!7LrIe,B@HdfTU!!!)uHpAk3A!s$dM!<1FL!7LoJ
+rR:`G!7UoI!n.,LrR:cH!7UlH!7U35!7UfFrR:`G!7UiG!7UlH!7U66!7UcE!7UfFr6kZHe,97H
+e,B@He+`nCe+s(Be,KFIdfBHtp]19Al2Uh5q>^NEqZ-QC!<CUI!!(LI!<1IA!<1FL!7LoJrmLrL
+df9CIdf]["!!(LF!<(CG!<(CG!<(CC!<48C<UBbUbR;Bq+9hug:oqmb!!)r@rrE&Brr<D:2[::a
+bc`l/(P)J.rr<D:2[::abc`l/(P)J.#)PGQ";F;.rQP9A#J!#("_Rfbb5KNd^]jeQoZZk*s*"tD
+TR;(cs8KitI=.-orVu_<#PtieH[:OMlJhjDGQ.UIpp,d'I[JF[rr35ZQ$\4trc`SGs8$s>s8R9P
+nt:AVs8W)7P'q_>_u9T7#QDQ&I=.-orSmhgqR)6-I\Q$*s7imWH@D7,rr2rtG7*o2I#6MUm$`<V
+bl.SAG7*o2I#6MUm$`<Vbl.SAGQ7^>GN/W-hj/VC^&E5"rr<"B!<;\8d/X!n"9@!&$H2qo"^tK_
+eI0@qeH'1\qpc/VcdgR[!703G^(SuH!n$nq!=QmGeH'1\maV?#s8LOLco:q(!B8C&eH(d4r;Qe[
+!;c]rK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*JH28A!7TR#!7T'j!7RYBs!%JCm/QV"!/C=Ms31KCr650@rlkBB!-A)=!EN(r
+!!#:`bl7YCF8Z(><`/eq!'pP-qZ$Wt?N/1K!!dEB!!1;K!&XYu!j2M2o??b)s*"[`GB\<3s1nMU
+!IjM6G6$"dGN/Z&GQ7[Dril9D"GHRMrKI2(!etoCirAk!s8W+C#/PM-GlRfZqf`0ln,NF'qf`'i
+n)XKLrj2KG!rr8(qf`6tq#CA<GJsH(!O8d*G6"B:s8R9C`;Ol\Z*!tK!2BJms*+MCqKM!"!WA;^
+G63MCGQ.XBG6%[8GL6Beg]RW4g^MF+g]cC5gtW@^rnIP.!;kOP!8IM.!<CmRg]mi7gm/1@K!kU5
+!=d6Og]?+/mb@i7s8C^UcS#8OchcDtScJ]g!M0;frrJ)Yp=oeB!;fbrJ,~>
+s!!!oc2[jnhZ*Z*JH28A!7TR#!7T'j!7RYBs!%JCm/QV"!(Zkcs31KCr650@rlkBB!&siV!Lb52
+!!%WMbl7YC2uN^WRNh\1!.t3oqZ$WtQN#,.!!bC^!!1:b!-\=b!e(+fo??b)s*"[:GB\<3s/#U:
+!K$^MG6"N:GN/Z&GQ7[DrKR2'"I8rcqLAHf!h=IYirAk!s8W+C#+Kg\GlRf?qf`1"qu?\mqf`'t
+qrIbXrg<S,!rr4`qf`70rVunAGF\VU!Sre7G6#nes8R9CSGdX4h2_GX!6tNCs*+MCqKM!"!W%?F
+G64=ZGQ.XBG6%[8GL6Beg&qE0g&ot+g'-(1g=cY\rn7D(!;kIM!<(UO!<(UV!8?.1&6jt-rn7AT
+fDaJ)ec>-l!Lj&eg'#YR!&)Ung&[WBr;Qed!;c]rM?!;'"I]>f<E4P~>
+s!!!oc2[jnhZ*Z*JH28A!7TR#!7T'j!7RYBs!%JCm/QV"!$:t:s31KCr650@rlkBB!#GM5!ON@8
+!!'5%bl7YC(B"46Zk!$7!3cCGqZ$Wu[f4MN!!a8>!!:@R!36"A!]g<^o??b)s*"[$GB\<3rJpc!
+!MTJgG6!QtGN/Z&GQ7[Dpk/Hf"Kqb(l$NAQ!lT;,irAk!s8W+C#).8FGlR`&qf`1:rVuhVqf`(7
+rT*tZq1\]i!rr%Jqf`7Irr<"BGD?'?!UkU<G6%"/s8R9CLAc;smt(F]!:9^bs*+MCqKM!"!UG+2
+G65^,GQ.XBG6%[8GL6BeeH>m&eH48"eHNr%e^X`Mrm_%f!;k:H!<(FJ!<(FQ!7fUR,%HYVrm_#N
+e,Iku_uT5U!KmE\eHErG!%u@heH(d4r;Qe[!;c]rK)bPp"H`]\<E4P~>
+s!!!oJH16$`rH+gfDkp#aoDFjU&b3;s&JFcn]V@Q!)'W?_OXHGbQ%Y@bl7\Bbl7YN%\Car!!Nk(
+aG'[%rlkBB$P&cLL&_AeT#cWd$NA6S,)!PN^5i7$rlkBB%L7[*bfm[!"hMq%b:Wcoo??b)s*#*'
+chd\Am!!j!oD\*WGE;e(GBa&d#D.0!meut>X5a0ZGQ7[Vk]_<gp&*['GF&9eGC8!>m[JEEiW&q%
+qu?\?)19d,s8VG0I*)!Zm&P>ks6OrWan,MuX*9Wcs!$ZNH+ibHlE^HRGBq$tr8*9SQN-u/GCe]M
+d<Bnfi;CuHIfBBIG7/u[r6]_7J`-IRGCKPks*+JBs**B##iTuTebng'GBa&ds*+JBs*+GAs*)`f
+qqM;SgtW=^rnI\2!o2Q?bPp8tg&V$*!!)uQ!!)uQ!!*#R#f2$k)+WK;%Enb+!SRPAg]=#Hr7h@r
+50E]V!M0;hrrJ\kqYpSTs7Y4NScJXf<Ib~>
+s!!!oJH16$`rH+gfDkp#aoDFjU&b3;s&JFcn]V@D!-5Zn^QCM"bQ%Y@bl7\Bbl7YN,-]'p!"1!T
+`aAc^rlkBB$R2gp?iUQYYf:&N(B2M_3g@J'\U4AmrlkBB%M5)Mbflj_$-:?7apS3>o??b)s*#*-
+h>I<Qc?Frmq#09=GI.>LGBa&d#C:U3oD\I9SDsSKGQ7[V_KUCTq>&EcGJO6_GD,&UjFh`$iW&q%
+qu?\?)1p]Bs8UAgK\#qsjHXqqs3>hAf(f4)Q$9Rqs!#=(Hd)3]ihHIiGC7g6q9aS6_#OFYGE2%e
+[s*:]m/+89L&V,PG70GtqmUcuNpQYPGD6%rs*+JBs**B##d\`-j8J"iGBa&ds*+JBs*+GAs*)`f
+qq;/Qg=cY\rn7P-"5;H2fDaJ)f)Y^%!!)uO!!)uO!!*#P#d/>C$>nMN"5!P+!S7>>g&[ZBr7V4n
+503QR!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!!!oJH16$`rH+gfDkp#aoDFjU&b3;s&JFcn]V@B!/\M6\:GgIbQ%Y@bl7\Bbl7YN9"_nh!"qo:
+^FK:frlkBB$VJ(H.f^2S]Y>rs>5l_N;P1qMZ<dN5rlkBB%PXj(bfjDo--FHU^]jeLo??b)s*#*B
+kPkM]U3E!_qYT!!GMrN$GBa&d#C1OAp\sa.NT1!<GQ7[VQZn>Dr:RmOGN]!cGFS$uepM[ciW&q%
+qu?\?)40Ocs8Sg;R,Ii<g4OV-s.X_)i;3?)K6Q87s!!hSLY;P#fTH3#GDb8TotbotkPtR+GH(6.
+P]qbZo_+MnZi:")G71DBp69cRWV#nKGI.;Ks*+JBs**B##`a+umJPL^GBa&ds*+JBs*+GAs*)`f
+qpbfLe^X`Nrm_1l%+Wl0e,Iku_uT\b!!)uJ!!)uJ!!*#K#b,Wo#bTYt!n7/!!Q5!+eH(g4r7(kd
+4N%!F!KdB[rrJ5^qYpSJs7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCm/QV""ZQK<;g+r7bl7\@bl7\Bbl7YNHHaUT!!%>hbfKhdrlkBB$[U%@
+aT)<ebfn0/!rgCGYtGu>rVup"rlkBB!+,TI#ZLdYbfm3i#g2b_nc/W5!4De*!jQsgrVm*"GC9Gj
+GBa&d"e9e)Y/TJ[s8R<CrrT6FX8W&&n99<\UNa3HrrVk;GN&T%GPhF?G6#&LrrTHL`Vof@r-*Pg
+Z$41crrW+BI,t;/WHYB>rrT6FX8W&2n99<\s*&\/s8W%AGKKmbrHEPds8R9NaoDD>GB_1/s8@.e
+rr<"Brr<"Bhu<bRGIIMN!q^\\rr<"Brr<"BrVunAc2[[r"9@64=_Rfi"j@>/gg+Xng]>V!qqM/O
+rS.AQrS.AQqqMA+"5M[;C&ZlgbQ.(d!M9>]g]<uHr;Qeh!;c]rN;rV,"J,Vj<E4P~>
+s!!!oJH16$JH1B(s!%JCm/QV""V(Mn>(*UQbl7\@bl7\Bbl7YN[`lt6!!'IObesJbrlkBB$b":'
+_uKeGbfn!*"oc^JQp),brVup$rlkBB!2f\<#9!S^bfkJ8'(X9:s8R9Cjo,2\Km2t`rs&7BJcGao
+GQ.UGJ9RQjb3\'ds*+MC!ebdOrVm)TGD#pIGNf&+!p=cOiW&q%qu?\?!9O1Z!ekjdrVm)sGCfdJ
+GOGG0!r-tjjSo:6GM2ln!ebdOrVmM`GD#qqGB`TWs8$q`nc/XcGC'8gs*"k@s8Vq>GOb_5qKI8b
+s8R<Bs8R<#rrRdrk5PA^j`bqJs8R<Bs8R<As8R;fs81LQ!8?-AZi8Y^ZPD3J(:F.q!OMk(g&M-O
+g&M-Og&M-Mg',Y&g=d=Mrn7C[!:JPARfDp3!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCm/QV""U4rl@YDGnbl7\@bl7\Bbl7YN_T^6(!!'m[bc1XWrlkBB$c:-3
+WW3%9bfm'e'`Q;YIkhK8rVup.rlkBB!5/6R#7CO1bfi'I6h8Iks8R9Co_ndkIWtScrs%G+T`>%9
+GQ.UGHZu3och65rs*+MC!e#:^rVm)%GH(UiGP1t8!k3AtiW&q%qu?\?!;-6i!e,@grVm)\GG+tb
+GPM.:!o\?rjSo:0GOYM0!e#:^rVmM1GH(WBGB`l_s6+ZNq>^KYGD,tqs*"kHs8V;,GPV:=k]_^Z
+s8R<Bs8R<#rrRRlp&=sm[<Hios8R<Bs8R<As8R;fs81=L!7fU,`W"Bk@oq42$HE(q!G)9.eGoUJ
+eGoUJeGoUHeHM`]e^Y#Hrm_$\!:JA<OoOt%!KdB[rrJ5^qYpSJs7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCm/QV"!P0WW!!WHKWQ`Qd!;t(@!<14B!!((=bl7YCa8X9`!!3)Crr<&>
+rlkBB!6>)_"TSSIbd7HJ!<14B!!'b2bQk]Z"LlQ*!(HJ&nc/W5!;6<j"+bZAH2`'gG6E0js*&\d
+rrM_Qrc\EgNp,L&s*+MC!eGRdrVm*$GBj.<GP(n7!rdCfiW&q%qu?\?!;6<j"+bZAH2`'gG6N6k
+JTlBbrcnHe!-mT)!e,@bqu6_KGOk_4#QApls8R:er;Q`rG6%R?rrI=grr<"B!;uirs*"J@rr3"C
+GlIaCGQ.XBGMiE%J9UYbrrW1DGQ.XBGQ.XBGQ%RAGKp0bg_'VBgqX5aft]UHgt]^PSCt_B!;kOO
+!<([Q!<([b!8Q?UOj2RW$/F=P$(T\b4ok$+!M9>]g]<uHr;Qeh!;c]rN;rV,"J,Vj<E4P~>
+s!!!oJH16$JH1B(s!%JCm/QV"!M'l&!!WHa_T^4(!;t(@!<14B!!(4Abl7YCbPo]d!!3)Crr<&B
+rlkBB!6bAc"TSSIb`2`#!<14B!!(.=bQj^>#fk$p!06Wonc/W5!<)lr"+#0:H2`'gG6E3ks*&\d
+rrM&1rc\EgSb_:Fs*+MC!d](grVm*"GBs46GQ%O@!rR7diW&q%qu?\?!<)lr"+#0:H2`'gG6N9l
+H?XX[rcnHe!.!Z*!dT"fqu6_DGPqF>#Q/dks8R:err2rtG6%XArrI=grr<"B!<2uts*"JBrr3"C
+GlIaCGQ.XBGMiE%H$B5drrW+BGQ.XBGQ.XBGQ%RAGKp0bg(FD>g6!)PfWGpPg=hl/Z.Q8r!;kIM
+!<(UO!<(U`!8?-kU!_AL'\_9-(9uMr('*dV!Lj&Yg&[WBr;Qed!;c]rM?!;'"I]>f<E4P~>
+s!!!oJH16$JH1B(s!%JCm/QV"!HnbJ!!WI%aNVj.!;t(@!<14B!<11Db5_PAbQ>rf!WL=C!<11D
+b5_PAbQc5j!R/bj!Vufqbl7YCb5BHg<raDd^BO\Eo$$Y(s*"JBrVltEGBnK5GlMsjIK0=kGQ.UC
+`dIc0!dLjFirB%&s8N.GGQ.R@#4Znds*/berr3&lGB`$Gs*+A?s*"JBrVltEGBnK5GlMskIK+P9
+H$TC6s*"HkjSo:+GQ.L>!dT"hrVm)lGCKSlGBa&d!rdCfrr3'!GBj,es*+JB!rdCfrr3'!GBj,e
+s*+JBs**B#!dJqgrr3&lGBa&ds*+JBs*+GAs*)`fqpc;Ze^[GS\^H]J]%,>14M9+/#lskQ!!)uJ
+!!)uJ&HLA3<N=Hg@7A_s<'7hAQO*Z[eH(g4n^RZ&!;uitOT>7X!J:@FeHD!7qGgOG~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UoIrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=
+!7U'1!n..ukPtV3qZ$]H!7U!/s3os-!7S(N!7S=U!7UB:!n..ui;`l,lMpq6lN$t6q#LF=s&JFc
+nB;9`UioKK!#*T#!<C=Abl7\Bbl7\Abl7\Abl7\Bbl7\Abl7\Abl7\CbQpZ<25\76b5_PAbl7\>
+bQ^]?0!,*X`:D.Bs8R<@rr@NCGQ7^CGQ%OGroD)"L3J=1s8R<CrrRaqo)8Rmrc`VeJ9UYbrrW1D
+GN&T%GPhF?GPqI@Ie\*fs*j`ejSo:1GOt_3!eGRdrVm*$GBj/fGBa#cs*+GAs*+JBs*+GAs*+GA
+s*+JBs*+JBs**B#!e>Lerr3'!GBa&ds*+JBs*+GAs*)`fqqM/OrnIXL.0C2lrS.RS-j(,j!W1XP
+!<([Q!<([Y!8QA<7LBARTDmULV^MW\?if]N!M9>]g]<uHr;Qeh!;c]rN;rV,"J,Vj<E4P~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UoIrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=
+!7U'1!n..ukPtV3qZ$]H!7U!/s3os-!7S(N!7S=U!7UB:!n..ui;`l,lMpq6lN$t6q#LF=s&JFc
+nB;6^R;PJ#!%uL>!<E)B!m1KCrlkBBrQP9ArQP9ArlkBBrQP9ArQP9As3(`]!+)hJbfTncrlkBB
+qTK-Z!,R#_%*J.bnc/W5r;QbBpilc<s*+GA#6*GpV1!QRirB%&s8N.HGPqF>#5i[js*8herr3&u
+GB`$Gs*+A?s*+D@!."?`!WRH?GNAc*H$B2`rrRLjr;HX"r-*Gds*&\cs8R<As8R<Bs8R<As8R<A
+s8R<Bs8R<Bs8R<#rrRIirVlfur-*Aas8R<Bs8R<As8R;fs81LM!<1[TI2`2+If7t(Ii8A.H3=&u
+!!)uO!!)uO#QWT4RPY0U5/7*N"b.El*-q_Tg&[ZBn_+#4!;uitRK33a!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UoIrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=
+!7U'1!n..ukPtV3qZ$]H!7U!/s3os-!7S(N!7S=U!7UB:!n..ui;`l,lMpq6lN$t6q#LF=s&JFc
+nB;6YO(UNW!-ZT1!<E)B!lY->rlkBBrQP9ArQP9ArlkBBrQP9ArQP9As3(`S!-krnbejD\rlkBB
+qof;f$36q_!&Dagbjk`5GPqI@GkcL_s8R<Ars&>N]UjFn`T$ptGQ7[EH$B8drs&%<IfFY:rr2p!
+oQPN<s8R<?s8R<@rr@<=G6._gpikg!!dJqgqu6_CGQ.R@#4ctes8R:erVunArVunArr<"BrVunA
+rVunArr<"Brr<"Bhu<b&GQ.UA!q^\\rr<"Brr<"BrVunAc2[[k!!*#K"C;]C-_:4d"^hlD-^=u7
+eGoUJeGoUJeHc0*eUAhI&l?dNeHK=l""0?>maV?#s7+V?OT>=Z!KdBYrrI`Op=0;.!;]\qJ,~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHrr<&Jr;ZiHnc/[=r;[&N!!(IJ!7U04"4I5M
+e*m>>df9BspAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW3df@kl!!(L=!!(LF!!:ULe)LE.e)C?-
+e("Eue,97He*?u6e,97He,01Ge("Eue)C?-e*d8<df@kU!!(LA!!(LB!!(L5!!(LD!<48C<UBbP
+bQl,f!mJk(!1s26!l"^8rlkBBrQP9ArQP9ArlkBBrQP9ArQP9As3(NO!5AHV!keR6rlkBBqTK,P
+!!=_O2t>,^s8R<@rrT<Hd.mY@GPV7?qfd>Fs8R<CrrT6FXSr/'nTTE]UNa6IrrVk;GN&Q'H$B5b
+s8R<@rrT<Hd/!\CX`r.JrrT3EX8DnuX*:ZDrs&";IK0=kGQ%RAGQ%RAGQ.XBGQ%RAGQ%RAGQ.XB
+GQ.UDH$B5FrrT!?[f6:.oQPNYs8R<Bs8R<As8R;fs6AA?dg4pf!Rh>Bg]=#Hn_=/:!;uitScJWe
+!K@'Pg]X2Kqc-XH~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHrr<&Jr;ZiHnc/[=r;[&N!!(IJ!7U04"4I5M
+e*m>>df9BspAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW3df@kl!!(L=!!(LF!!:ULe)LE.e)C?-
+e("Eue,97He*?u6e,97He,01Ge("Eue)C?-e*d8<df@kU!!(LA!!(LB!!(L5!!(LD!<48C<UBbP
+bQki^"O,'o!5\ZY!j2M'rlkBBrQP9ArQP9ArlkBBrQP9ArQP9As3(NG!6P5a!i>qtrlkBBqTK,0
+!!`i2IIYPOs8R<@rrRjtnbE.aGPV7?p31iBs8R<CrrRjtg\q-Vg382LJp6GXrrVD.GN&Q'G^'/b
+s8R<@rrRjtnbN1dKQltBrrRgsgACmOKQl2Lrs%2$KE(sqGQ%RAGQ%RAGQ.XBGQ%RAGQ%RAGQ.XB
+GQ.UDG^'/FrrRdrkPkJ_k')%Ks8R<Bs8R<As8R;fs6A;=`"Ct^!Q5T<g&[ZBn_+#4!;uitRK33a
+!K$jMg'!iEqc-XH~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHrr<&Jr;ZiHnc/[=r;[&N!!(IJ!7U04"4I5M
+e*m>>df9BspAb<E!!(L;!!C[M!7UZB"4I5Me+3P>e)gW3df@kl!!(L=!!(LF!!:ULe)LE.e)C?-
+e("Eue,97He*?u6e,97He,01Ge("Eue)C?-e*d8<df@kU!!(LA!!(LB!!(L5!!(LD!<48C<UBbP
+bQj[=&Br?"!6>)_!c.i:rlkBBrQP9ArQP9ArlkBBrQP9ArQP9As3(NG!6bAc!b)-0rlkBBqTK+>
+!$)4CY49a+s8R<@rrRUmq=t!iGPV7?i-0e4s8R<CrrRUmnbrIlX*:NBI!>8_rrT]SGN&Q&G^'&b
+s*+D@!e#:gq>UMEGPU(p!e#:^qu6_GGObY3#-2sHs8R:erVunArVunArr<"BrVunArVunArr<"B
+rr3"DGMiE%I!>8_rrTTPGQ.XBGQ.XBGQ%RAGKp0QeH(1fiRIsZ6giJ*OoOt%!KdB[rrJ5^qYpSJ
+s7XtGOT>5X<Ib~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Mdf@hs!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(LE!!:ULe)LE.e)C?-
+e'J'pe)gW1e,01Ge$T/Ue*m>>df9BsiW&u-l2Uh5l2Uh5q#LF=s&JFcn]VUdFfrg)O8o@+b[UVn
+Yf`n#!!*#BrrE#ArrE#ArrE&BrrE#ArrE#ArrE)C#VH*B]#p`r!!*#BrrDl="@E.h"MF9Knc/W5
+r;R5mGC7<or;H-5UAt7;GQ.UIMT+oZqU]q:irB%&s8NbrGC%1"r83EVQN,idIG"MdSTf;:rr\:*
+]DMR,s*+D@'^U$k_s@7!nC"'2m!!iplhp_Nd\>h&(?fsf^@M9gZiB65HGfFRhhu]Es8R:erVunA
+rVunArr<"BrVunArVunArr<"Brr3(\GJ!b2rs7P,I+J8`RWiuTs8R<Bs8R<As8R;fs6eYG0X06L
+:c7@i"Yd16`DAG[g]=#Hn_=/:!;uitScJWe!K@'Pg]X2Kqc-XH~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Mdf@hs!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(LE!!:ULe)LE.e)C?-
+e'J'pe)gW1e,01Ge$T/Ue*m>>df9BsiW&u-l2Uh5l2Uh5q#LF=s&JFcn]VV#K=B"<GlRukbSgIN
+]?$BQ!!*#BrrE#ArrE#ArrE&BrrE#ArrE#ArrE)C#R^WL_T%]H!!*#BrrDo>"j7MY!"$d;bjk`5
+GPqIMcZb#enbr@Nad)o+GBa&d#FNg,rq=EWHK+u)GQ7[V_KUCVqYJWfGJO6^GD5/Xjb7o&iVs".
+GM<#os8R<@rtNe'K?j#cqs2@hs3GnAcLLl1lcGFQrt`LrHd;EaihQOjGC7m9qU0b8_#OFYGQ%RA
+GQ%RAGQ.XBGQ%RAGQ%RAGQ.XBGQ.UEI<XEDiVs1hGD"uUj+DQ"rr<"Brr<"BrVunAc2[4c"];qc
+[3fqUg'(?dfsN/Imb.]1s7+eDRK39c!La#brrIuVp=]Y<!;fbrJ,~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Mdf@hs!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(LE!!:ULe)LE.e)C?-
+e'J'pe)gW1e,01Ge$T/Ue*m>>df9BsiW&u-l2Uh5l2Uh5q#LF=s&JFcn]VV7P.o,L;ZI?PbR=Jg
+_o.67!!*#BrrE#ArrE#ArrE&BrrE#ArrE#ArrE)C#R19da2**,!!*#BrrDo>"j%#M!$o_Wbjk`5
+GPqIMUj&-Wo`"^L_283lGBa&d#Gp)Grpm49J`?_0GQ7[VQ?S;Fr:RsRGNSpbGFe4$fR7sfiVs"+
+GNf&)s8R<@rtM8QQItj/qW>VNs.jk)f_#1>k.uo8rt^uGM;%k'fTH3"GDtGWotu*"k5YI*GQ%RA
+GQ%RAGQ.XBGQ%RAGQ%RAGQ.XBGQ.UEH?\TPiVs1DGFS%!eU2Rbrr<"Brr<"BrVunAc2[4^"`)$(
+TF\0deHKa+d\%,QmaV?#s7+V?OT>=Z!KdBYrrI`Op=0;.!;]\qJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;ZrK!!(LE!!(L8
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ
+!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFrW)rH"9?mNdfBBrrr<&Jr;ZoJ!!)uH
+o`,!@r;cfFrr<&Jr;ZrK!7LrIe,B@Ge,KCKdfBBrklC\2rr<&Jr;ZiHrW)uIrW)oGp&G*ArVurI
+rW)uIrW)oGrVuuJ!<1IA!<(CG!<(CG!<(CG!<(CF!<:OH!<(CH!!1OKrmUTArR:cH!Rh&Je+<VC
+df9Bs!<1IH!<(CG!<:LK!7UoIrR:WD!7UoIs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`G
+q#LF=s&JFcn]^h0"!Gh3[ep+,+92E@bl7\Abl7\Abl7\Bbl7\Abl7\Abl7\CbQ+=6!!42A!<14B
+!;Xh@[/^1XnBCG&s*+A?!6P%\s8W+Crr;h=!0#q;s*+MC!WK;"G6ETns8A)YG63MCGiAZ&dJS4g
+s8R<?rrC1:GQ7[Can^/ArrN,(qf`,Aric3C"bcXMs*&\cs8R<As8R<Bs8R<As8R<As8R<Bs8R<B
+rrCIEGN8](rK[>*!etoCrr<"Brr<"BrVunAc2[4e"fa-V&6%3Bg]a]0!t\D_mb@i7s7+kFScJ]g
+!M0;frrJ)Yp=oeB!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;ZrK!!(LE!!(L8
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ
+!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFrW)rH"9?mNdfBBrrr<&Jr;ZoJ!!)uH
+o`,!@r;cfFrr<&Jr;ZrK!7LrIe,B@Ge,KCKdfBBrklC\2rr<&Jr;ZiHrW)uIrW)oGp&G*ArVurI
+rW)uIrW)oGrVuuJ!<1IA!<(CG!<(CG!<(CG!<(CF!<:OH!<(CH!!1OKrmUTArR:cH!Rh&Je+<VC
+df9Bs!<1IH!<(CG!<:LK!7UoIrR:WD!7UoIs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`G
+q#LF=s&JFcn]^h0"%pe]PPbC^8cSkjbl7\Abl7\Abl7\Bbl7\Abl7\Abl7\CbQ)/N!!5Rh!<14B
+!;Xh@OT5AsnBCG&s*+A?!3Z-As8W+Crr;h=!3+uXs*+MC!WA8[G6F30s8%3CG64:YH/\c'T_s$6
+s8R<?rrB4tGQ7[CY5*;&rrN(aqf`,ArKR2'"dT&ds*&\cs8R<As8R<Bs8R<As8R<As8R<Bs8R<B
+rrA_iGN8](qLJNg!h=IYrr<"Brr<"BrVunAc2[4c"c"0$(hq[bg'*6R!Z5Y)mb.]1s7+eDRK39c
+!La#brrIuVp=]Y<!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;ZrK!!(LE!!(L8
+!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+E\Cdf9Bsr;ZoJ
+!!)uHrr<)K!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$WFrW)rH"9?mNdfBBrrr<&Jr;ZoJ!!)uH
+o`,!@r;cfFrr<&Jr;ZrK!7LrIe,B@Ge,KCKdfBBrklC\2rr<&Jr;ZiHrW)uIrW)oGp&G*ArVurI
+rW)uIrW)oGrVuuJ!<1IA!<(CG!<(CG!<(CG!<(CF!<:OH!<(CH!!1OKrmUTArR:cH!Rh&Je+<VC
+df9Bs!<1IH!<(CG!<:LK!7UoIrR:WD!7UoIs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`G
+q#LF=s&JFcn]^h0",P1F<r;q!IfKKJbl7\Abl7\Abl7\Bbl7\Abl7\Abl7\CbQ'9n!!7NJ!<14B
+!;Xh@8H8afnBCG&s*+D@!WJM_GQ7^CGQ.X=G6$(Ns8R<CrrMnIqf`1Grr;/-rHA=\GC8BL!/UPs
+s8W+Cr;QfsRJD%.s8JG^GNAc)pk8Ng!rr%Jqf`4Hrr<"BGQ%RAGQ%RAGQ.XBGQ%RAGQ%RAGQ.XB
+GQ.UBM#;JWrrMD3rHA=]GBa&ds*+JBs*+GAs*)`fmaVGR'*BD1jOFBH'*BD1mF;6"s7+V?OT>=Z
+!KdBYrrI`Op=0;.!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LF!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LI!<:LL
+!7TEr!!:ULe,97Jdf@kq!!:UL!;t=E!!(LD!!:ULe,97Kdf@kGrW!#K!7UlH"4I8!e,B=Ie+`q@
+e,KFGdfBHtr;[&N!!(IJ!7UiG!7UlH!7UfFr6tZG!7UoI!7UlH!7UlH!7UiGs3prI!n.,Lr6kZH
+e,97Jdf@kq!!:ULe,97Jdf@kq!!(LH!!(LI!!(LH!!C[Me'n9r!7U`D!7UlH"4I8!e,B=Ie+NbA
+e,B@Ie,B=Kdf@kq!"%*S!7Lqs!7Lqsr;ZiHr;ZiHr;ZuL!7Lqsr;ZiHrVurIr;ZrK!7TEr!!(LF
+!!:ULe,97He,97He+j"D,6([0s7+;<Z<e^Z"sI<nrlbV=.g?M[`rH,=bl7\Abl7\Abl7\Bbl7\A
+bl7\Abl7\BbQi\A!Y.oC!!*#BrrDl="2Y$?ZLH*.s8R<>rsS+oML0Z+Vq1nJGBa&d#OSpZH[Ca\
+r8RbVGQ.UIrlpaWHAT!'rr36!X+5VknTT<<rsAY8MgBSks8R:eqYpfcXbqIOM5Sr(rs.hkML0Z+
+Vq0o.&H9q>I!Upps8W)CQ@4(9ZhXP"s*+GAs*+GAs*+JBs*+GAs*+GAs*+JBs*+JB"oZ#jH?XSm
+rs/D&J:4']GBa&ds*+JBs*+GAs*)`fZePSQs7+kFScJ]g!M0;frrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LF!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LI!<:LL
+!7TEr!!:ULe,97Jdf@kq!!:UL!;t=E!!(LD!!:ULe,97Kdf@kGrW!#K!7UlH"4I8!e,B=Ie+`q@
+e,KFGdfBHtr;[&N!!(IJ!7UiG!7UlH!7UfFr6tZG!7UoI!7UlH!7UlH!7UiGs3prI!n.,Lr6kZH
+e,97Jdf@kq!!:ULe,97Jdf@kq!!(LH!!(LI!!(LH!!C[Me'n9r!7U`D!7UlH"4I8!e,B=Ie+NbA
+e,B@Ie,B=Kdf@kq!"%*S!7Lqs!7Lqsr;ZiHr;ZiHr;ZuL!7Lqsr;ZiHrVurIr;ZrK!7TEr!!(LF
+!!:ULe,97He,97He+j"D,6([0s7+;<T2-@,#V'l<rlbUp*s39gb5_PAbl7\Abl7\Abl7\Bbl7\A
+bl7\Abl7\CbQuC'('57\aoDG@bl7\=bQG3P#0-/Vnc/W5qYprWUP4#ANj.OCs*&\drs.MaLj=B3
+_uAZqs*+JB#Q;H"H[LpjrVlg%n=G#YXS6peiVs5]XG2"EGQ7\eGP_=Eg7s@JI#bGjrr35WUP4#A
+Nj.O'rt,.CNI#u>ec5[J^lWnjOMLhos8R<As8R<As8R<Bs8R<As8R<As8R<Bs8R<Brrr;$L3[ue
+ir98STRDBmr-*Aas8R<Bs8R<As8R;fs0LD[RfDp3!La#drrJPgqYpSQs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LF!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA
+!7UoI!7UlH!n..ur;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LI!<:LL
+!7TEr!!:ULe,97Jdf@kq!!:UL!;t=E!!(LD!!:ULe,97Kdf@kGrW!#K!7UlH"4I8!e,B=Ie+`q@
+e,KFGdfBHtr;[&N!!(IJ!7UiG!7UlH!7UfFr6tZG!7UoI!7UlH!7UlH!7UiGs3prI!n.,Lr6kZH
+e,97Jdf@kq!!:ULe,97Jdf@kq!!(LH!!(LI!!(LH!!C[Me'n9r!7U`D!7UlH"4I8!e,B=Ie+NbA
+e,B@Ie,B=Kdf@kq!"%*S!7Lqs!7Lqsr;ZiHr;ZiHr;ZuL!7Lqsr;ZiHrVurIr;ZrK!7TEr!!(LF
+!!:ULe,97He,97He+j"D,6([0s7+;;NC"6Z$oNn?bQhSm"!E-<!!*#BrrE#ArrE#ArrE&BrrE#A
+rrE#ArrE)C#ff[M![3$:!!*#BrrDl="*=MZb4*XFs8R<>rsR)AJp;a.\aKLtGBa&d#1]K$G^l11
+iW&q%rr35uZAEmVQHfF.rs.>DHA0#qGE:__$14I=G^"B3s*&\`rs-f=Jp;a.\aKIs#L/cjG^bje
+mc4<Ypp,^#J>23+s7imVH@D1)rr2rtGQ%RAGQ%RAGQ.XBGQ%RAGQ%RAGQ.XBGQ.UGm@o2WGB`'H
+#Mt_lKY.5-GQ.XBGQ.XBGQ%RAGKp/oeH(g4n^RZ&!;uitOT>7X!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UlH
+s3pB9s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH
+"Od>Ne'mmg!7UlHr6kZHe,97Jdf@kq!!:ULe,'+Fe,97He*@#2e,B@Ie,'+Fe,97He+<VCdf@hs
+e,97He,97He,01Ge,97He+`qCe,9:De,KFJe,04Ge+s%Ee,B=Ie,97Jdf@kq!!(LC!<:OH!!(LH
+!!(LB!!(LH!!(LH!!:ULe,97Pdf9Bs!7Lqs!;k7E!!(LG!!LaNdf@kq!!(LI!!(LF!!(LH!!:UL
+!;t:G!;k7D!!(LD!<48C<UBa]bQ<k+,4EaHrrVV4J:[`Os7?8sh#IEEg]<uHr;Qeh!;c]rN;rV,
+"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UlH
+s3pB9s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH
+"Od>Ne'mmg!7UlHr6kZHe,97Jdf@kq!!:ULe,'+Fe,97He*@#2e,B@Ie,'+Fe,97He+<VCdf@hs
+e,97He,97He,01Ge,97He+`qCe,9:De,KFJe,04Ge+s%Ee,B=Ie,97Jdf@kq!!(LC!<:OH!!(LH
+!!(LB!!(LH!!(LH!!:ULe,97Pdf9Bs!7Lqs!;k7E!!(LG!!LaNdf@kq!!(LI!!(LF!!(LH!!:UL
+!;t:G!;k7D!!(LD!<48C<UBa]bQ9j+<q"8'rrU_pM1P\Xs7?8sgAh3Cg&[WBr;Qed!;c]rM?!;'
+"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UlH
+s3pB9s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH!n..ur;ZoJ!7UlH
+"Od>Ne'mmg!7UlHr6kZHe,97Jdf@kq!!:ULe,'+Fe,97He*@#2e,B@Ie,'+Fe,97He+<VCdf@hs
+e,97He,97He,01Ge,97He+`qCe,9:De,KFJe,04Ge+s%Ee,B=Ie,97Jdf@kq!!(LC!<:OH!!(LH
+!!(LB!!(LH!!(LH!!:ULe,97Pdf9Bs!7Lqs!;k7E!!(LG!!LaNdf@kq!!(LI!!(LF!!(LH!!:UL
+!;t:G!;k7D!!(LD!<48C<UBa]bQ8X^S+"RlrrT!?^4H<8s7?8sec5[>eH(d4r;Qe[!;c]rK)bPp
+"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,KCJe*R,8
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97H
+e,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97He,9:H
+e+E\@e,B=Ie,97Jdf@kq!!:ULe,97Jdf@ko!!(LH!!(L6!!(LD!<:OF!!(LH!!(L?!!LaNdf@kq
+!!(LH!!(LG!!(LH!!(LA!<:OJ!!(LC!<:OG!<:OG!!(LI!!(LH!!:ULe,97He+NeAe,KCJe,97H
+e+WhBe,97He,97Jdf@kq!"%*S!7Lqs!7Lqsq#CEDqu?lK!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!7UlH
+!n..up](<Cq#LF=s&JFcV9B%X-38kibbG+BOOs=*h2-?GJcC<$oDbJT!!)rs!M0;fg]<B6p=oeB
+!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,KCJe*R,8
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97H
+e,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97He,9:H
+e+E\@e,B=Ie,97Jdf@kq!!:ULe,97Jdf@ko!!(LH!!(L6!!(LD!<:OF!!(LH!!(L?!!LaNdf@kq
+!!(LH!!(LG!!(LH!!(LA!<:OJ!!(LC!<:OG!<:OG!!(LI!!(LH!!:ULe,97He+NeAe,KCJe,97H
+e+WhBe,97He,97Jdf@kq!"%*S!7Lqs!7Lqsq#CEDqu?lK!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!7UlH
+!n..up](<Cq#LF=s&JFcV9B%M$3@d-bbG+BU>c%Gd!U&]JcC<$oDbJP!!)rs!La#bg&['1p=]Y<
+!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,KCJe*R,8
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+WhBe,97He,97H
+e,9:He,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Jdf@kq!!:ULe,97He,9:H
+e+E\@e,B=Ie,97Jdf@kq!!:ULe,97Jdf@ko!!(LH!!(L6!!(LD!<:OF!!(LH!!(L?!!LaNdf@kq
+!!(LH!!(LG!!(LH!!(LA!<:OJ!!(LC!<:OG!<:OG!!(LI!!(LH!!:ULe,97He+NeAe,KCJe,97H
+e+WhBe,97He,97Jdf@kq!"%*S!7Lqs!7Lqsq#CEDqu?lK!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!7UlH
+!n..up](<Cq#LF=s&JFcV9B%9"TcU2bbG+BZK_>Z_0L7jJcC<$oDbJG!!)rs!KdBYeH(:%p=0;.
+!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!C[M!7U<8!7UcE"4I5Me*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bs
+pAb3Bqu?`GrW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@IdfKNu
+e,B=Kdf@kr!<:LK!7UlH!7UWA!7UoI!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!n..ur;ZiHlMpq6
+r;[&N!!(IJ!7UiG!7UlH!7UoI!7U]C"OdA"!7UlH!7UlH!7UoI!n..ur;ZiHq#CEDr;ZoJ!7UlH
+!n..ur;ZoJ!7UlH!7UlH!7UoI!7UlH!n..ur;ZiHq#CEDr;ZoJ!7UlH!7U]C!7UiG!7UlH!n..u
+r;[/Q!!(IJdf@hse,97Kdf9BsqZ$cJ!7Lqsr;ZiHrVurIr;ZoJ!7UlH!n..urW)uI!<CUI!!(LH
+!!(LD!<48C<UBa_bl.SB'(3u<s8.!@JG=]qJcGBBScJ]g!1s#d!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!C[M!7U<8!7UcE"4I5Me*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bs
+pAb3Bqu?`GrW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@IdfKNu
+e,B=Kdf@kr!<:LK!7UlH!7UWA!7UoI!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!n..ur;ZiHlMpq6
+r;[&N!!(IJ!7UiG!7UlH!7UoI!7U]C"OdA"!7UlH!7UlH!7UoI!n..ur;ZiHq#CEDr;ZoJ!7UlH
+!n..ur;ZoJ!7UlH!7UlH!7UoI!7UlH!n..ur;ZiHq#CEDr;ZoJ!7UlH!7U]C!7UiG!7UlH!n..u
+r;[/Q!!(IJdf@hse,97Kdf9BsqZ$cJ!7Lqsr;ZiHrVurIr;ZoJ!7UlH!n..urW)uI!<CUI!!(LH
+!!(LD!<48C<UBa_bl.SB/FL`Vs8.!@NW"G.JcGBBScJ]g!1N``!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!C[M!7U<8!7UcE"4I5Me*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bs
+pAb3Bqu?`GrW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@IdfKNu
+e,B=Kdf@kr!<:LK!7UlH!7UWA!7UoI!7UoIs3guKe,B@IdfBHtr;ZoJ!7UlH!n..ur;ZiHlMpq6
+r;[&N!!(IJ!7UiG!7UlH!7UoI!7U]C"OdA"!7UlH!7UlH!7UoI!n..ur;ZiHq#CEDr;ZoJ!7UlH
+!n..ur;ZoJ!7UlH!7UlH!7UoI!7UlH!n..ur;ZiHq#CEDr;ZoJ!7UlH!7U]C!7UiG!7UlH!n..u
+r;[/Q!!(IJdf@hse,97Kdf9BsqZ$cJ!7Lqsr;ZiHrVurIr;ZoJ!7UlH!n..urW)uI!<CUI!!(LH
+!!(LD!<48C<UBa_bl.SBDXP`Cs8.!@W;_AJJcGBBScJ]g!0R*W!J:@FeHD!7qGgOG~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nEdf9CF
+e+*M9e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!7LrIe,B@HdfTU!!!)uHpAk-?rrE&I!s$dM!<1FL
+!7Lqsr;ZoJ!!)uHrr<&Jr;ZiHl2^e3rr<&Jr;ZoJ!!)rGrW)rHp&G0C!7UoIr6tWFrmUlI!7UlH
+!7U]CrR:`GrR:`GrR:`GrR:`Gr6tZGrR:cH!7UlH!7U]CrR:cH!7UlH!7U]C!7UiG!7UlH!n.,L
+rR:`G!7UoI!n.,LrR:`G!7UfF!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe,'.F
+,6([0s/+!B!!4@=m`_F*#3_n8H%`0cJcC<$K)Yk1s7Y4NScJXf<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nEdf9CF
+e+*M9e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!7LrIe,B@HdfTU!!!)uHpAk-?rrE&I!s$dM!<1FL
+!7Lqsr;ZoJ!!)uHrr<&Jr;ZiHl2^e3rr<&Jr;ZoJ!!)rGrW)rHp&G0C!7UoIr6tWFrmUlI!7UlH
+!7U]CrR:`GrR:`GrR:`GrR:`Gr6tZGrR:cH!7UlH!7U]CrR:cH!7UlH!7U]C!7UiG!7UlH!n.,L
+rR:`G!7UoI!n.,LrR:`G!7UfF!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe,'.F
+,6([0s/+!B!!4plm`_F*#1o>nHAT$+JcC<$K)Yk.s7Y.LRK34b<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nEdf9CF
+e+*M9e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!7LrIe,B@HdfTU!!!)uHpAk-?rrE&I!s$dM!<1FL
+!7Lqsr;ZoJ!!)uHrr<&Jr;ZiHl2^e3rr<&Jr;ZoJ!!)rGrW)rHp&G0C!7UoIr6tWFrmUlI!7UlH
+!7U]CrR:`GrR:`GrR:`GrR:`Gr6tZGrR:cH!7UlH!7U]CrR:cH!7UlH!7U]C!7UiG!7UlH!n.,L
+rR:`G!7UoI!n.,LrR:`G!7UfF!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe,'.F
+,6([0s/+!B!!Z!7m`_F*#0<!UI#u8EJcC<$K)Yk's7XtGOT>5X<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCm/N-jJcC<$JcD8?!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCm/N-jJcC<$JcD8?!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCm/N-jJcC<$JcD8?!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnWs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnTs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnMs7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnWs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnTs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnMs7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnWs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnTs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCrVqGmJ]r\hJ]s\/rVlnMs7XtGOT>5X<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UoIrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pZArR:?<
+!7U'1!n..ukPtV3JH16$WrW/Ds&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UoIrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pZArR:?<
+!7U'1!n..ukPtV3JH16$WrW/Ds&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpYHC!7UoIrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pZArR:?<
+!7U'1!n..ukPtV3JH16$WrW/Ds&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHrr<&Jr;ZiHnc/[=r;[&N!!(IJ!7U04"4I5M
+e*m>>df9BspAb<E!!(L;!!C[M!7U]C!7UlH!7UQ?!7U'1!n..up](<Cnc/[=irB).JH16$aoMGc
+s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHrr<&Jr;ZiHnc/[=r;[&N!!(IJ!7U04"4I5M
+e*m>>df9BspAb<E!!(L;!!C[M!7U]C!7UlH!7UQ?!7U'1!n..up](<Cnc/[=irB).JH16$aoMGc
+s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$WFr;clHrr<&Jr;ZiHnc/[=r;[&N!!(IJ!7U04"4I5M
+e*m>>df9BspAb<E!!(L;!!C[M!7U]C!7UlH!7UQ?!7U'1!n..up](<Cnc/[=irB).JH16$aoMGc
+s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Mdf@hs!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(L-!!(K!!.b-m!<48C
+<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Mdf@hs!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(L-!!(K!!.b-m!<48C
+<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!$b/!7U35!7U97"4I5Me,97He,01Ge,97Mdf@hs!7UlH!7UK=!7UlH!n..ur;ZiHlMpq6r;ZiH
+nc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,!@jo>M4!!(L4!!(L-!!(K!!.b-m!<48C
+<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;[&N!!(IJ!7UoI
+s3p?8!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHoDem?o`,*C!!(LH!!:UL
+!<(CH!!1OKrmU`E"Od>NdfBBrr;clHrVuuJ!<1IE!!C[M!7UlH"4I8!!<1II!!(LH!!C[M!7UoI
+!Rh&Idt%LM!6bHC,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;[&N!!(IJ!7UoI
+s3p?8!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHoDem?o`,*C!!(LH!!:UL
+!<(CH!!1OKrmU`E"Od>NdfBBrr;clHrVuuJ!<1IE!!C[M!7UlH"4I8!!<1II!!(LH!!C[M!7UoI
+!Rh&Idt%LM!6bHC,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHr;[&N!!(IJ!7UoI
+s3p?8!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHoDem?o`,*C!!(LH!!:UL
+!<(CH!!1OKrmU`E"Od>NdfBBrr;clHrVuuJ!<1IE!!C[M!7UlH"4I8!!<1II!!(LH!!C[M!7UoI
+!Rh&Idt%LM!6bHC,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LI!<1FJ!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+E\@e+E\@
+e,B=Ie,97Jdf@kq!!C[M!7UoI!7UlH!7UoIs3prI!7UlH!7UoIs3prI!7UlH!7UoI!7UlH"4I5M
+e,B=Odf9Bs!!(LI!!(LI!!C[M!7QK!JH3gms!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LI!<1FJ!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+E\@e+E\@
+e,B=Ie,97Jdf@kq!!C[M!7UoI!7UlH!7UoIs3prI!7UlH!7UoIs3prI!7UlH!7UoI!7UlH"4I5M
+e,B=Odf9Bs!!(LI!!(LI!!C[M!7QK!JH3gms!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!!(LI
+!!(LI!<1FJ!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+E\@e+E\@
+e,B=Ie,97Jdf@kq!!C[M!7UoI!7UlH!7UoIs3prI!7UlH!7UoIs3prI!7UlH!7UoI!7UlH"4I5M
+e,B=Odf9Bs!!(LI!!(LI!!C[M!7QK!JH3gms!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UcE
+!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UZBs3pW@!7UlH!7UlH
+"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,97He,B=L
+df9BsJH16$aoMGcs&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UcE
+!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UZBs3pW@!7UlH!7UlH
+"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,97He,B=L
+df9BsJH16$aoMGcs&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7UlH!7UoI!7UcE
+!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UZBs3pW@!7UlH!7UlH
+"Od>Ne'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,97He,B=L
+df9BsJH16$aoMGcs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,'+Fe+!D<
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+`nCe+3P>e,97He,97He,9:H
+e,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Kdf9Bsq>gQEqu?fI!7UoI!7QK!
+JH3gms!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,'+Fe+!D<
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+`nCe+3P>e,97He,97He,9:H
+e,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Kdf9Bsq>gQEqu?fI!7UoI!7QK!
+JH3gms!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee,9:De,'+Fe+!D<
+e,01Ge,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+`nCe+3P>e,97He,97He,9:H
+e,B=Ie+s%Ee,97He,97He,97He,B=Ie,97He,B=Ie,97He,97Kdf9Bsq>gQEqu?fI!7UoI!7QK!
+JH3gms!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!(LF!!(L<!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UoI!7UN>
+!7UiG!7UoIs3guKe,97Kdf9BsqZ$WFquHcGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LI!<:OJ!!(LF
+!!C[M!7UlH!n..urVurIrVurIJH16$c2dkgs&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!(LF!!(L<!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UoI!7UN>
+!7UiG!7UoIs3guKe,97Kdf9BsqZ$WFquHcGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LI!<:OJ!!(LF
+!!C[M!7UlH!n..urVurIrVurIJH16$c2dkgs&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LC
+!!(LF!!(L<!!(LE!!C[M!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UoI!7UN>
+!7UiG!7UoIs3guKe,97Kdf9BsqZ$WFquHcGrVurIr;ZiHrVurIr;ZrK!!(LG!!(LI!<:OJ!!(LF
+!!C[M!7UlH!n..urVurIrVurIJH16$c2dkgs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nCe,B@H
+e*mA7e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!!(LG!!(LH!!(LH!!(LG!<1Gu!.b-p!<48C<It1$
+s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nCe,B@H
+e*mA7e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!!(LG!!(LH!!(LH!!(LG!<1Gu!.b-p!<48C<It1$
+s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe+`nCe,B@H
+e*mA7e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WF
+qu?cH!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!!(LG!!(LH!!(LH!!(LG!<1Gu!.b-p!<48C<It1$
+s+13$s-<TbK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpPNFqpYNEs3pE:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7UB:
+!7Tj+!7QK!JH2&;s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpPNFqpYNEs3pE:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7UB:
+!7Tj+!7QK!JH2&;s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$b/!7U66s3pH;qpYQFrR:cHqpPNFqpYNEs3pE:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7UB:
+!7Tj+!7QK!JH2&;s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$]H!7UcE"4I5Me+!D<e,97Ndf9Bs!!(L4!!C[M!7UE;
+"4I5Me+WhEdf9Bsn,NR>!!(LA!<:O:!!(L+!!(K!!.b-;!<48C<It1$s+13$s-<TbN;rV,"J,Vj
+<E4P~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$]H!7UcE"4I5Me+!D<e,97Ndf9Bs!!(L4!!C[M!7UE;
+"4I5Me+WhEdf9Bsn,NR>!!(LA!<:O:!!(L+!!(K!!.b-;!<48C<It1$s+13$s-<TbM?!;'"I]>f
+<E4P~>
+s!%.:!7UZB!7U35!7U66!n..ur;ZiHqZ$]H!7UcE"4I5Me+!D<e,97Ndf9Bs!!(L4!!C[M!7UE;
+"4I5Me+WhEdf9Bsn,NR>!!(LA!<:O:!!(L+!!(K!!.b-;!<48C<It1$s+13$s-<TbK)bPp"H`]\
+<E4P~>
+s!$b/!7U35!7U97"4I5Me,97He,01Jdf9BsqZ$WFr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U]C!n..umJm79i;`l,JH16$QiR.1s&FXMJcC<$JcD#8!K@'P
+g]X2Kqc-XH~>
+s!$b/!7U35!7U97"4I5Me,97He,01Jdf9BsqZ$WFr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U]C!n..umJm79i;`l,JH16$QiR.1s&FXMJcC<$JcD#8!K$jM
+g'!iEqc-XH~>
+s!$b/!7U35!7U97"4I5Me,97He,01Jdf9BsqZ$WFr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U]C!n..umJm79i;`l,JH16$QiR.1s&FXMJcC<$JcD#8!J:@F
+eHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHrVuuJ!<1II!!(LH
+!!(L8!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+NbAe*[29e*d;6e,KFH
+e,KCKdfBBrJH16$S,iR5s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHrVuuJ!<1II!!(LH
+!!(L8!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+NbAe*[29e*d;6e,KFH
+e,KCKdfBBrJH16$S,iR5s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gm/R.8q#CEDr;ZiHrVuuJ!<1II!!(LH
+!!(L8!!:ULe,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+NbAe*[29e*d;6e,KFH
+e,KCKdfBBrJH16$S,iR5s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!<:OI
+!!:ULe,97He*[2<df9Bsr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Am/R.8
+li7.:!!(LH!!C[Me'n9r!7QK!JH25@s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!<:OI
+!!:ULe,97He*[2<df9Bsr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Am/R.8
+li7.:!!(LH!!C[Me'n9r!7QK!JH25@s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L9!<1IE!!(LG!!(LI!<:OI
+!!:ULe,97He*[2<df9Bsr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Am/R.8
+li7.:!!(LH!!C[Me'n9r!7QK!JH25@s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7U]C!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Ali7%7mJm79r;clH
+r;ZiHr;ZiHJH16$SH/[6s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7U]C!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Ali7%7mJm79r;clH
+r;ZiHr;ZiHJH16$SH/[6s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U66!7UoIs3plG!7U]C!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*Ali7%7mJm79r;clH
+r;ZiHr;ZiHJH16$SH/[6s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+`nEdf@kq!!(L<
+!!(LG!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L7!!(L:!!(LE!<:OJ
+!!(LH!!(K!!.b-@!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+`nEdf@kq!!(L<
+!!(LG!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L7!!(L:!!(LE!<:OJ
+!!(LH!!(K!!.b-@!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U66"4I5Me+s%Ee+`nEdf@kq!!(L<
+!!(LG!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LA!!(L7!!(L:!!(LE!<:OJ
+!!(LH!!(K!!.b-@!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LG
+!!(LH!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`G
+qZ$WFlMpq6nGiR<qu?`Gr;ZoJ!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LG
+!!(LH!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`G
+qZ$WFlMpq6nGiR<qu?`Gr;ZoJ!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*m>;e,97Jdf@kn!!(LG
+!!(LH!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`G
+qZ$WFlMpq6nGiR<qu?`Gr;ZoJ!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.De,9:H
+e*mA7e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe*R,8e+*M9e,KFHe,KCJe,97Hdt%LM
+!1a,i,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.De,9:H
+e*mA7e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe*R,8e+*M9e,KFHe,KCJe,97Hdt%LM
+!1a,i,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe+!G:e,KFFe,KCJe,'.De,9:H
+e*mA7e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe*R,8e+*M9e,KFHe,KCJe,97Hdt%LM
+!1a,i,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYQFrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7T9p
+s3pW@rmRtL!7QK!W;urBs&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYQFrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7T9p
+s3pW@rmRtL!7QK!W;urBs&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYQFrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7T9p
+s3pW@rmRtL!7QK!W;urBs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$]H!7UlH!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M
+!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(Kq!!C[M!7UZB!7UoI!7SCW!7U`D!7U-3!7U<8!7UlH
+!7U!/!7QK!qZ-X?s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$]H!7UlH!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M
+!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(Kq!!C[M!7UZB!7UoI!7SCW!7U`D!7U-3!7U<8!7UlH
+!7U!/!7QK!qZ-X?s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$]H!7UlH!7UK=!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M
+!7UZB"4I5Me*m>>df9BspAb<E!!(Kt!!(Kq!!C[M!7UZB!7UoI!7SCW!7U`D!7U-3!7U<8!7UlH
+!7U!/!7QK!qZ-X?s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Jdf9Bsr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH
+!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7TBs!7UlH!7U]C!7RqJ!7T3n!7QK!h#RI!s&FXM
+JcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Jdf9Bsr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH
+!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7TBs!7UlH!7U]C!7RqJ!7T3n!7QK!h#RI!s&FXM
+JcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Jdf9Bsr;ZiHnc/[=r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH
+!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7TBs!7UlH!7U]C!7RqJ!7T3n!7QK!h#RI!s&FXM
+JcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHrVurIrW)uI
+m/R4:!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7UB:!Rh&J
+e,B@Ge+!D<e,97He+`nCe*R/6e+`nCe,97Jdf9CHe,B@Ge,KCKdfBBrp](?D!<1IG!<:OH!<1FJ
+!7U`D!Rh&Je,KCKdfBBrr;clHr;cfFrr<)K!<1IG!<:OI!<(CG!!(LH!!(LD!!1OKrmUfGs3p]B
+!Rh&Je,B@Ge,KCKdfBBrrr<&Jr;ZiHq#CHE!<1IH!<:LK!7UoIrR:`Gs3guKe+Wk@e,KCKdfBBr
+rW)rH!s$dM!<(C.!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHrVurIrW)uI
+m/R4:!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7UB:!Rh&J
+e,B@Ge+!D<e,97He+`nCe*R/6e+`nCe,97Jdf9CHe,B@Ge,KCKdfBBrp](?D!<1IG!<:OH!<1FJ
+!7U`D!Rh&Je,KCKdfBBrr;clHr;cfFrr<)K!<1IG!<:OI!<(CG!!(LH!!(LD!!1OKrmUfGs3p]B
+!Rh&Je,B@Ge,KCKdfBBrrr<&Jr;ZiHq#CHE!<1IH!<:LK!7UoIrR:`Gs3guKe+Wk@e,KCKdfBBr
+rW)rH!s$dM!<(C.!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHrVurIrW)uI
+m/R4:!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7TEt!7UB:!Rh&J
+e,B@Ge+!D<e,97He+`nCe*R/6e+`nCe,97Jdf9CHe,B@Ge,KCKdfBBrp](?D!<1IG!<:OH!<1FJ
+!7U`D!Rh&Je,KCKdfBBrr;clHr;cfFrr<)K!<1IG!<:OI!<(CG!!(LH!!(LD!!1OKrmUfGs3p]B
+!Rh&Je,B@Ge,KCKdfBBrrr<&Jr;ZiHq#CHE!<1IH!<:LK!7UoIrR:`Gs3guKe+Wk@e,KCKdfBBr
+rW)rH!s$dM!<(C.!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LH!<1FJ
+!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'e9se*mA;
+e,B=Kdf@kq!!(LC!;t:H!7UlH!7U`DrR:H?r6kZHe,97He+itDe,97Jdf@kq!!:ULe,97Kdf9Bs
+rVurIq#LHDrVurIr;ZiHrVurIrW)uIq#LHDrW!&L!!(LI!!(LH!!(LI!!(LH!!C[M!7UoI!7UlH
+!7UlH!7UiG!7UlH!7U`Ds3prI!7UlH!7UZBs3prI!n..ur;ZrK!7TEr!!:ULe,97He+j"De,B=R
+df9Bs!7Lqs!7UlH#L`YQdf@hse+<VBdf9BsrW!#K!7UoI"4I5Me,97He)gZ1,6(Yos+13$s+138
+rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LH!<1FJ
+!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'e9se*mA;
+e,B=Kdf@kq!!(LC!;t:H!7UlH!7U`DrR:H?r6kZHe,97He+itDe,97Jdf@kq!!:ULe,97Kdf9Bs
+rVurIq#LHDrVurIr;ZiHrVurIrW)uIq#LHDrW!&L!!(LI!!(LH!!(LI!!(LH!!C[M!7UoI!7UlH
+!7UlH!7UiG!7UlH!7U`Ds3prI!7UlH!7UZBs3prI!n..ur;ZrK!7TEr!!:ULe,97He+j"De,B=R
+df9Bs!7Lqs!7UlH#L`YQdf@hse+<VBdf9BsrW!#K!7UoI"4I5Me,97He)gZ1,6(Yos+13$s+138
+rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LH!<1FJ
+!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'e9se*mA;
+e,B=Kdf@kq!!(LC!;t:H!7UlH!7U`DrR:H?r6kZHe,97He+itDe,97Jdf@kq!!:ULe,97Kdf9Bs
+rVurIq#LHDrVurIr;ZiHrVurIrW)uIq#LHDrW!&L!!(LI!!(LH!!(LI!!(LH!!C[M!7UoI!7UlH
+!7UlH!7UiG!7UlH!7U`Ds3prI!7UlH!7UZBs3prI!n..ur;ZrK!7TEr!!:ULe,97He+j"De,B=R
+df9Bs!7Lqs!7UlH#L`YQdf@hse+<VBdf9BsrW!#K!7UoI"4I5Me,97He)gZ1,6(Yos+13$s+138
+rrI`Op=0;.!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<!7UlH
+"Od>Ne'macqpY<?!7U?9!7UlH!7U`D!7UlH"Od>Ne'n6qqpYQF!7UT@!7UlH!7UlH!7UoI!7UlH
+!7U`D!7UlH"4I5Me+itDe,B=Ie,97Kdf9Bsq#CEDr;ZiHqu?`Gr;ZiHq#CEDr;ZiHr;ZiHpAb3B
+r;ZoJ!7UfF!7UlH!n..ur;ZiHq#CEDr;[,P!!(IJdf@hsqpYQF"OdA"!7U]Cr6tZG!7UiG!7UoI
+!7UoIs3p!.s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<!7UlH
+"Od>Ne'macqpY<?!7U?9!7UlH!7U`D!7UlH"Od>Ne'n6qqpYQF!7UT@!7UlH!7UlH!7UoI!7UlH
+!7U`D!7UlH"4I5Me+itDe,B=Ie,97Kdf9Bsq#CEDr;ZiHqu?`Gr;ZiHq#CEDr;ZiHr;ZiHpAb3B
+r;ZoJ!7UfF!7UlH!n..ur;ZiHq#CEDr;[,P!!(IJdf@hsqpYQF"OdA"!7U]Cr6tZG!7UiG!7UoI
+!7UoIs3p!.s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<!7UlH
+"Od>Ne'macqpY<?!7U?9!7UlH!7U`D!7UlH"Od>Ne'n6qqpYQF!7UT@!7UlH!7UlH!7UoI!7UlH
+!7U`D!7UlH"4I5Me+itDe,B=Ie,97Kdf9Bsq#CEDr;ZiHqu?`Gr;ZiHq#CEDr;ZiHr;ZiHpAb3B
+r;ZoJ!7UfF!7UlH!n..ur;ZiHq#CEDr;[,P!!(IJdf@hsqpYQF"OdA"!7U]Cr6tZG!7UiG!7UoI
+!7UoIs3p!.s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<s3prI
+!7UlHs3pK<!7UlH!7U]C!7U?9!7UlH!7U`D!7UlH!7UlHs3puJ!7UcE!7UT@s3prI!7UlH!7UoI
+!7UlH!7U`Ds3prI"4I5Me+itDe,B=Ie,97Kdf9Bsq#CEDr;ZiHqu?`GrW)uIq#CEDr;ZiHr;ZiH
+pAk6BrW!#K!7UfFs3prI!n..ur;ZiHq#LHDrW!8R!!(IJdf@hse+s%Idf@hse+itDe,97Kdf9Bs
+qZ-WEqZ-ZFjT,<)s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<s3prI
+!7UlHs3pK<!7UlH!7U]C!7U?9!7UlH!7U`D!7UlH!7UlHs3puJ!7UcE!7UT@s3prI!7UlH!7UoI
+!7UlH!7U`Ds3prI"4I5Me+itDe,B=Ie,97Kdf9Bsq#CEDr;ZiHqu?`GrW)uIq#CEDr;ZiHr;ZiH
+pAk6BrW!#K!7UfFs3prI!n..ur;ZiHq#LHDrW!8R!!(IJdf@hse+s%Idf@hse+itDe,97Kdf9Bs
+qZ-WEqZ-ZFjT,<)s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UH<s3prI
+!7UlHs3pK<!7UlH!7U]C!7U?9!7UlH!7U`D!7UlH!7UlHs3puJ!7UcE!7UT@s3prI!7UlH!7UoI
+!7UlH!7U`Ds3prI"4I5Me+itDe,B=Ie,97Kdf9Bsq#CEDr;ZiHqu?`GrW)uIq#CEDr;ZiHr;ZiH
+pAk6BrW!#K!7UfFs3prI!n..ur;ZiHq#LHDrW!8R!!(IJdf@hse+s%Idf@hse+itDe,97Kdf9Bs
+qZ-WEqZ-ZFjT,<)s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+p](<CnGiR<q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH!!C[M!7T9p
+!7UK=!Rh&Je,KCJe,97He+*J=e,97He+`nCe*[29e,97He+itDe,B@IdfBHtr;ZoJ!7UlH"4I5M
+e+s(De,KCKdfBBrqu?`GrVurIrW)uIrW)rHrr<)K!<1IH!!(LD!!(LI!!(LH!!C[M!7U`D!7UlH
+!7UoI!n.,LrmLlJe,B@He,KCJe,97He,97He,04Fe,KCKdfBBrrr<&Jr;ZrK!7LrIe,KCJe,B@I
+e,B@He,KCKdfBBrrW!/O!7Lqs!7UlH#L`YQdf@hse,B@He,KCJe,B@Ie,KCJe,01Ge,'+Fe,97H
+e)gZ1,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+p](<CnGiR<q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH!!C[M!7T9p
+!7UK=!Rh&Je,KCJe,97He+*J=e,97He+`nCe*[29e,97He+itDe,B@IdfBHtr;ZoJ!7UlH"4I5M
+e+s(De,KCKdfBBrqu?`GrVurIrW)uIrW)rHrr<)K!<1IH!!(LD!!(LI!!(LH!!C[M!7U`D!7UlH
+!7UoI!n.,LrmLlJe,B@He,KCJe,97He,97He,04Fe,KCKdfBBrrr<&Jr;ZrK!7LrIe,KCJe,B@I
+e,B@He,KCKdfBBrrW!/O!7Lqs!7UlH#L`YQdf@hse,B@He,KCJe,B@Ie,KCJe,01Ge,'+Fe,97H
+e)gZ1,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+p](<CnGiR<q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH!!C[M!7T9p
+!7UK=!Rh&Je,KCJe,97He+*J=e,97He+`nCe*[29e,97He+itDe,B@IdfBHtr;ZoJ!7UlH"4I5M
+e+s(De,KCKdfBBrqu?`GrVurIrW)uIrW)rHrr<)K!<1IH!!(LD!!(LI!!(LH!!C[M!7U`D!7UlH
+!7UoI!n.,LrmLlJe,B@He,KCJe,97He,97He,04Fe,KCKdfBBrrr<&Jr;ZrK!7LrIe,KCJe,B@I
+e,B@He,KCKdfBBrrW!/O!7Lqs!7UlH#L`YQdf@hse,B@He,KCJe,B@Ie,KCJe,01Ge,'+Fe,97H
+e)gZ1,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.Ee*mA7
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+*J=e+s(Ce+!D<e,97He+`nCe*R/6
+e+WkAdfTU!!!)uHrW)oGrVurIq>gQErVurIq>gHBrrE&I!<CUJ!<:OI!!(LE!!(LF!;t=G!<(CG
+!!(LF!;t=F!<1ID!!(LI!<:OI!!(LH!!:UL!;t=F!<:OI!!(LE!<(CH!!(LE!<1FJ!7UoIs3prI
+!7UcE!7UoI!n.,LrR:`G!7UoI!7UoIs3poHrmLuMdf9BsqZ-TDrW)oGjT,<)s&FXMJcC<$JcD#8
+!K@'Pg]X2Kqc-XH~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.Ee*mA7
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+*J=e+s(Ce+!D<e,97He+`nCe*R/6
+e+WkAdfTU!!!)uHrW)oGrVurIq>gQErVurIq>gHBrrE&I!<CUJ!<:OI!!(LE!!(LF!;t=G!<(CG
+!!(LF!;t=F!<1ID!!(LI!<:OI!!(LH!!:UL!;t=F!<:OI!!(LE!<(CH!!(LE!<1FJ!7UoIs3prI
+!7UcE!7UoI!n.,LrR:`G!7UoI!7UoIs3poHrmLuMdf9BsqZ-TDrW)oGjT,<)s&FXMJcC<$JcD#8
+!K$jMg'!iEqc-XH~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.Ee*mA7
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+*J=e+s(Ce+!D<e,97He+`nCe*R/6
+e+WkAdfTU!!!)uHrW)oGrVurIq>gQErVurIq>gHBrrE&I!<CUJ!<:OI!!(LE!!(LF!;t=G!<(CG
+!!(LF!;t=F!<1ID!!(LI!<:OI!!(LH!!:UL!;t=F!<:OI!!(LE!<(CH!!(LE!<1FJ!7UoIs3prI
+!7UcE!7UoI!n.,LrR:`G!7UoI!7UoIs3poHrmLuMdf9BsqZ-TDrW)oGjT,<)s&FXMJcC<$JcD#8
+!J:@FeHD!7qGgOG~>
+s!!!oc2[jnhZ*Z*`W5nbq#CEDQiI-8qu?`Gli7%7qu?`Gd/X0qr;ZrK!!(L8!!(LG!!(L?!!(L>
+!!(LG!!(L0!!(L9!!(LH!!(L*!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbq#CEDQiI-8qu?`Gli7%7qu?`Gd/X0qr;ZrK!!(L8!!(LG!!(L?!!(L>
+!!(LG!!(L0!!(L9!!(LH!!(L*!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbq#CEDQiI-8qu?`Gli7%7qu?`Gd/X0qr;ZrK!!(L8!!(LG!!(L?!!(L>
+!!(LG!!(L0!!(L9!!(LH!!(L*!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!!!oJH4X/!7R)2!7U'1!7T9prR9d,!7UQ?!7U<8!7T9prR9U's!%JCJcC<$JcC<$Q2^lDs7Y4N
+ScJXf<Ib~>
+s!!!oJH4X/!7R)2!7U'1!7T9prR9d,!7UQ?!7U<8!7T9prR9U's!%JCJcC<$JcC<$Q2^lAs7Y.L
+RK34b<Ib~>
+s!!!oJH4X/!7R)2!7U'1!7T9prR9d,!7UQ?!7U<8!7T9prR9U's!%JCJcC<$JcC<$Q2^l:s7XtG
+OT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!##SqpYNErmUfGrmUiHrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D!7U-3
+!7UK=!7UWA!7QK!JH3sqs!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!##SqpYNErmUfGrmUiHrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D!7U-3
+!7UK=!7UWA!7QK!JH3sqs!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!##SqpYNErmUfGrmUiHrR:69rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1!7U`D!7U-3
+!7UK=!7UWA!7QK!JH3sqs!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$_.!7T0m"4I5Me,'+Fe,01Ge,97He+*J=e,97Ndf9Bs!!(L4!!C[M!7UE;"4I5Me+WhEdf9Bs
+n,NR>!!(LB!!C[M!7UN>!7U'1!7U`D!7U]C!7UK=!7UK=!7UWA!7QK!JH3sqs!%JCJcC<$JcC<$
+Q2^lDs7Y4NScJXf<Ib~>
+s!$_.!7T0m"4I5Me,'+Fe,01Ge,97He+*J=e,97Ndf9Bs!!(L4!!C[M!7UE;"4I5Me+WhEdf9Bs
+n,NR>!!(LB!!C[M!7UN>!7U'1!7U`D!7U]C!7UK=!7UK=!7UWA!7QK!JH3sqs!%JCJcC<$JcC<$
+Q2^lAs7Y.LRK34b<Ib~>
+s!$_.!7T0m"4I5Me,'+Fe,01Ge,97He+*J=e,97Ndf9Bs!!(L4!!C[M!7UE;"4I5Me+WhEdf9Bs
+n,NR>!!(LB!!C[M!7UN>!7U'1!7U`D!7U]C!7UK=!7UK=!7UWA!7QK!JH3sqs!%JCJcC<$JcC<$
+Q2^l:s7XtGOT>5X<Ib~>
+s!$_.!7T3n"4I5Me,'+Fe,'+Fe,97He+*J=e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!(LC!!(L4!!(L<!!(LA!!(K!!.b-q!<48C<Lj*g1Sb!L
+1P,RWs+14,rrJ)Yp=oeB!;fbrJ,~>
+s!$_.!7T3n"4I5Me,'+Fe,'+Fe,97He+*J=e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!(LC!!(L4!!(L<!!(LA!!(K!!.b-q!<48C<Lj*g1Sb!L
+1P,RWs+14,rrIuVp=]Y<!;fbrJ,~>
+s!$_.!7T3n"4I5Me,'+Fe,'+Fe,97He+*J=e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L@!!(L1!!(LC!!(L4!!(L<!!(LA!!(K!!.b-q!<48C<Lj*g1Sb!L
+1P,RWs+14,rrI`Op=0;.!;]\qJ,~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hd/X0qrVurIqZ$WFqZ$WFr;ZiHm/R4:!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UT@"4I5Me,97Jdf9CHe,KCKdfBBrqZ$WFrW)oG
+rr<)K!<1IG!<:OI!!1OKrmU`E!7UoIrR:`GrR:cH!Rh&Je,B@HdfBHtJH16$c2dkgs&IGGrA+R5
+4B@[Df)P_*gA_E&Io/?e7;/CCs8FhRs8Fg*s+13$s5a1\N;rV,"J,Vj<E4P~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hd/X0qrVurIqZ$WFqZ$WFr;ZiHm/R4:!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UT@"4I5Me,97Jdf9CHe,KCKdfBBrqZ$WFrW)oG
+rr<)K!<1IG!<:OI!!1OKrmU`E!7UoIrR:`GrR:cH!Rh&Je,B@HdfBHtJH16$c2dkgs&IGGrA+R5
+5$k/df)P_*g]%QY]QHe+3(n:sdf9;&rr;sRJcC<$JcFg2!K$jMg'!iEqc-XH~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hd/X0qrVurIqZ$WFqZ$WFr;ZiHm/R4:!7UlH!7U66!7UlH!7UK=
+!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UT@"4I5Me,97Jdf9CHe,KCKdfBBrqZ$WFrW)oG
+rr<)K!<1IG!<:OI!!1OKrmU`E!7UoIrR:`GrR:cH!Rh&Je,B@HdfBHtJH16$c2dkgs&IGGrA+O5
+6u'Hds8Fh/rs8J#Cdp?E;16:/s8FhRs8Fg*s+13$s5a1\K)bPp"H`]\<E4P~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me'A!oe,B=JdfBBrrr<)K!<1IH!<(C6!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA!7UoI!7UlH!n..ur;ZrK!!(LI
+!!(LH!!(LI!!(LH!!C[Me'n9r!7UlH!7UoIs3prI!7UlH!7UoI!7UlH!n..ur;ZrK!7TEr!!:UL
+e,B@Idt%LM!6tTE,6(Zis7nGN@+PAW1Yi!2q0Vondf9;&rr;sRJcC<$JcFg2!K@'Pg]X2Kqc-XH~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me'A!oe,B=JdfBBrrr<)K!<1IH!<(C6!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA!7UoI!7UlH!n..ur;ZrK!!(LI
+!!(LH!!(LI!!(LH!!C[Me'n9r!7UlH!7UoIs3prI!7UlH!7UoI!7UlH!n..ur;ZrK!7TEr!!:UL
+e,B@Idt%LM!6tTE,6(Zis7nGNP1K[41Yi!2mp>fGdf9;&rr;sRJcC<$JcFg2!K$jMg'!iEqc-XH~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me'A!oe,B=JdfBBrrr<)K!<1IH!<(C6!!C[M!7UlH!7U66
+!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UWA!7UoI!7UlH!n..ur;ZrK!!(LI
+!!(LH!!(LI!!(LH!!C[Me'n9r!7UlH!7UoIs3prI!7UlH!7UoI!7UlH!n..ur;ZrK!7TEr!!:UL
+e,B@Idt%LM!6tTE,6(Zis7nGNcdr-q1Yi!2d73pfdf9;&rr;sRJcC<$JcFg2!J:@FeHD!7qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!<:OI!!C[Me'n9r!n..ur;ZiHn,WL;rVurIr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZuL!!(Ksqu?`G
+q>^NEquHcGr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIquHcGquHcGr;ZiHr;ZoJ!7UlH!7QK!JH3sq
+s!%JCd/X)$s8N2U1G_#As8Fh1rsJ^@1G__=o)7jeFNjda1P,RWs+142rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!<:OI!!C[Me'n9r!n..ur;ZiHn,WL;rVurIr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZuL!!(Ksqu?`G
+q>^NEquHcGr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIquHcGquHcGr;ZiHr;ZoJ!7UlH!7QK!JH3sq
+s!%JCd/X)$s8N291G_2Fs8Fh1rsJTk1G`^hpA*^P@EecN1P,RWs+142rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!<:OI!!C[Me'n9r!n..ur;ZiHn,WL;rVurIr;ZiH
+lMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHpAb3Br;ZiHr;ZuL!!(Ksqu?`G
+q>^NEquHcGr;ZiHr;ZiHr;ZiHrVurIr;ZiHrVurIquHcGquHcGr;ZiHr;ZoJ!7UlH!7QK!JH3sq
+s!%JCd/X)$"onO\1G`@gs8Fh1rsJ!P1Ga[:q=iU;:!EY:1P,RWs+142rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!!(LH!!:ULe,97Jdf@kq!!(L<!!(LG!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH!!(LH!!(LH!<:OI!!(LE
+!!(LE!<:OJ!!(LH!!(LH!!(LI!!(LH!!(LI!!(LE!<:OG!<:OJ!!(LH!!:ULe,97Hdt%LM!6tTE
+,6(Zis8FhSrr`6V1H#13r\Fu]TL^m=s4]=c1ce^,rr;sR"obDi3c"0_rs8S*@Ql\MW;lns1BmcU
+7lkGRj8T861G_Jrq>U]uWF%eI9S;R.s8Fe`rL?;BM?!=#5X'Aas8W'S%K2ec6&GX9J3Z;Ap&G'k
+1]RLO1]%.N1CO/O76ue1pOGLmG4kk7#Q:o<5;brWh>[Edr17%S2+`/3s8W"g=ZnW6Hc#d^#2:pi
+1ce^,rVm&oJO)GCp&6cHrs/M-A3VqAHJO/PJcELb!K@'Pg]X2Kqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!!(LH!!:ULe,97Jdf@kq!!(L<!!(LG!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH!!(LH!!(LH!<:OI!!(LE
+!!(LE!<:OJ!!(LH!!(LH!!(LI!!(LH!!(LI!!(LE!<:OG!<:OJ!!(LH!!:ULe,97Hdt%LM!6tTE
+,6(Zis8FhSrr`3U1H#13r\Fu\L-RQps.M5)1d5?Prr;sR"oX<E5(NP0rs8Ii=?8HN_#OH61Bm`7
+5sBhrj8T7M1G`A:q>U]rQ;ot+<L*CZs8Fe`r..%'U&XFq3^\l)s8W'S%K(c@8YQ1MD)t%CrVuos
+1]RLO1]%.N1CO,35"VIJlYS[MN;`bU#Q1/t4?-,poD\b%pkr!13)YR^s8VkP;*$[7Lt)G(#,*h/
+1d5?PrVm&`DEU@GrVeVPrs/In><Fl@Mt;N"JcELb!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!!(LH!!:ULe,97Jdf@kq!!(L<!!(LG!!(LH!!(L6
+!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH!!(LH!!(LH!<:OI!!(LE
+!!(LE!<:OJ!!(LH!!(LH!!(LI!!(LH!!(LI!!(LE!<:OG!<:OJ!!(LH!!:ULe,97Hdt%LM!6tTE
+,6(Zis8FhSrr`!O1Hka;r\FuOEB>uVs'7E:2+)3%rr;sR"nm("7[a5Srs7tJ:cLUXg&M*O1BmJp
+3_#P9j8T3d1Gb9jrs.eA9fP:BW;Z_qr\G#RD)kP1s34b,9rJ!js8Fe`nSL9b_#MY`2bg4Ls8W'S
+s8VpOqZ$ON$h8'o;o&FX>;o9Srr2p&mu1+(3`qsLrr3SkHqQF[>F"@Ns5\Q#3'(9/k5PAb>r+8o
+6YsmCrrpMP3D$.Jr\OQR#OdUK3BC95qLSZts1eR7K)bPp"H`]\<E4P~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(Ku!!(LG!!(LH!!:ULe,97Jdf@kq!!(L=!!(LE!!C[M
+!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me+WhBe,01Ge,B@IdfBHt
+r;ZrK!!(LF!!(LG!!(LH!!C[Me'n9r!7UlH!7UoI!7UlH"4I5Me,01Ge,97Jdf@kq!!:ULe,97J
+df@kr!<:N!!.b-q!<48C<RCdF1]RIWgbU`Krr;sR!2ofPs8N)*q_J:os8W'S!3lDX"B>F$r,DNh
+s8W'S!3lDX!*&"Y"+)g[Sb`9dr,)<e"$PN@s8FeSWr4^SF^G#&!a>X(r\FPSrA+Is?MuY]>6"X%
+1]RLO1]%.N1B=HR1BDW)rA+R[s8W%<q_J@8b5_L3qD80O!1`mArr2u)q_J@qs8VmorA+FMr\OTS
+!W@'91BBMYJcC<$_#FFos7Y4NScJXf<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(Ku!!(LG!!(LH!!:ULe,97Jdf@kq!!(L=!!(LE!!C[M
+!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me+WhBe,01Ge,B@IdfBHt
+r;ZrK!!(LF!!(LG!!(LH!!C[Me'n9r!7UlH!7UoI!7UlH"4I5Me,01Ge,97Jdf@kq!!:ULe,97J
+df@kr!<:N!!.b-q!<48C<RCdF1]RIW_)!l9rr;sR!,qims8N($q_J;Rs8W'S!."N!"GQmUpeL]B
+s8W'S!."N!!/9J5"%>"%jn\oWpItH?"&&Cgs8FeSEW%ZoY!;k@!g!B]r\FOorA+JW5Q*A>O8o7Z
+1]RLO1]%.N1B;Fn1BFXCrA+S;s8Vmlq_J@?nGiMoqD80O!+#FWrr2t#q_JATs8VXPrA+Fur\OTS
+!VoUi1BBc1JcC<$_#FFls7Y.LRK34b<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(Ku!!(LG!!(LH!!:ULe,97Jdf@kq!!(L=!!(LE!!C[M
+!7U04"4I5Me*m>>df9Bsqu?`Gr;ZrK!!(L;!!C[M!7UiG!7UlH"4I5Me+WhBe,01Ge,B@IdfBHt
+r;ZrK!!(LF!!(LG!!(LH!!C[Me'n9r!7UlH!7UoI!7UlH"4I5Me,01Ge,97Jdf@kq!!:ULe,97J
+df@kr!<:N!!.b-q!<48C<RCdF1BmgWO#&S@rr;sR!)3AJs8N'eq_J<1s8W'S!)`\N"Ng]Di'.#o
+s8W'S!)`\N!6O:$"$8:poD/CehEC`l")[u9s8FeS9`6aJ_)_HM!mpuIr\FOJrA+Jj3W1`8d/X.F
+1]RLO1]%.N1B:,I1BG<PrA+T's8V(Cq_J@Zq>^I`qD80O!(H`?rr2sdq_JB3s8UA'rA+GVr\OTS
+!TH?@1BC_UJcC<$_#FFes7XtGOT>5X<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmT?s!7UfFrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M!7UfF
+rR:`GrR:cH!7UlH!n.,LrmLlJdt%LM!6tTE,6(Zis8"MP251$Lr\FUCd/EtD$'!=+rT#aj3rf6Z
+1D*@Kh(piIs8U%o1I9.Zl^%SNr\F^PmG0QS3TL,A4u5"`q>UiB1G_beq49Au;?-[q1BL;<jSgq?
+:@7$s1HGL8r\FUMmH"7&#>X[G1G_&ks8FhRs8FhKs8FeU:$q$@1F5f`i\NANs8U.r1P"ijd5*RK
+s8P8=1VNeZ`HhL`4u5".rq"*Srr3Ohd.dM"1G_)ls1^?G9BGr:r\OTS$-4nYJF*6^1G_OPs+13c
+rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UfFrR:`GrR:]FrmT?s!7UfFrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M!7UfF
+rR:`GrR:cH!7UlH!n.,LrmLlJdt%LM!6tTE,6(Zis8"MP2UDC&r\FRYiVic_N8==-eh]*Ls8W'S
+&U!f^1G_5ps*QUY<ndN0IK0?H1Bhpp^G@Z0j8T3>1Geq(rsO621N`0XFYbh%s8W'S!dOI^r\Fe)
+pW,-H5QCc_1BMgqb5O1%H2#B91I(p>r\OQRr\O<Kr\FV#pWEIk-$f7+1G_8qs*lg\W:]o!1G`P@
+s#)Yhi;W,QAH2Zf1GdtgmC-X*rt(.Fq>Af"1IM3BEAKCjnaUPs1]RI]IkrmZo_H0V1Ll"9JcEOc
+!K$jMg'!iEqc-XH~>
+s!%IC!7UfFrR:`GrR:]FrmT?s!7UfFrR:`GrR:`GrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3pZA!7UfFrmLrLdf9CHe,B=Ie,'+Fe,'.De,KCKdfBBrrW)lF!<CUI!!C[M!7UfF
+rR:`GrR:cH!7UlH!n.,LrmLlJdt%LM!6tTE,6(Zis8"MP5jeRNr\FS,mJ[%kT]Q.J^G@Zes8W'S
+&Yf,Y1G`G=s%tR.Hfk4Q?iU0*1BjNLM)-qqj8T3=1Gf"*rsM[[1S+:&9f"TFs8W'S!i5^Ur\FeU
+qiETiAH2]/1BOBLOo@-AV>H?11M$Ocr\OQRr\O<Kr\FVOqiUk6-)LL#1G`SAs%tR._>3bp1Gc98
+s"uSgmeu1F;#gPQ1GeItj/GlSrt(jbrV=2a1NWTr9f"SopuG'H1]RI];):#Eq=U:71U)H1JcEOc
+!J:@FeHD!7qGgOG~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCd/Wnt"%LW:s8FeS[Jg+.rjHB(2?#B52?3^U1CM)"rA-5d
+s8Q@\1Um8]r\F_ps8=`01unT<4u5"`q>Uh21Gd,Ps7nH,3WK-Y1BPPqrVeSX_Z0Tm1Go.3r\FVp
+s8DpQ#K$N?2)@)hs8FhRs8FhKs8FeU`W,o91C1ktr\ZJgs8QF$1C5u>s*HOX6ueI6rr31L1G_F=
+Pfj"*"TGi@5rJWt#rVb_>r+:Us8Voo1]RIT?MQAW2M(mZs1nX8N;rV,"J,Vj<E4P~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCd/Wnt"'Y3os8FeSmJ[%frLd=W2#]942?3^U1CNaQr%g,d
+s8P5<1[Y)>r\F`Js84Z/2<4]=2D[/dq>Ugd1GeV%s7.s%56(Z^1BR+Hr;JJWnc/PE1H#44r\FWG
+s8;jP#P%im1c%#hs8FhRs8FhKs8FeUnc/Od1C3ONrA6;fs8P7X1C6)As$ee#<-Xtfrr30l1G`!T
+S_F)C"T=us4Z*-o#rVb_4Ynnas8VWg1]RIT4o$l63J%3]s1nX8M?!;'"I]>f<E4P~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCd/Wnt"*=;<s8FeSp\k*ppl/352#]944TGH\1CO$YnM;s[
+s8P&71\^eHr\F`Rs7%m$2rjo?2)@&eq>Ug_1Gek,s2ZuP@K6B,1BRCPnGY3Kq>^4H1H>F7r\FWO
+s7$"D#PnDp1c%,ks8FhRs8FhKs8FeUq>]s`1C3gVpbXcds8P(S1C6eUs#`(n?%/^=rr30b1G`<c
+VsXK`"SdsT3]-gl#sA7f3&<Ads8U%:1]RIT3;G?19nE=qs1nX8K)bPp"H`]\<E4P~>
+s!!!oJH16$JH1B(s!%JCd/X)$s8N;u]/)61s8W'S!;l`p!5\Ies8W'S!rW)ur\OTS"#i"lqYU<l
+1BRLSs8Fh7rr[U(1S+@A"$A@qqYpNp1BKH6s8FeUr;Zfr1C*gWs"uSgs8W'S!rW)ur\FfVs8Or4
+1]RLS1]IFR1\^qK1BRLSs8Fe[qu?[R1Gf(22u#3/rrVe72Z>K:1j&cto5utj1B]OVs8Tq21]RIW
+3\rSgrr;sRs8N'XpbRL$JcEOc!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JCd/X)$s8N;nT//9+s8W'S!<2rs!.jr%s8W'S!ri6"r\OTS"#Vkjrql`p
+1BRRUs8Fh7rrY\G1ZeH4$T0^rrr<#t1G^ogs8FeUrr<#t1C*pZs"lMfs8W'S!ri6"r\FfYs8Oo3
+1]RLS1]IFR1\^qK1BRRUs8Fe[rr<!T1Gf(22>B!-rrV.h2#]981njsLiF=_D1B]P.s8RZG1]RIZ
+2)@&fs8W&s1]RIT2>AtYs+13crrIuVp=]Y<!;fbrJ,~>
+s!!!oJH16$JH1B(s!%JCd/X)$s8N;gF#,VCs8W'Sr;Qarq(r'Nr\OTS!<)mQs8N-W1Gen-r\OTS
+!<)mQj8T3C1GeXurrP&61]ICXq(jfis8W'Srr;sRrr3*X1Gf(2r\OQRr\OQR">hnjs8W'Srr;sR
+p](4Krr;sRrr3-Y1Gf(22#&m,rrTo62#]982:hg-^/Qrg1B]Sds8Q'o1]RIV1c$rerrDlo1]RIT
+2#&kXs+13crrI`Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCd/X)$rr30$1G^ogs8FhPrrl.R1TC6Lr\OTSr\OQRr\OTS"'m]=\,64)
+1]IFR1ZSK<f/#3OqYL4"@5B^\s8VmN1HGL8r\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQRr\O<K
+r\OQRr\OQRr\OTS"(!c>anPf=qq8A51H>@5%K"hd1G_#js%Y@+WVZSm1]RIZ>r+:Zs8Voo1]RIW
+?8FCZJcC<$])Meis7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCd/X)$rr30"1G^rhs8FhPrrkD=1X,gqr\OTSr\OQRr\OTS"$JFrmJHq_
+1]IFR1ZSK<QSUF)rqcX&4u5"cs8VXG1Htj=r\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQRr\O<K
+r\OQRr\OQRr\OTS"$JFro(W.fo[Kcp1Hk^:%J8/J1G_2os#Dkkbl.J=1]RIZ4Ynnbs8VWg1]RIW
+4YnnbJcC<$])Mefs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCd/X)$rr3/m1G_8qs8FhPrrk;:1Z/3%r\OTSr\OQRr\OTS"#r(mp\Y!i
+1]IFR1ZSK;>;J("q>Ug_1Gek,s2ZuP@K6B,1]IFR1]IFR1]RLS1]IFR1]IFR1]RLS1]IFR1\^qK
+1]IFR1]IFR1]RIW3&<Adp\tE`cAOJ7=oJ@0m*:MF1KjbX2D[/HrpftDs8N9_1Gek,s2=mms8N0\
+1GeiXs+13]rrI`Op=0;.!;]\qJ,~>
+s!!!oJH2,=rR9a+rR6;tP5tV,s&IGGr\OTS#5Ged1HGL8r\OKP"\1@)[/.0/1]RLS1]IFR1]RI]
+`A9;9b5:Rrs8W'Srr;sRj8TqoBeqP=^[qEk_0,dt1G_bfq4BH!;#gRp1]IFR1]IFR1]RLS1]IFR
+1]IFR1]RLS1]ICV68LF5q#C=Lrr;sRrr;sRs8OCe1G_JCq>'!SD?'W7Yiu&J1G^ogs&6/crT5ml
+2?3\H1GcE7[/Ml]rs$4o1Jd30Rf5,Crs?e'1I]L_q;JSqJcC<$_#FFos7Y4NScJXf<Ib~>
+s!!!oJH2,=rR9a+rR6;tP5tV,s&IGGr\OTS#4e?A1Htj=r\OKP"ZS:ofCkF-1]RLS1]IFR1]RI]
+Ho!Q[g\p,`s8W'Srr;sRj8Tqk6o-W5cM.4tZ=<i^1Ga.Do5uiFI/j6G1]IFR1]IFR1]RLS1]IFR
+1]IFR1]RLS1]ICV2`!8Kq#C=Lrr;sRrr;sRs8OBs1G`FmrV"p@>lXh<^[V6Q1G^ogs(T7;rm`e\
+2?3\91GdYVPQ!B<rs!I!1O8T^E;hZnrs=951LSr8p=Z9IJcC<$_#FFls7Y.LRK34b<Ib~>
+s!!!oJH2,=rR9a+rR6;tP5tV,s&IGGr\OTS#3p1a1LgCar\OKP"Z8(ll0i0^1]RLS1]IFR1]RI]
+:bsnTkkrt?s8W'Srr;sRj8TqZ4#8[Gg%tO#V,.+g1GbTtk=m`g`W,u;1]IFR1]IFR1]RLS1]IFR
+1]IFR1]RLS1]ICV2)@&Xq#C=Lrr;sRrr;sRs8OBC1Ga^GrU\F)9`P-Bbk:qB1G_2os*r8crO"F;
+4obO>1Ge:aAH"Cbrru1R1SOX+9E$aIrs;RZ1PFlgo?it"JcC<$_#FFes7XtGOT>5X<Ib~>
+s!##SqpYNErmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:!7Tj+!7UWA!7Ta(
+!7U66s3pZA!7T^'!7QK!P5tV,s&IGGpbMtos8W'Sr;Qc)rA+FGr\OTSr\OQRr\OTS!W6m51]RLS
+1]IFR1ZJE8pilNi!rr16q_J=;h#IER1]IFR1]IFR1]RLS1]IFR1]IFR1]RLS1]ICSSGY2>s8FhR
+s8FhRs8FhSrrN(Eq(r'NqD/1Bs8VpO"%N=j[J_l]9)^XHrrMporA+FLr\OTS!W@??1P,RWs1nX8
+N;rV,"J,Vj<E4P~>
+s!##SqpYNErmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:!7Tj+!7UWA!7Ta(
+!7U66s3pZA!7T^'!7QK!P5tV,s&IGGpbMuLs8W'Sr;Qb:rA+Fjr\OTSr\OQRr\OTS!VfCd1]RLS
+1]IFR1ZJE8m9KHC!rr!dq_J=Gp](9m1]IFR1]IFR1]RLS1]IFR1]IFR1]RLS1]ICS<W"ZLs8FhR
+s8FhRs8FhSrrMptq(r'NqD/1]s8VpO"(D60EW%ZnD>l?krrM[QrA+Ftr\OTS!Vojn1P,RWs1nX8
+M?!;'"I]>f<E4P~>
+s!##SqpYNErmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pE:!7Tj+!7UWA!7Ta(
+!7U66s3pZA!7T^'!7QK!P5tV,s&IGGpbN!*s8W'Sr;QajrA+GPr\OTSr\OQRr\OTS!T60=1]RLS
+1]IFR1ZJE8c:.Ob!rq(>q_J=hr;Zfr1]IFR1]IFR1]RLS1]IFR1]IFR1]RLS1]ICS62WP8s8FhR
+s8FhRs8FhSrrM7Kq(r'NqD/2Hs8VpO"/5bp9`6aIW;\UQrrLA'rA+GUr\OTS!Tl`E1P,RWs1nX8
+K)bPp"H`]\<E4P~>
+s!$_.!7T0m"4I5Me+WhBe,'+Fe+*J=e,97Ndf9Bs!!(L4!!C[M!7UE;"4I5Me+WhEdf9Bsn,NR>
+!!(LB!!C[M!7UE;!7Tj+!7UWA!7U-3!7UZB!7U35!7UWA!7U66!7UN>!7QK!P5tV,s&IGGr%eF4
+6=m7ts8FhPrrr@e76,)Lr\OTSr\OQRr\OQR#lUl64Z-6;s8W'Srr;sRi;XD4I8E$`6ti:os8Ag#
+4>of_jo5;Z1]IFR1]IFR1]RLS1]IFR1]IFR1]RLS1]ICUpO#:+1]%.N1]IFR1]IFR1]ID"rk*,;
+2EOok`rH)#O]XV&97?%(s5fAF3B'TZkl:\]Q:3fJmJ\p@rs8:K5Ws;^1G^ofrs8V:DFHHF<J/;B
+s+13crrJ)Yp=oeB!;fbrJ,~>
+s!$_.!7T0m"4I5Me+WhBe,'+Fe+*J=e,97Ndf9Bs!!(L4!!C[M!7UE;"4I5Me+WhEdf9Bsn,NR>
+!!(LB!!C[M!7UE;!7Tj+!7UWA!7U-3!7UZB!7U35!7UWA!7U66!7UN>!7QK!P5tV,s&IGGr%eF6
+8TDTGs8FhPrrr7I4[4Dmr\OTSr\OQRr\OQR#l9rj3B1H^s8W'Srr;sRiVsPh\TCD'2bJ+ps8Vn[
+<B3'=PPP4Xr\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQR!pjYar\OENr\OQRr\OQRr\OQR,lO]Q
+5W(]0O4O@2dY(FU3Dkh4s8UN#:cCC3Nqr_TqL(LkIf'+#rr38cDEC1CpbO]brr39&WFS7O4^='!
+JcC<$_#FFls7Y.LRK34b<Ib~>
+s!$_.!7T0m"4I5Me+WhBe,'+Fe+*J=e,97Ndf9Bs!!(L4!!C[M!7UE;"4I5Me+WhEdf9Bsn,NR>
+!!(LB!!C[M!7UE;!7Tj+!7UWA!7U-3!7UZB!7U35!7UWA!7U66!7UN>!7QK!P5tV,s&IGGr%eF8
+:OUsrs8FhPrrqY$3CK23r\OTSr\OQRr\OQR#j[=C2EYs3s8W'Srr;sRiVsPdW+naZ3Dk4?s8V55
+9/\n<V>^Dnr\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQR!m4b-r\OENr\OQRr\OQRr\OQR,kdU0
+4Z,Q:S*0hO^ii7+4'JBWs8TlX82WJ4UAb,ll"N.GQMpe=rr38F?T1QRkVG"_rr38tQs2^26=cSK
+JcC<$_#FFes7XtGOT>5X<Ib~>
+s!$_.!7T3n"4I5Me+WhBe,'+Fe+!D<e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L;!!(L,!!(LA!!(LH!!(L-!!(L5!!(LA!!(L'!!(K!!0[E_,6(Yos+144
+rr_^G1Hg<hJcE+W!K@'Pg]X2Kqc-XH~>
+s!$_.!7T3n"4I5Me+WhBe,'+Fe+!D<e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L;!!(L,!!(LA!!(LH!!(L-!!(L5!!(LA!!(L'!!(K!!0[E_,6(Yos+144
+rr^q11J*/tJcE+W!K$jMg'!iEqc-XH~>
+s!$_.!7T3n"4I5Me+WhBe,'+Fe+!D<e,97Jdf@kq!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=
+!!(LH!!(LD!!(LH!!(L;!!(L,!!(LA!!(LH!!(L-!!(L5!!(LA!!(L'!!(K!!0[E_,6(Yos+144
+rr\9;1Q$b`JcE+W!J:@FeHD!7qGgOG~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hd/X0qrVurIp](<CqZ$WFlMq"8!7UlH!7U66!7UlH!7UK=!7UlH
+!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UE;!7U?9rR:`GrR:cH!Rh&Je,B@HdfBHtrW)rHpAk6B
+!<CUI!<:OH!<(CH!!1OKrmUiHrR:`GrR:ZE!7UWA!7UiG!Rh&Je,KCKdfBBrr;clHr;ZiHrVurI
+qu?`GJH1l6s!%JCJcC<$li.5j[dX1MAhu5[JcC<$[/U/cs7Y4NScJXf<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hd/X0qrVurIp](<CqZ$WFlMq"8!7UlH!7U66!7UlH!7UK=!7UlH
+!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UE;!7U?9rR:`GrR:cH!Rh&Je,B@HdfBHtrW)rHpAk6B
+!<CUI!<:OH!<(CH!!1OKrmUiHrR:`GrR:ZE!7UWA!7UiG!Rh&Je,KCKdfBBrr;clHr;ZiHrVurI
+qu?`GJH1l6s!%JCJcC<$li.6,`qB2Q6o-X'JcC<$[/U/`s7Y.LRK34b<Ib~>
+ruqLEdfBBrrW)oGrW)oGrrE#Hd/X0qrVurIp](<CqZ$WFlMq"8!7UlH!7U66!7UlH!7UK=!7UlH
+!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UE;!7U?9rR:`GrR:cH!Rh&Je,B@HdfBHtrW)rHpAk6B
+!<CUI!<:OH!<(CH!!1OKrmUiHrR:`GrR:ZE!7UWA!7UiG!Rh&Je,KCKdfBBrr;clHr;ZiHrVurI
+qu?`GJH1l6s!%JCJcC<$li.6AdeWUI3\rSNJcC<$[/U/Ys7XtGOT>5X<Ib~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me'A!oe,B=JdfBBrqu?`GquH`Fm/R7;!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L:!!(L;!!(LH!!:ULe,97Kdf@kGrW!#K
+!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(LA!!(LG!<:OI
+!!C[M!7UoI!7UlH!7UlH!7UoI!7UiG!7QK!P5tV,s&FXMJcG'9qD/.LqLSZts0Ve,N;rV,"J,Vj
+<E4P~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me'A!oe,B=JdfBBrqu?`GquH`Fm/R7;!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L:!!(L;!!(LH!!:ULe,97Kdf@kGrW!#K
+!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(LA!!(LG!<:OI
+!!C[M!7UoI!7UlH!7UlH!7UoI!7UiG!7QK!P5tV,s&FXMJcG'9qD/.lrdk*#s0Ve,M?!;'"I]>f
+<E4P~>
+s!%IC!7UoI!n..ur;ZoJ!7UlH"4I5Me'A!oe,B=JdfBBrqu?`GquH`Fm/R7;!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L:!!(L;!!(LH!!:ULe,97Kdf@kGrW!#K
+!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(LA!!(LG!<:OI
+!!C[M!7UoI!7UlH!7UlH!7UoI!7UiG!7QK!P5tV,s&FXMJcG'9qD/,=JcC<$Zi:&Xs7XtGOT>5X
+<Ib~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!<:OI!!(LI!!(LC!!(L;!<:OI!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L;!<:OG!<:OH!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf9CGdf9CFe,97He+NbAe,01Ge,97Kdf9Bsq#CEDr;ZiH
+rVurIqu?`GJH1l6s!%JCJcC<$li.4JK1\!c@&!UNs+13VrrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!<:OI!!(LI!!(LC!!(L;!<:OI!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L;!<:OG!<:OH!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf9CGdf9CFe,97He+NbAe,01Ge,97Kdf9Bsq#CEDr;ZiH
+rVurIqu?`GJH1l6s!%JCJcC<$li.13F@%iOBsiNlJcE%U!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!<:OI!!(LI!!(LC!!(L;!<:OI!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L;!<:OG!<:OH!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf9CGdf9CFe,97He+NbAe,01Ge,97Kdf9Bsq#CEDr;ZiH
+rVurIqu?`GJH1l6s!%JCJcC<$li.0sB0A1DFio:8JcE%U!J:@FeHD!7qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!!(LH!!(LI!!(LC!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L9!<:OG!<:OJ!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf@kq!!:ULe+`nCe+NbAe,04Ge,B=Ldf9Bsq#CEDqu?fI
+!7UfF!7QK!P5tV,s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!!(LH!!(LI!!(LC!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L9!<:OG!<:OJ!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf@kq!!:ULe+`nCe+NbAe,04Ge,B=Ldf9Bsq#CEDqu?fI
+!7UfF!7QK!P5tV,s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(Kp!!(LH!!(LH!!(LI!!(LC!!(L<!!(LG!!(LH!!(L6!!(LH
+!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(L9!!(L9!<:OG!<:OJ!!(LH!!:ULe,97H
+e+!D@df@hse,97He,B=Ie,'+Fe,97Jdf@kq!!:ULe+`nCe+NbAe,04Ge,B=Ldf9Bsq#CEDqu?fI
+!7UfF!7QK!P5tV,s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(Ku!!(LG!!(LH!!C[M!7UiG!7UlH!7UK=!7UcE"4I5M
+e*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsli7%7nc/[=r;ZoJ!7UlH
+!n..ur;ZoJ!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97H
+e+NbAe,01HdfBBrrVurIq#CEDqu?fI!7UfF!7QK!P5tV,s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(Ku!!(LG!!(LH!!C[M!7UiG!7UlH!7UK=!7UcE"4I5M
+e*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsli7%7nc/[=r;ZoJ!7UlH
+!n..ur;ZoJ!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97H
+e+NbAe,01HdfBBrrVurIq#CEDqu?fI!7UfF!7QK!P5tV,s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC!7UiG!7UlH!n..ur;ZrK!!(LI!!(Ku!!(LG!!(LH!!C[M!7UiG!7UlH!7UK=!7UcE"4I5M
+e*-i7df9Bsn,NR>!!(LG!!(LH!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsli7%7nc/[=r;ZoJ!7UlH
+!n..ur;ZoJ!7UoIs3poH!7UWA"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97H
+e+NbAe,01HdfBBrrVurIq#CEDqu?fI!7UfF!7QK!P5tV,s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC!7UfFrR:`GrR:]FrmT?s!7UfFrR:`G!7UfFrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3p96!7UH<rR:`GrR:cH!7UlH!n.,LrmLlJe,B@He+WhBe,B=Kdf9CGe,KFHe,KCJ
+e,97Jdf9CIdfTU!!!)uHrW)lFp](<Cqu?`Gq>^NEqZ-QCr;ZiHq>^NEJH1l6s!%JCJcC<$JcC<$
+Q2^lDs7Y4NScJXf<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmT?s!7UfFrR:`G!7UfFrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3p96!7UH<rR:`GrR:cH!7UlH!n.,LrmLlJe,B@He+WhBe,B=Kdf9CGe,KFHe,KCJ
+e,97Jdf9CIdfTU!!!)uHrW)lFp](<Cqu?`Gq>^NEqZ-QCr;ZiHq>^NEJH1l6s!%JCJcC<$JcC<$
+Q2^lAs7Y.LRK34b<Ib~>
+s!%IC!7UfFrR:`GrR:]FrmT?s!7UfFrR:`G!7UfFrR:9:qpYNEs3p-2s3pB9s3plGrmUfGs3pB9
+s3plGrmUfGs3p96!7UH<rR:`GrR:cH!7UlH!n.,LrmLlJe,B@He+WhBe,B=Kdf9CGe,KFHe,KCJ
+e,97Jdf9CIdfTU!!!)uHrW)lFp](<Cqu?`Gq>^NEqZ-QCr;ZiHq>^NEJH1l6s!%JCJcC<$JcC<$
+Q2^l:s7XtGOT>5X<Ib~>
+s!!!oc2[jnhZ*Z*iW/l)g&M-%^&\,\rr<&JjT,8.JH1l6s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf
+<Ib~>
+s!!!oc2[jnhZ*Z*iW/l)g&M-%^&\,\rr<&JjT,8.JH1l6s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b
+<Ib~>
+s!!!oc2[jnhZ*Z*iW/l)g&M-%^&\,\rr<&JjT,8.JH1l6s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X
+<Ib~>
+s!!!oJH1o7!7QK!JH59As!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH1o7!7QK!JH59As!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH1o7!7QK!JH59As!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3p34qpYNErmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7Tj+
+!7UWA!7Ta(!7U66s3poHrR9j.!n.,LrR6;tVuZiAs&FXMjT#5[q>^Hpi;`fWnc/Uhkl1e`KdI!(
+lMpkaoDegjm/R(cJcC<$dJj6+s7Y4NScJXf<Ib~>
+s!$b/!7U66s3p34qpYNErmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7Tj+
+!7UWA!7Ta(!7U66s3poHrR9j.!n.,LrR6;tVuZiAs&FXMjT#5[q>^Hpi;`fWnc/Uhkl1e]C)[6T
+lMpkaoDegjm/R(cJcC<$dJj6(s7Y.LRK34b<Ib~>
+s!$b/!7U66s3p34qpYNErmUlIqpPNFqpY'8rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3oEs!7Tj+
+!7UWA!7Ta(!7U66s3poHrR9j.!n.,LrR6;tVuZiAs&FXMjT#5[q>^Hpi;`fWnc/Uhkl1eG<"o?5
+lMpkaoDegjm/R(cJcC<$dJj6!s7XtGOT>5X<Ib~>
+s!%.:!7UZB!7U35!7U!/"4I5Me+WhDdf@ka!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+WhEdf9Bse,TKthuEc+p&G*AkPtV3pAb3Bl2Uh5rVurIr;ZiHp](<Cn,NO=!7UlH
+!7QK!W;urBs&H3$rrC.?!jVeLpAb-mq>^Hpi;`fWnc/Uhrr;uumJd9`!+#9^s8N*!rs%A'.gH>4
+L&CuN!:9ac!.k0$s3^iIN;rV,"J,Vj<E4P~>
+s!%.:!7UZB!7U35!7U!/"4I5Me+WhDdf@ka!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+WhEdf9Bse,TKthuEc+p&G*AkPtV3pAb3Bl2Uh5rVurIr;ZiHp](<Cn,NO=!7UlH
+!7QK!W;urBs&H3$rrC.?!`/knpAb-mq>^Hpi;`fWnc/Uhrr;uumJd8]!202Qs8N*!rs$MR+9N'7
+TD\`h!:9ac!.k0$s3^iIM?!;'"I]>f<E4P~>
+s!%.:!7UZB!7U35!7U!/"4I5Me+WhDdf@ka!!(LH!!^mP!7LoJe*-i7df9Bsn,NR>!!(LB!!C[M
+!7UE;"4I5Me+WhEdf9Bse,TKthuEc+p&G*AkPtV3pAb3Bl2Uh5rVurIr;ZiHp](<Cn,NO=!7UlH
+!7QK!W;urBs&H3$rrC.?![.QLpAb-mq>^Hpi;`fWnc/Uhrr;uumJd80!6"m$s8N*!rs#]*('>7C
+^AS$2!:9ac!.k0$s3^iIK)bPp"H`]\<E4P~>
+s!$b/!7U35!7U$0"4I5Me+WhEdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH
+!7UK=!7UlH!7U`D!7UlH!7TEt!7Tm,!7UWA!7UlH!7Tp-!7U35!7UoI!7UlH!7U]C!7UH<"4I5M
+e,97Hdt%Lu!<48C<NZ<$!6P6Dr>P_=kkG,W!;ZZp!9!nW!:9ac!:Bdf*<>Ngrs'd0g&'uX!'L5[
+rrDEcrr@WMJcF-t!K@'Pg]X2Kqc-XH~>
+s!$b/!7U35!7U$0"4I5Me+WhEdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH
+!7UK=!7UlH!7U`D!7UlH!7TEt!7Tm,!7UWA!7UlH!7Tp-!7U35!7UoI!7UlH!7U]C!7UH<"4I5M
+e,97Hdt%Lu!<48C<NZ<$!6P6Dq?I!*qY1$i!;ZZp!9!nW!:9ac!:Bdf#6=Y^rs(Z\jo*q/!-eDA
+rrDEcrr@WMJcF-t!K$jMg'!iEqc-XH~>
+s!$b/!7U35!7U$0"4I5Me+WhEdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH
+!7UK=!7UlH!7U`D!7UlH!7TEt!7Tm,!7UWA!7UlH!7Tp-!7U35!7UoI!7UlH!7U]C!7UH<"4I5M
+e,97Hdt%Lu!<48C<NZ<$!6P6DkQ:f(rV-?l!;ZZp!9!nW!:9ac!:Bdf"9AG^rs)N0meb-L!5JL4
+rrDEcrr@WMJcF-t!J:@FeHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIp](<CrVuuJ!<1I6!!:UL
+e,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'n?te*[57e,B@Ge,KCK
+dfBBrrW)rH!<CUJ!<1IA!<:LK!7UlHs3poHrR:cH!Rh&Je,B@Ge,B@Ge,01Ge,B=Kdf9CIdfKNu
+!<1II!<(CF!<(CD!!(LE!!(K!!3#tu,6(ZFs8N)@rrh9\$ij3"s8N)ps8N)Ws8N)cs8N)ds8N)U
+rrW&t"TAB#!:9ac!.k0$s3^iIN;rV,"J,Vj<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIp](<CrVuuJ!<1I6!!:UL
+e,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'n?te*[57e,B@Ge,KCK
+dfBBrrW)rH!<CUJ!<1IA!<:LK!7UlHs3poHrR:cH!Rh&Je,B@Ge,B@Ge,01Ge,B=Kdf9CIdfKNu
+!<1II!<(CF!<(CD!!(LE!!(K!!3#tu,6(ZFs8N)@rrf_0,65.Gs8N)ps8N)Ws8N)cs8N)ds8N)U
+rrVin#lXf'!:9ac!.k0$s3^iIM?!;'"I]>f<E4P~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIp](<CrVuuJ!<1I6!!:UL
+e,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'n?te*[57e,B@Ge,KCK
+dfBBrrW)rH!<CUJ!<1IA!<:LK!7UlHs3poHrR:cH!Rh&Je,B@Ge,B@Ge,01Ge,B=Kdf9CIdfKNu
+!<1II!<(CF!<(CD!!(LE!!(K!!3#tu,6(ZFs8N)@rrc4"$io8\s8N)ps8N)Ws8N)cs8N)ds8N)U
+rrU^N*rZ-=!:9ac!.k0$s3^iIK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LI!!1OKrmUcF!7UoI
+s3prI!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'e9s
+e*m>;e,97Jdf@kq!!C[Me'n9r!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZrK!7TEr!!(LF
+!!:ULe,97He,97He,B=Qdf@hs!7Lqse,B=Ldf9Bsqu?`Gr;ZiHr;ZiHq>^NEJH2VKs!%JCd/X+G
+$iPGg%qkq>Eu,0]q>UC*o8"4c)eo*Is8.Br"pm,Ps8)frrs&C\0F8.P\c2X/!!;je"5Wt[I/of<
+&H)P4fes!bbl@bCrs%.7"Y@mu!;ZX&70&t[s+M$as7H?trr33#NA(YI5Ipdnrr<`.?O.L)s8VtJ
+-jBu7QN-sb!<<)r!<<''r/EB:$pV<!s8)d$s7UX]"qjVPrr;uu!qo7hqZ$QqqYpWo!!`E%rrE&u
+#536c"qjVPrr3N%E?56(L]@AS!<<)e)$Hdes+14%rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LI!!1OKrmUcF!7UoI
+s3prI!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'e9s
+e*m>;e,97Jdf@kq!!C[Me'n9r!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZrK!7TEr!!(LF
+!!:ULe,97He,97He,B=Qdf@hs!7Lqse,B=Ldf9Bsqu?`Gr;ZiHr;ZiHq>^NEJH2VKs!%JCd/X+G
+$i+*>(l/.a=V)-`rr2p/k@Y8.-%l3ss7U+H!t@T&s8)frrs&4?,6e`Vh>[HS!!;@=!T!bY,QQ?p
+,lIZHXs=-:nGiRgrs#VO"@DVY!;ZX&&HM%ps!&`fs6'Fprr32sFX%)&:u2-Nrr<`&63JU;s8Ve+
+*<Qa;ZN'q)!<<)r!<<''pN7\b&Q%<[s8)d$s63i,!uPD2rr;uu!pD?>qZ$QqqYpWj!"8c*rrE&u
+#3fG2!uPD2rr3Mj=qh)kVZ6Yr!<<)J"prk3s+14%rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LI!!1OKrmUcF!7UoI
+s3prI!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He'e9s
+e*m>;e,97Jdf@kq!!C[Me'n9r!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZrK!7TEr!!(LF
+!!:ULe,97He,97He,B=Qdf@hs!7Lqse,B=Ldf9Bsqu?`Gr;ZiHr;ZiHq>^NEJH2VKs!%JCd/X+G
+$Kjha+gD!u5RAEqrVm&O9F(nZUAk/tgJemh'NNT]qZ-Zr#2`](";tkCrr;uu!kTKSh>[Th!1X%;
+r;QtW(^XUG!!*#u#)F*&@/0d&q>Ug.!;6Bl&;1#_T)_=Zrs%@d)$Cgio)A[h!#*R-"uk68s4^Kf
+!YeY_s8N'!s8Vrrs8N;\>o<b_BCbp!qZ$m$a@m3N,^B(_s8N'#],h"Ls8N)qrrUgQ0)bhM!<3!&
+a@m3N,^B(_rt!%<%0o,@s8N'!s8S_o,O^3`JcF@%!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlHs3prI!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UE;s3plG
+s3poH!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!!)rG!!)oFr;ZiHrW!2P!7Lqs
+df@kq!!C[M!7UfFs3piF!7UfFs3lN!VZ?`@s&IGGrr=71\,)9gAn\[MP5mlJs7dA/q=':B2#mT,
+!*A@]flI,m!!)ut&,Sm#On@g-"LS4/!!%Pminj\>pAtd'A-'(:rt4]*%F+EU!!*'!mg'BInRhh%
+q>W"U!'pS_%L_@tg]/Grs8,=iOn@g-"LS4/!!%l#nPoUQs+(/OkPX"Rs8N'!rr;uurVm0#8-G(I
+k=>`_qZ$Qqrr3N(/d8!EegUg@s8N'!JBQsKs8N)rrr_S<!d">?rrE*!)>GffUA3:g#/gK9.Kl%.
+l@K!8!!*&j.0QGts+14$rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlHs3prI!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UE;s3plG
+s3poH!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!!)rG!!)oFr;ZiHrW!2P!7Lqs
+df@kq!!C[M!7UfFs3piF!7UfFs3lN!VZ?`@s&IGGrr=6Hde6fD\NA75=TFH]s6qGVr8qDfFoVIt
+!0-LDb#JE@!!)ut&,%"KZ2)of#jD<g!!#LK^u#(qm/\+))$0.(rt3ia+6;KW!!*'!f)d&Tj@oUS
+q>W!>!3#qo"pOi&V>s<is7RH<Z2)of#jD<g!!#gUj<"HTs"aY7nG14+s8N'!rr;uurVm/s*=&kF
+eJSYVqZ$Qqrr3Mt%L^,M^^:S@s8N'!7cV;\s8N)rrr_1["K24urrE*!)=J%C_>D"T%e0Md$jj<9
+ggL0^!!*&Y$4,.4s+14$rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlHs3prI!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7UE;s3plG
+s3poH!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!!)rG!!)oFr;ZiHrW!2P!7Lqs
+df@kq!!C[M!7UfFs3piF!7UfFs3lN!VZ?`@s&IGGrr=6Kjm42lgem2",663ms1UtVr7<M#`;fiP
+!3c+h\2+*a!!)ut&(q@4b58aX+SPj8!!$U"Ibt)/ZiO_;$j-2&rt1Cp<q4Fj!!*'!Oo\VRc%l?"
+q>Vuf!8[\=$k<.756/4ns4If%b58aX+SPj8!!$d(bmasIrtPO;p@YpNs8N'!rr;uurVm/V$m*Rg
+\dKYSqZ$Qqrr3MG"tS="TER"Ds8N'!Aak0Fs8N)srri;I,S&T-s8N*!ru&ZX/(aNg"Y]ZN^'5e)
+qo_#"rr<'!ZNVQ@JcC<$f)Gc&s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7U?9s3plG
+s3puJ!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!7UlH!n..up](<CrW!5Q!!(IJ
+df@kGrW!&L!!(LD!<:OH!!(LG!!(K!!2T\q,6(Zis8N',B)ho)!!R!7s7QF"qYpg!!!`K'#lpt%
+s8N)trrTh57K3;llMqn(rr<%5h#@T%!'C53!&"9N&XNK5s8V<`!<<(c!,MW7kl:_Zrt+;m)?9%5
+G[pcP!*0(!]DtD"rt+Jr)uop<!,MW7l2VV"#lpt%s8N)us8N)trrTh57K3;glMqn#s8N)urrT;&
+;?$S#h>e\urr<%5q#C?orVuis!=4ebs8N*!rrT;&;?$S"h>e\uWW5ils8N'$pc/JOJcC<$ec,Z/
+s7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7U?9s3plG
+s3puJ!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!7UlH!n..up](<CrW!5Q!!(IJ
+df@kGrW!&L!!(LD!<:OH!!(LG!!(K!!2T\q,6(Zis8N',`rH))!"6gHs69S"qYpfr!"Ju.!s$OA
+s8N)trrQ[1TDniqci??2rr<&Ch#@S&!1!SL!-eGB&Ma@3s8U7B!<<'S!7(WEb5_P<rt*'J3WIPK
+*R=[D!5nj:@fW/#rt*NW5l^ia!7(WEblBO!!s$OAs8N)us8N)trrQ[1TDnilci??-s8N)urrPjo
+Yl=Y-XT2,rrr<&Cq#C?orVuis!>E0Es8N*!rrPjoYl=Y,XT2,r8-#^fs8N'$m1K]RJcC<$ec,Z,
+s7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7T?r!7U?9s3plG
+s3puJ!7UlH!n..ur;ZiHnGi^@!7Lqsr;ZiHrVurIqZ$WFr;ZoJ!7UlH!n..up](<CrW!5Q!!(IJ
+df@kGrW!&L!!(LD!<:OH!!(LG!!(K!!2T\q,6(Zis8N',kl:[^!#"Mqs/5p$qYpf]!&jlW!<D3X
+s8N)trrOPJg&D!VEr_s7rr<&ah#@R2!7q03!6bBA&JbB3s8Qd5!<<'7!:'UaB`J//rt&01WrHgZ%
+dO'2!9X=]-NMj!rt'5OUAt5n!:'UaCB0b%!<D3Xs8N)us8N)trrOPJg&D!QEr_s2s8N)urrO8Bi
+;W`]:B7Qtrr<&aq#C?orVuis!A!:0s8N*!rrO8Bi;W`\:B7Qt*WY'os8N'$`!@LRJcC<$ec,Z%s
+7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH!!C[M
+!7T9p!7UK=!7UlH!n..ur;ZoJ!7UlH!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZoJ!7UlH
+!n..urW)uI!<CUI!!(LH!!(LI!!(LF!!1OKrmUiH!7UoI!n..ur;ZrK!!(LG!!(K!!2KVp,6(Zi
+s8N',hZ*WT!!(mUs8E!"rr3%r3Y),h#Qau*C]FJjP26-;rrE#t!^?\!rr36%!!WE&!!(X+ru4$#
+`rGi<#Q"K#-NMp$s8)crs8OGHg].<N!!)ip&GcG5s1pD5,6'J#ci=#0!5AI4'E%n7s8N'!g].<N
+!!WC=!!+g;h>[HS!<3#u!<)p!56/FsrrW-!"oA9!!<3!"1]Yo%rs/B##64]'!8%#GrrDrr"5m>a
+H2[dC!<<'#1]Yo%rs&<"#6-:Udej(E!!5aqTRm,os4%&LN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH!!C[M
+!7T9p!7UK=!7UlH!n..ur;ZoJ!7UlH!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZoJ!7UlH
+!n..urW)uI!<CUI!!(LH!!(LI!!(LF!!1OKrmUiH!7UoI!n..ur;ZrK!!(LG!!(K!!2KVp,6(Zi
+s8N'2p](9k!!)cns82j"s8W%R/IDCV#Qau*,QIj=T()aZrrE#t!Y5;#rr36"!"8i,!!)`KruD"J
+!V69]!=o,/rsAc#s8Vcm!<<'+!;HNnp&G*grt+f'%f]j]H;jhQ!VHEl%fl+urtG5/$ig5,!;HNn
+p&GI",QIj=T()aZrrE&urrE#t!Y5;#rr3&r!"8Z'rrE&u!Y#/%rr35q!"Ju.!!)`fs8N)srri;J
+.g*-Vs8N*!rrNW0o`"jpoDf@#$NThrs8N'#*!jrCs+14"rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LH!!C[M
+!7T9p!7UK=!7UlH!n..ur;ZoJ!7UlH!n..urW)uIr;ZiHp&G6E!7Lqsr;ZiHrVurIr;ZoJ!7UlH
+!n..urW)uI!<CUI!!(LH!!(LI!!(LF!!1OKrmUiH!7UoI!n..ur;ZrK!!(LG!!(K!!2KVp,6(Zi
+s8N'2r;Zff!!)rss7-.$s8Vh4,6n,I#Qt,,&-)`AXnhtrrrE#t!XA`#rr35f!%\*L!!)oPrs/B*
+"o82<!B^;\&Hr13s8UdQ!<<'&!;lfrg&M-Krt*KW3<(>M0>%5g!rDrs#6=PurtFVs/-#VL!;lfr
+g&NQ$&-)`AXnhtrrrE&urrE#t!XA`#rr3&a!%[pGrrE&u!X8Z$rr35L!&X`U!!)oks8N)srri21
+&e*dus8N*!rrNB)qYpL!cN#g%"p"Mss8N'#$m+ees+14"rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+!G:e,B@Ge,KCJe,97Jdf9CIdfBHt
+rW)rHpAb3BrW!#K!!)rGrrE#Hrr<&Jr;ZoJ!!*#I!s$dM!<(CG!;t=G!<(CH!!(LD!<1IH!<(CG
+!!(LG!;k5r!3#tu,6(Zis8N)ts8N)ts8N*!rtMmA0A$.%!!*'!q0=%^!!@TJrr<&trs]87!s8T*
+!!!'"rr<&rh>[KAq>^\?s8N3%qYpNp!<<'#"9A;ts8N)ors;m0\Q!tG#kn<,rr3E6!!<<)!<<*#
+s8N'!qYpL(!!3,qGom"d"+1(J!!*#urrE#t#RLJ5!s/K'!!2rrrrE&u!XSl&rVm'%!rr9#!;lQk
+rrDoq!qcO!rVults8N-,!;ZTn"TSW("T\Jts8N'#'`s8Ds+14"rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+!G:e,B@Ge,KCJe,97Jdf9CIdfBHt
+rW)rHpAb3BrW!#K!!)rGrrE#Hrr<&Jr;ZoJ!!*#I!s$dM!<(CG!;t=G!<(CH!!(LD!<1IH!<(CG
+!!(LG!;k5r!3#tu,6(Zis8N)ts8N)ts8N*!rtK&FB]T0l!!*'!mpQh/!!]Y,rr<&trs]#0!s8T*
+!!!'"rr<&uh>[K'q>_5Xs8N*"rr<#t!!*'!!<E-!s8Duuq#:X9!:CQXh@T&S(B4=T!WW<)!W`9$
+!WW0"!<3#urW!!!mpQh/!!]Y,rr<&us8N)trs/Z+!s8T*!!!&rs8N)urrN9&rr2p&rW!'#rr<&u
+q#C?oqYpW]!##81rrE*!!WrH%rr30$!!E6%!;c`q!!3<,]Rg*6s4%&LM?!;'"I]>f<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He'A!oe+!G:e,B@Ge,KCJe,97Jdf9CIdfBHt
+rW)rHpAb3BrW!#K!!)rGrrE#Hrr<&Jr;ZoJ!!*#I!s$dM!<(CG!;t=G!<(CH!!(LD!<1IH!<(CG
+!!(LG!;k5r!3#tu,6(Zis8N)ts8N)ts8N*!rtI!aP3r;F!!*'!cV4ZF!#OSnrr<&trsSo.!s8T*
+!!!-$rr<&Srr@-:!!MZgrrE-!rs&<"!<<'"!<3!"q>^Njrs9&5p^6M<6F-Yrrr3B-!!<<)!<<*%
+s8N'!rr3K)!!WDK9aC_!(Z>>n!!*#urrE#t#QXo-!s/K'!!E)trrE&u!<E3!rs&5u$NL,+!;HNn
+!;c]sVZ99ds8N*!rrE-#rVm&r!"/`,!;c`q!!366jFR>^s4%&LK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbg&M-%^An8_JH1K+s!%JCd/X+GrVultrVults8N<I!8IPRq#CEmrs.G3
+!!`K'!!)ut!\sc*q>^Hph#@GL!&acU(=<+#s8OGHg].<N!!*'!-NMp$s8)crq#:Z;!(I(\rY1=l
+-N=#H1'#i"s8N'&g].<N!!W?$#N(%3#64]'!<3#u!<)p!1'#hrs8N)urrOtVd/O%Lq>^a"rr<&n
+s8N)prrE*#rVults8N-V!7:`F#5S<(s"=B#qu?Zr"6L:!MLkeYs4.,MN;rV,"J,Vj<E4P~>
+s!!!oc2[jnhZ*Z*`W5nbg&M-%^An8_JH1K+s!%JCd/X+GrVultrVults8N<0!;HNnnc/[frs-kY
+!"Ju.!!)ut!Xo)%q>^Hph#@F>!/UXS(5MrSs8NE+p](9e!!*'!$39i#s7QEmq#:Y,!3QM'qurhq
+?N0s+$iotrs8N'&p](9f!"/])#L?fY%KHG.!<3#u!<)p!$iotms8N)urrNW0o`"jpoDf@#rr<&n
+s8N)qrrW0"!r`0!!<<'#%06&"rs&)q%K?h:o_\[g!!C%@"MB<cJcF:#!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*`W5nbg&M-%^An8_JH1K+s!%JCd/X+GrVultrVults8N<,!;uls`W-#;rs8V=
+1]TE5rr<&trrNB)qt^9l!8RSU)?A1art[HlU&Y,r!;lfrg&M-QrriE"s8UdQ!;QR#-30kWrp^(U
+!5ea8!X8Z%q>^Hp"oJ?"gAiW#rs8V=1]TE5rr<&us8N)trrNB)qt0pg!<3!""p"N!rs$gM2#mRU
+!;HNn!;c]sp](Tus8N*!rrNB)qYpL!ci>p&"p"Mss8N'$NWTjRJcC<$ec,Z%s7XtGOT>5X<Ib~>
+s!!!oJH16$rr<&JJH1K+s!%JCd/X+GrVultrVults8N<9!9F1[h#IHPrs/N'!WN**!;HKm!k85!
+q>^Hph>[TS%fsZKrtbD7!nmU>!,V]8l2Uhas-<Y$s8V?a!;QR#lMq8(s8S#_!+Z$.!k85!q>^Hp
+"`45=lMq[trs&H&!WN*!!<3!"#ls`!rrT\17J-W[!<3!"X8l,srs%?\+92?@!;HNn!;c]so)K0s
+s8N*!rrT8%;?$S"hZ+buWrPuns8N'%s5jpqMLkeYs472NN;rV,"J,Vj<E4P~>
+s!!!oJH16$rr<&JJH1K+s!%JCd/X+GrVultrVults8N<,!;ZZpVuQhprs/E$!rr9&!<)os!aPen
+q>^Hph>[TN"9S,mrtb,+"SVjM!71]Fbl@bDs"ON"s8U=D!;QR#ci>%4s8ODY!7:`F!aPenq>^Hp
+"jd5Kc2]Tsrs&?#!rr9#!<3!"!s&<!rrQI+R.UFY!<3!"9)u3qrs#\-9`P+m!;HNn!;c]sirBno
+s8N*!rrPgnYl=Y,YQ.As8H>jhs8N'%s1ed@]Rg*6s472NM?!;'"I]>f<E4P~>
+s!!!oJH16$rr<&JJH1K+s!%JCd/X+GrVultrVults8N<*!<)rt8cSkgrs%ij#64](!<)p!,llHj
+s8N)Trr^pU#5S8u(<$:bqu7B2li7!"!!*'!'`dS"s(VN6q#:Y1!"Y(hrt,J9li-nc,llHjs8N'&
+li7!$!13W`#42Bps8N'!rr3!"!<)p!,llHes8N)urrO8Bi;W`\;#m`urr<&ns8N)qrrSSg?N'p(
+!<<'#*rt6urru=#XoBFBhY[?Q!!N=]!YFFDs+14$rrI`Op=0;.!;]\qJ,~>
+s!!!oJH16$JH1B(s!%JCd/X+GrVultrVults8OC/!'g)36i[5es!t&9r4)eCs8Qa4LAh/Pr)*T5
+g\gQQ>Q=^'!8[YVg&MibrtUOo6N?HY%aX]\!!*'!mKX6JnnJ.)q#:Zu#66^_s3q#Li;W`tr)*T5
+g\gQQ>Q=^'!/Stl=TOQ_/#_n6\H!EFrr<&ursi]BLAh/Pr)*T5g\gQQ>PeC"!<3!,paQHBq:@,$
+_#OE7!;HNn!<<'(0XC6Idn9^grVults8O#4.KuUCf..'@s7e&HQM'Qps8N'!s8V0n!fDR/JcF@%
+!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JCd/X+GrVultrVults8Nfr!.ape8H8bjs%9rspQkk:s8O&=_Z'QDpF$0)
+kPaVF63$rb!8[YVTE$YCrtR0eT`<OD+m.l^!!*'!eH-oVj\GjVq#:Zq!W\>^s,R-]q#::7pF$0)
+kPaVF63$rb!)Vh?+Tg3o9"aikQN/lBrr<&urrO/?_Z'Q@pF$0)kPaVF62LW]!<3!,m0jB>qn`^M
+mf3:e!;HNn!<<'(;T/;*_B8olrVults8O#)$k'rL_@$h@s6^:%[JJ]es8N'!s8Te:"MB<cJcF@%
+!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JCd/X+GrVultrVults8NfO!3Z0sMuWkXs(9LOmpQ3Is8NN.h>[E_g^jsn
+nGD(0-NF)G!8[YV63*&DrtQ4JgAd06=n9jo!!*'!NWE;RcA2H#q#:ZY!<CXLs#0o_r;Q^;g^jsn
+nGD(0-NF)G!,V5P%L;G%B$C,?@/tlYrr<&urrNW0h>[E[g^jsnnGD(0-MmcB!<3!,^BH.?q4e*E
+q#C?o!;HNn!<<'(DpnLSWso<prVults8O"P"Y87$UBN4Ds1S[^bkoUEs8N'!s8S#Z&EJEBJcF@%
+!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCd/X+GrVultrVults8ODAC_6k;hZ*ZVs4M!(!Y\Phs8VOc'*/+5s8J]W
+&-<S?WrN)!!8[YVAH6-9rsRrh%0-@Z2$>GQ!!*#u#1k^8/'@nmp\tJ<!0R<]o)K6truM*45S*u3
+9WJ-m!!)h!#8W$ns4M!(!Y\Phs8N'!rr3Js;A0'2s8W(l5S*u39WIshrrE#t#530_"V=;Hrr;uu
+p](6ns8N;UA/kU]6)XY\rrE&u#530_"V=;Hrr3;sD&NHuM#[JT!<3!#j:DBMJcC<$f`(u2s7Y4N
+ScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCd/X+GrVultrVults8OD;:^IM4p](<os1_GE!ZPkJs8U\7$ipA.s8.X0
+$j7VX_uK`:!8[YV)?@\QrsQ^E)ZTi<,6L1"!!*#u#-/sN5O\XQp\tI<!9O7\jT$:uruLun1^jL.
+?GlgC!!)LP"!alHs1_GE!ZPkJs8N'!rr3J[4q%Gls8VtQ1^jL.?GlX>rrE#t#3T5,!u>2,rr;uu
+p](6ns8N;:;%`mF;9&P6rrE&u#3T5,!u>2,rr3;c<tGHeVuQbs!<3!#]EAAMJcC<$f`(u/s7Y.L
+RK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCd/X+GrVultrVults8OCq3X$4Bqu?`ss.r!i"=Jj"s8T)Q#6=i)s6aqW
+#mVksh#IBS!8[YV$ioGfrsN37AcMda('e+?!!*#u#)*ft>kn@"p\tI-!;$6jOT9D!ruLNK.1$5-
+DqtBm!!(.k"?"g2s.r!i"=Jj"s8N'!rr3J.0F%UYs8VM..1$5-Dqt3hrrE#t#/s1G"X8-`rr;uu
+p](6ns8N:u5n!i:A**XgrrE&u#/s1G"X8-`rr3;A6OF&`bQ%SB!<3!#M?4@MJcC<$f`(u(s7XtG
+OT>5X<Ib~>
+s!$b/!7U66s3p34qpYNErmUlIqpYNErmU?:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7SCW!7TU$
+!7QK!JH4:%s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$b/!7U66s3p34qpYNErmUlIqpYNErmU?:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7SCW!7TU$
+!7QK!JH4:%s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$b/!7U66s3p34qpYNErmUlIqpYNErmU?:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pT?!7SCW!7TU$
+!7QK!JH4:%s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%.:!7UZB!7U35!7U!/"4I5Me+WhEdf9BsmJm79r;[&N!!(IJ!7U04"4I5Me*m>>df9BspAb<E
+!!(L;!!C[M!7UWAs3nFW!7TU$!7QK!JH4:%s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%.:!7UZB!7U35!7U!/"4I5Me+WhEdf9BsmJm79r;[&N!!(IJ!7U04"4I5Me*m>>df9BspAb<E
+!!(L;!!C[M!7UWAs3nFW!7TU$!7QK!JH4:%s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%.:!7UZB!7U35!7U!/"4I5Me+WhEdf9BsmJm79r;[&N!!(IJ!7U04"4I5Me*m>>df9BspAb<E
+!!(L;!!C[M!7UWAs3nFW!7TU$!7QK!JH4:%s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U35!7U$0"4I5Me+WhEdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH
+!7UK=!7UlH!7U]C!n..u[K$<Vg&M-%JH16$f)Ygps&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U35!7U$0"4I5Me+WhEdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH
+!7UK=!7UlH!7U]C!n..u[K$<Vg&M-%JH16$f)Ygps&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U35!7U$0"4I5Me+WhEdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH
+!7UK=!7UlH!7U]C!n..u[K$<Vg&M-%JH16$f)Ygps&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIp](<CrVurIkPt\5!7UlH
+!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S@V!7U-3qpYQFrR:cH!Rh&Jdt%LM
+!8@MR,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIp](<CrVurIkPt\5!7UlH
+!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S@V!7U-3qpYQFrR:cH!Rh&Jdt%LM
+!8@MR,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIp](<CrVurIkPt\5!7UlH
+!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S@V!7U-3qpYQFrR:cH!Rh&Jdt%LM
+!8@MR,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LI!!1OKrmUcF!7UoI
+!Rh&Je*R,;df9Bsr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*A[/^3Umf<:7
+qu?iJ!!(LH!!C[Me'n9r!7QK!JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LI!!1OKrmUcF!7UoI
+!Rh&Je*R,;df9Bsr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*A[/^3Umf<:7
+qu?iJ!!(LH!!C[Me'n9r!7QK!JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LI!!1OKrmUcF!7UoI
+!Rh&Je*R,;df9Bsr;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHp&G*A[/^3Umf<:7
+qu?iJ!!(LH!!C[Me'n9r!7QK!JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlHs3prI!7UoI!7UlHs3prI
+!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S:T!7U*2!7UlH
+s3poH!7UlH!7QK!JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlHs3prI!7UoI!7UlHs3prI
+!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S:T!7U*2!7UlH
+s3poH!7UlH!7QK!JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlHs3prI!7UoI!7UlHs3prI
+!7UE;s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S:T!7U*2!7UlH
+s3poH!7UlH!7QK!JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7UlH!7UlH
+!7UH<!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S:T!7U-3!7UcE
+s3puJ!7UlH!7QK!JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7UlH!7UlH
+!7UH<!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S:T!7U-3!7UcE
+s3puJ!7UlH!7QK!JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7UlH!7UlH
+!7UH<!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7UWA!7S:T!7U-3!7UcE
+s3puJ!7UlH!7QK!JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LF!!(KS
+!!(L5!!(LG!!(LH!!:ULe,97Hdt%LM!8ISS,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LF!!(KS
+!!(L5!!(LG!!(LH!!:ULe,97Hdt%LM!8ISS,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97Kdf9Bsn,NR>!!(LG!!(LF!!(KS
+!!(L5!!(LG!!(LH!!:ULe,97Hdt%LM!8ISS,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe$T/Ue*@#2e,KFHe,KCJe,97Hdt%LM!8ISS
+,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe$T/Ue*@#2e,KFHe,KCJe,97Hdt%LM!8ISS
+,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,B@Fe$T/Ue*@#2e,KFHe,KCJe,97Hdt%LM!8ISS
+,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*WW;qFJH16$\H)XRs&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*WW;qFJH16$\H)XRs&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*WW;qFJH16$\H)XRs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYNEs3pE:rR:]Fs3p-2s3pT?!7UiGs3pT?!7UE;qpY<?rR:?<
+!7U'1!7UoIs3p]B!7UWA!7Spfs3pcD!7UoIrmU'2rmU-4!7R87s3m;7s!%JCJcC<$JcC<$Q2^lD
+s7Y4NScJXf<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYNEs3pE:rR:]Fs3p-2s3pT?!7UiGs3pT?!7UE;qpY<?rR:?<
+!7U'1!7UoIs3p]B!7UWA!7Spfs3pcD!7UoIrmU'2rmU-4!7R87s3m;7s!%JCJcC<$JcC<$Q2^lA
+s7Y.LRK34b<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYNEs3pE:rR:]Fs3p-2s3pT?!7UiGs3pT?!7UE;qpY<?rR:?<
+!7U'1!7UoIs3p]B!7UWA!7Spfs3pcD!7UoIrmU'2rmU-4!7R87s3m;7s!%JCJcC<$JcC<$Q2^l:
+s7XtGOT>5X<Ib~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZoJ!7UcE"4I5Me+!D<e,97Ndf9Bs!!(L4!!C[M!7UWAs3poH
+"4I5Me+NeAe*?u6e+itDe,97He+<V?e)gW1e,97He,'+Fe,B=Ie+NbAe,97He&hXje+itGdf9Bs
+rVurIr;ZiHmf3@:rVurIlMpq6p](<CfDkp#aoDFjQN7%0s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZoJ!7UcE"4I5Me+!D<e,97Ndf9Bs!!(L4!!C[M!7UWAs3poH
+"4I5Me+NeAe*?u6e+itDe,97He+<V?e)gW1e,97He,'+Fe,B=Ie+NbAe,97He&hXje+itGdf9Bs
+rVurIr;ZiHmf3@:rVurIlMpq6p](<CfDkp#aoDFjQN7%0s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZoJ!7UcE"4I5Me+!D<e,97Ndf9Bs!!(L4!!C[M!7UWAs3poH
+"4I5Me+NeAe*?u6e+itDe,97He+<V?e)gW1e,97He,'+Fe,B=Ie+NbAe,97He&hXje+itGdf9Bs
+rVurIr;ZiHmf3@:rVurIlMpq6p](<CfDkp#aoDFjQN7%0s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!$b/!7U35!7U$0"4I5Me,97Jdf@ko!!(LH!!(L=!!(LH!!:ULe,97He*?u6e,97He+`nEdf@kr
+!!(LH!!(LC!!:ULe*I&7e+`nCe,97He+E\@e)gW1e,01Ge+WhBe+WhBe&24de+s%Ee,B=Ie)gW1
+e)p]2e!9t6e!C(7,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!$b/!7U35!7U$0"4I5Me,97Jdf@ko!!(LH!!(L=!!(LH!!:ULe,97He*?u6e,97He+`nEdf@kr
+!!(LH!!(LC!!:ULe*I&7e+`nCe,97He+E\@e)gW1e,01Ge+WhBe+WhBe&24de+s%Ee,B=Ie)gW1
+e)p]2e!9t6e!C(7,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!$b/!7U35!7U$0"4I5Me,97Jdf@ko!!(LH!!(L=!!(LH!!:ULe,97He*?u6e,97He+`nEdf@kr
+!!(LH!!(LC!!:ULe*I&7e+`nCe,97He+E\@e)gW1e,01Ge+WhBe+WhBe&24de+s%Ee,B=Ie)gW1
+e)p]2e!9t6e!C(7,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZrK!7LrIe,KCJe,97H
+e*R,:df@kq!!(L6!!(LH!!(LA!!(LI!!(LH!!(LA!!(L8!!(L=!!(L@!!C[M!7UlH!n.,LrR:cH
+!Rh&Je,'+Fe,01Ge,04Ge,B=JdfBBrqZ$WFr;clHr;cfFrW)oGrVurIrW!#K!!)uHrW)oGrW)oG
+rW)oGqu?`Gq>^NErVurIq>gQErVuuJ!<1IH!<(CG!!(LF!<(CH!!(LH!!(LD!!1OKrmUfGs3prI
+!Rh&Je*mA9e+NeAe,9:Fe,B@Ge,B=Ie,B=Kdf9CHe,B@Ge,B@Ge,B@Ge,01Ge!C(7,6(Yos+13$
+s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZrK!7LrIe,KCJe,97H
+e*R,:df@kq!!(L6!!(LH!!(LA!!(LI!!(LH!!(LA!!(L8!!(L=!!(L@!!C[M!7UlH!n.,LrR:cH
+!Rh&Je,'+Fe,01Ge,04Ge,B=JdfBBrqZ$WFr;clHr;cfFrW)oGrVurIrW!#K!!)uHrW)oGrW)oG
+rW)oGqu?`Gq>^NErVurIq>gQErVuuJ!<1IH!<(CG!!(LF!<(CH!!(LH!!(LD!!1OKrmUfGs3prI
+!Rh&Je*mA9e+NeAe,9:Fe,B@Ge,B=Ie,B=Kdf9CHe,B@Ge,B@Ge,B@Ge,01Ge!C(7,6(Yos+13$
+s+138rrIuVp=]Y<!;fbrJ,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZrK!7LrIe,KCJe,97H
+e*R,:df@kq!!(L6!!(LH!!(LA!!(LI!!(LH!!(LA!!(L8!!(L=!!(L@!!C[M!7UlH!n.,LrR:cH
+!Rh&Je,'+Fe,01Ge,04Ge,B=JdfBBrqZ$WFr;clHr;cfFrW)oGrVurIrW!#K!!)uHrW)oGrW)oG
+rW)oGqu?`Gq>^NErVurIq>gQErVuuJ!<1IH!<(CG!!(LF!<(CH!!(LH!!(LD!!1OKrmUfGs3prI
+!Rh&Je*mA9e+NeAe,9:Fe,B@Ge,B=Ie,B=Kdf9CHe,B@Ge,B@Ge,B@Ge,01Ge!C(7,6(Yos+13$
+s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CH!<:OI!!:UL
+e,97He*[2<df9Bsr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AmK!78oDem?o`,!@rVurIr;ZoJ
+!7UlH"4I5Me,B=Ie,97He,'+Fe,'+Fe,B@Ie,B=Ie,97He,'+Fe,B=Ie,97Jdf@kq!!C[M!7UoI
+!n..ur;ZiHqZ$]H!7UlH!n..ur;ZiHr;ZiHqZ$WFrW)oGqZ$WFr;ZiHrW!#K!7UlH!Rh&Ie,B=I
+e,97Ndf9Bs!!(LI!;t:I!7TEr!!(LH!!(LI!<:OI!!(LC!;t=C!!(LA!!(LI!!(LH!!:ULe,97K
+df9BsrW!#K!7UlH!7UfF!n..ur;ZoJ!7UlH!7UlH!7R87s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf
+<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CH!<:OI!!:UL
+e,97He*[2<df9Bsr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AmK!78oDem?o`,!@rVurIr;ZoJ
+!7UlH"4I5Me,B=Ie,97He,'+Fe,'+Fe,B@Ie,B=Ie,97He,'+Fe,B=Ie,97Jdf@kq!!C[M!7UoI
+!n..ur;ZiHqZ$]H!7UlH!n..ur;ZiHr;ZiHqZ$WFrW)oGqZ$WFr;ZiHrW!#K!7UlH!Rh&Ie,B=I
+e,97Ndf9Bs!!(LI!;t:I!7TEr!!(LH!!(LI!<:OI!!(LC!;t=C!!(LA!!(LI!!(LH!!:ULe,97K
+df9BsrW!#K!7UlH!7UfF!n..ur;ZoJ!7UlH!7UlH!7R87s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b
+<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CH!<:OI!!:UL
+e,97He*[2<df9Bsr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AmK!78oDem?o`,!@rVurIr;ZoJ
+!7UlH"4I5Me,B=Ie,97He,'+Fe,'+Fe,B@Ie,B=Ie,97He,'+Fe,B=Ie,97Jdf@kq!!C[M!7UoI
+!n..ur;ZiHqZ$]H!7UlH!n..ur;ZiHr;ZiHqZ$WFrW)oGqZ$WFr;ZiHrW!#K!7UlH!Rh&Ie,B=I
+e,97Ndf9Bs!!(LI!;t:I!7TEr!!(LH!!(LI!<:OI!!(LC!;t=C!!(LA!!(LI!!(LH!!:ULe,97K
+df9BsrW!#K!7UlH!7UfF!n..ur;ZoJ!7UlH!7UlH!7R87s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X
+<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UfF!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AlMpq6pAk6Bo`,!@r;ZiHr;ZuL!!(Ks
+qu?`Gq>^NEq>^NEqZ$WFrVurIr;ZiHrVurIq>^NErVurIqZ-NBrr<5O!7Lqs!;k7F!;t=G!<:OH
+!;k7D!!(LG!!(LG!!(LD!!(LH!!(LG!;k7F!!(LG!!(LH!!(LI!<:OB!!(LH!!(LH!!(LI!!(LH
+!!(L<!;t=>!!(LI!!(LF!;k7F!!UgOdf@hsqpYQFr6tZGs3poHqpYKD!7R87s!%JCJcC<$JcC<$
+Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UfF!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AlMpq6pAk6Bo`,!@r;ZiHr;ZuL!!(Ks
+qu?`Gq>^NEq>^NEqZ$WFrVurIr;ZiHrVurIq>^NErVurIqZ-NBrr<5O!7Lqs!;k7F!;t=G!<:OH
+!;k7D!!(LG!!(LG!!(LD!!(LH!!(LG!;k7F!!(LG!!(LH!!(LI!<:OB!!(LH!!(LH!!(LI!!(LH
+!!(L<!;t=>!!(LI!!(LF!;k7F!!UgOdf@hsqpYQFr6tZGs3poHqpYKD!7R87s!%JCJcC<$JcC<$
+Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UfF!n..ur;ZiH
+n,WL;rVurIr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AlMpq6pAk6Bo`,!@r;ZiHr;ZuL!!(Ks
+qu?`Gq>^NEq>^NEqZ$WFrVurIr;ZiHrVurIq>^NErVurIqZ-NBrr<5O!7Lqs!;k7F!;t=G!<:OH
+!;k7D!!(LG!!(LG!!(LD!!(LH!!(LG!;k7F!!(LG!!(LH!!(LI!<:OB!!(LH!!(LH!!(LI!!(LH
+!!(L<!;t=>!!(LI!!(LF!;k7F!!UgOdf@hsqpYQFr6tZGs3poHqpYKD!7R87s!%JCJcC<$JcC<$
+Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UfF!n..ur;ZiH
+nGiR<qu?`Gr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AlMpq6p](<Co)Jd>r;ZiHr;ZiHr;clH
+rVurIq>^NEq>^NEqZ$WFrVurIr;ZiHrVurIq>^NErVurIqZ$WFq>^`K!7Lqs!7UfF!7UlH!7UlH
+s3puJ!7U]C!7UiG!7UiG!7U`D!7UlH!7UiG!7UcE!7UiG!7UlH!7UoIs3p]B!7UlH!7UlH!7UoI
+!7UlH!7UK=!7UlH!7UWA!7UoI!7UfF!7UcE#1ES$!7LqsqZ$WFr;ZiHr;clHrr<&Jp](<CQN7%0
+s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UfF!n..ur;ZiH
+nGiR<qu?`Gr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AlMpq6p](<Co)Jd>r;ZiHr;ZiHr;clH
+rVurIq>^NEq>^NEqZ$WFrVurIr;ZiHrVurIq>^NErVurIqZ$WFq>^`K!7Lqs!7UfF!7UlH!7UlH
+s3puJ!7U]C!7UiG!7UiG!7U`D!7UlH!7UiG!7UcE!7UiG!7UlH!7UoIs3p]B!7UlH!7UlH!7UoI
+!7UlH!7UK=!7UlH!7UWA!7UoI!7UfF!7UcE#1ES$!7LqsqZ$WFr;ZiHr;clHrr<&Jp](<CQN7%0
+s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UfF!n..ur;ZiH
+nGiR<qu?`Gr;ZiHlMpq6r;ZiHp&G*ArVurIr;ZiHp&G*AlMpq6p](<Co)Jd>r;ZiHr;ZiHr;clH
+rVurIq>^NEq>^NEqZ$WFrVurIr;ZiHrVurIq>^NErVurIqZ$WFq>^`K!7Lqs!7UfF!7UlH!7UlH
+s3puJ!7U]C!7UiG!7UiG!7U`D!7UlH!7UiG!7UcE!7UiG!7UlH!7UoIs3p]B!7UlH!7UlH!7UoI
+!7UlH!7UK=!7UlH!7UWA!7UoI!7UfF!7UcE#1ES$!7LqsqZ$WFr;ZiHr;clHrr<&Jp](<CQN7%0
+s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Jdf@kq
+!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L@!!(LH!!C[M!7UiG!7UfF!7UE;!7UlH!7UlH!7UoI
+!7UN>!7UiG!7UoIs3guKe,97Kdf9BsqZ$WFq#CEDqZ$WFrW)uIrW!&L!!(LD!!(LI!!(LH!!:UL
+e,97Qdf9Bs!7Lqs!7UlH!n..urW)uI!<CUI!!:ULe,97He,97He,97He,'+Fe+itDe,97He,01G
+e,97Kdf9Bsqu?`Gr;[&N!!(IJ!7U]Cs3prI!7UlH!7UoI!7UlH!7UK=!7UoIs3pZA!7UoI!7UlH
+!n..ur;[/Q!!(IJdf@hse,97Jdf@kr!<:LK!7UlH!n..ur;ZiHr;ZiHQN7%0s&FXMJcC<$JcD#8
+!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Jdf@kq
+!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L@!!(LH!!C[M!7UiG!7UfF!7UE;!7UlH!7UlH!7UoI
+!7UN>!7UiG!7UoIs3guKe,97Kdf9BsqZ$WFq#CEDqZ$WFrW)uIrW!&L!!(LD!!(LI!!(LH!!:UL
+e,97Qdf9Bs!7Lqs!7UlH!n..urW)uI!<CUI!!:ULe,97He,97He,97He,'+Fe+itDe,97He,01G
+e,97Kdf9Bsqu?`Gr;[&N!!(IJ!7U]Cs3prI!7UlH!7UoI!7UlH!7UK=!7UoIs3pZA!7UoI!7UlH
+!n..ur;[/Q!!(IJdf@hse,97Jdf@kr!<:LK!7UlH!n..ur;ZiHr;ZiHQN7%0s&FXMJcC<$JcD#8
+!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Jdf@kq
+!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L@!!(LH!!C[M!7UiG!7UfF!7UE;!7UlH!7UlH!7UoI
+!7UN>!7UiG!7UoIs3guKe,97Kdf9BsqZ$WFq#CEDqZ$WFrW)uIrW!&L!!(LD!!(LI!!(LH!!:UL
+e,97Qdf9Bs!7Lqs!7UlH!n..urW)uI!<CUI!!:ULe,97He,97He,97He,'+Fe+itDe,97He,01G
+e,97Kdf9Bsqu?`Gr;[&N!!(IJ!7U]Cs3prI!7UlH!7UoI!7UlH!7UK=!7UoIs3pZA!7UoI!7UlH
+!n..ur;[/Q!!(IJdf@hse,97Jdf@kr!<:LK!7UlH!n..ur;ZiHr;ZiHQN7%0s&FXMJcC<$JcD#8
+!J:@FeHD!7qGgOG~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B@Ge,9:He*mA7
+e,B@Ie)p`2e+Ne>e,B@Ie,04Fe,B@Fe+!G:e,9:Ge,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WF
+qZ-QCrrDuG!W^[LrmUiH!7UfFr6tZGrR:`GrR:]F!n..urW)oGrW)rH!s$dM!<(CG!<(CG!;t=G
+!!(LF!!(LF!;t=G!!(LF!<(CG!!(LF!<(CH!!(LH!!(LD!!1OKrmUiHr6kZHe,97He+!G;dfBHt
+p]16@rrE#HrW)oGr;ZoJ!7UoIrR:`GrmLrLdf9CHe,B@Ge,B@Fe!U49,6(Yos+13$s+138rrJ)Y
+p=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B@Ge,9:He*mA7
+e,B@Ie)p`2e+Ne>e,B@Ie,04Fe,B@Fe+!G:e,9:Ge,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WF
+qZ-QCrrDuG!W^[LrmUiH!7UfFr6tZGrR:`GrR:]F!n..urW)oGrW)rH!s$dM!<(CG!<(CG!;t=G
+!!(LF!!(LF!;t=G!!(LF!<(CG!!(LF!<(CH!!(LH!!(LD!!1OKrmUiHr6kZHe,97He+!G;dfBHt
+p]16@rrE#HrW)oGr;ZoJ!7UoIrR:`GrmLrLdf9CHe,B@Ge,B@Fe!U49,6(Yos+13$s+138rrIuV
+p=]Y<!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B@Ge,9:He*mA7
+e,B@Ie)p`2e+Ne>e,B@Ie,04Fe,B@Fe+!G:e,9:Ge,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WF
+qZ-QCrrDuG!W^[LrmUiH!7UfFr6tZGrR:`GrR:]F!n..urW)oGrW)rH!s$dM!<(CG!<(CG!;t=G
+!!(LF!!(LF!;t=G!!(LF!<(CG!!(LF!<(CH!!(LH!!(LD!!1OKrmUiHr6kZHe,97He+!G;dfBHt
+p]16@rrE#HrW)oGr;ZoJ!7UoIrR:`GrmLrLdf9CHe,B@Ge,B@Fe!U49,6(Yos+13$s+138rrI`O
+p=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3p34qpYQFrR:]FrmUfGs3pE:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1
+!7UoIs3p]B!7UWA!7UoIs3p]B!7Ta(rmUiHrR:B=!7UcE!7Tp-rmU]D!7U]CrR6;t[K-=Os&FXM
+JcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U66s3p34qpYQFrR:]FrmUfGs3pE:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1
+!7UoIs3p]B!7UWA!7UoIs3p]B!7Ta(rmUiHrR:B=!7UcE!7Tp-rmU]D!7U]CrR6;t[K-=Os&FXM
+JcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3p34qpYQFrR:]FrmUfGs3pE:rR:]Fs3p-2s3pB9s3pW@s3pB9s3pW@s3pN=!7U'1
+!7UoIs3p]B!7UWA!7UoIs3p]B!7Ta(rmUiHrR:B=!7UcE!7Tp-rmU]D!7U]CrR6;t[K-=Os&FXM
+JcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZrK!!(LF!!C[M!7UH<!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M
+!7UZB"4I5Me*m>>df9BspAb<E!!(L>!!(L1!!(LH!!(LF!!(LI!!(LA!!(LH!!(LF!!(LI!!(L)
+!!(LI!!:ULe,97He+NeAe+s%Ee)LE.e,B=Ie,'+Fe+itDe,97Hdt%M.!<48C<It1$s+13$s-<Tb
+N;rV,"J,Vj<E4P~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZrK!!(LF!!C[M!7UH<!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M
+!7UZB"4I5Me*m>>df9BspAb<E!!(L>!!(L1!!(LH!!(LF!!(LI!!(LA!!(LH!!(LF!!(LI!!(L)
+!!(LI!!:ULe,97He+NeAe+s%Ee)LE.e,B=Ie,'+Fe+itDe,97Hdt%M.!<48C<It1$s+13$s-<Tb
+M?!;'"I]>f<E4P~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZrK!!(LF!!C[M!7UH<!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M
+!7UZB"4I5Me*m>>df9BspAb<E!!(L>!!(L1!!(LH!!(LF!!(LI!!(LA!!(LH!!(LF!!(LI!!(L)
+!!(LI!!:ULe,97He+NeAe+s%Ee)LE.e,B=Ie,'+Fe+itDe,97Hdt%M.!<48C<It1$s+13$s-<Tb
+K)bPp"H`]\<E4P~>
+s!$b/!7U35!7U$0"4I5Me,97Jdf@ko!!(LH!!(L=!!(LH!!:ULe,97He*?u6e,97He+*J=e,97H
+e+itDe,97He+*J=e,97He+itDe,97He+E\@e)gW1e,01Ge+WhBe+WhBe,01Ge+WhBe(t')e,01G
+e,97He+WhDdf@ko!!(L-!!(LB!!(LD!!(LH!!(K!!4Mt.,6(Yos+13$s+138rrJ)Yp=oeB!;fbr
+J,~>
+s!$b/!7U35!7U$0"4I5Me,97Jdf@ko!!(LH!!(L=!!(LH!!:ULe,97He*?u6e,97He+*J=e,97H
+e+itDe,97He+*J=e,97He+itDe,97He+E\@e)gW1e,01Ge+WhBe+WhBe,01Ge+WhBe(t')e,01G
+e,97He+WhDdf@ko!!(L-!!(LB!!(LD!!(LH!!(K!!4Mt.,6(Yos+13$s+138rrIuVp=]Y<!;fbr
+J,~>
+s!$b/!7U35!7U$0"4I5Me,97Jdf@ko!!(LH!!(L=!!(LH!!:ULe,97He*?u6e,97He+*J=e,97H
+e+itDe,97He+*J=e,97He+itDe,97He+E\@e)gW1e,01Ge+WhBe+WhBe,01Ge+WhBe(t')e,01G
+e,97He+WhDdf@ko!!(L-!!(LB!!(LD!!(LH!!(K!!4Mt.,6(Yos+13$s+138rrI`Op=0;.!;]\q
+J,~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZoJ!7UfF!7UlH!7U<8
+!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,*C!!(LH!!:UL
+!<(CH!!1OKrmU`E!7UiG!7UiGs3prI!Rh&Je,'+Fe,01Ge,04Ge,B=JdfBBrrW)rH!s$dM!<(CG
+!<(CH!!1OKrmUiH!7UZB!7U]C"4I5Me,'+Fe,B@HdfTU!!!)uHrW)oGrr<)K!<1IH!!(LF!<1FJ
+!7UQ?!7QK![fHFPs&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZoJ!7UfF!7UlH!7U<8
+!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,*C!!(LH!!:UL
+!<(CH!!1OKrmU`E!7UiG!7UiGs3prI!Rh&Je,'+Fe,01Ge,04Ge,B=JdfBBrrW)rH!s$dM!<(CG
+!<(CH!!1OKrmUiH!7UZB!7U]C"4I5Me,'+Fe,B@HdfTU!!!)uHrW)oGrr<)K!<1IH!!(LF!<1FJ
+!7UQ?!7QK![fHFPs&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZoJ!7UfF!7UlH!7U<8
+!n..ur;ZiHlMpq6r;ZiHnc/[=r;ZiHq#CEDr;ZiHnc/[=r;ZiHq#CEDr;ZiHo`,*C!!(LH!!:UL
+!<(CH!!1OKrmU`E!7UiG!7UiGs3prI!Rh&Je,'+Fe,01Ge,04Ge,B=JdfBBrrW)rH!s$dM!<(CG
+!<(CH!!1OKrmUiH!7UZB!7U]C"4I5Me,'+Fe,B@HdfTU!!!)uHrW)oGrr<)K!<1IH!!(LF!<1FJ
+!7UQ?!7QK![fHFPs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CH!!1OKrmUlI
+!7UlH!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+NbA
+e,B=Ie,97Jdf@kq!!C[M!7UoI!7UlH!7UfF!7UfF!7UoIs3prI!7UlH!7UfF!7UfF!7UoIs3prI
+!n..urW!&L!!(LH!!:ULe,97Kdf@kGrVuuJ!<(CC!!(LI!;t:H!7UoI!7UiG!7UoI!7UoI"4I5M
+e,97Jdf@kq!!C[Me'n9r!Rh&Ie,B=Ie,B@Ie,KFGe,01Gdt%M-!<48C<It1$s+13$s-<TbN;rV,
+"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CH!!1OKrmUlI
+!7UlH!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+NbA
+e,B=Ie,97Jdf@kq!!C[M!7UoI!7UlH!7UfF!7UfF!7UoIs3prI!7UlH!7UfF!7UfF!7UoIs3prI
+!n..urW!&L!!(LH!!:ULe,97Kdf@kGrVuuJ!<(CC!!(LI!;t:H!7UoI!7UiG!7UoI!7UoI"4I5M
+e,97Jdf@kq!!C[Me'n9r!Rh&Ie,B=Ie,B@Ie,KFGe,01Gdt%M-!<48C<It1$s+13$s-<TbM?!;'
+"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CH!!1OKrmUlI
+!7UlH!7U?9"4I5Me,97He*?u6e,97He+*J=e,97He+itDe,97He+*J=e,97He+itDe,97He+NbA
+e,B=Ie,97Jdf@kq!!C[M!7UoI!7UlH!7UfF!7UfF!7UoIs3prI!7UlH!7UfF!7UfF!7UoIs3prI
+!n..urW!&L!!(LH!!:ULe,97Kdf@kGrVuuJ!<(CC!!(LI!;t:H!7UoI!7UiG!7UoI!7UoI"4I5M
+e,97Jdf@kq!!C[Me'n9r!Rh&Ie,B=Ie,B@Ie,KFGe,01Gdt%M-!<48C<It1$s+13$s-<TbK)bPp
+"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH"4I8!e,B=Kdf@kq
+!!(L;!<:OI!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH
+!!(LH!!LaN!7TEp!!(LE!!(LE!!(LF!!(LI!!(LH!!(LI!!(LE!!(LF!!(LI!!(LH!!:ULe,B=L
+df9BsqZ$WFr;ZoJ!7UlH"4I5Me+s(Ee+WhBe,B=Ie,97He,97He,B=Ldf9BsqZ$WFr;ZoJ!7UlH
+"4I5Me,01Ge,97He+WkBdt%M,!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH"4I8!e,B=Kdf@kq
+!!(L;!<:OI!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH
+!!(LH!!LaN!7TEp!!(LE!!(LE!!(LF!!(LI!!(LH!!(LI!!(LE!!(LF!!(LI!!(LH!!:ULe,B=L
+df9BsqZ$WFr;ZoJ!7UlH"4I5Me+s(Ee+WhBe,B=Ie,97He,97He,B=Ldf9BsqZ$WFr;ZoJ!7UlH
+"4I5Me,01Ge,97He+WkBdt%M,!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH"4I8!e,B=Kdf@kq
+!!(L;!<:OI!!(LH!!(L6!!(LH!!(L=!!(LH!!(LD!!(LH!!(L=!!(LH!!(LD!!(LH!!(LB!!(LH
+!!(LH!!LaN!7TEp!!(LE!!(LE!!(LF!!(LI!!(LH!!(LI!!(LE!!(LF!!(LI!!(LH!!:ULe,B=L
+df9BsqZ$WFr;ZoJ!7UlH"4I5Me+s(Ee+WhBe,B=Ie,97He,97He,B=Ldf9BsqZ$WFr;ZoJ!7UlH
+"4I5Me,01Ge,97He+WkBdt%M,!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!n..ur;ZoJ!7UlH
+!7UH<!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH!7UlHs3prI!7UcE!7UcE!7UfF!7UoI!7UlH!7UoI!7UcE!7UfF!7UoI!7UlH!n.,LrmUiH
+!7UfF!7UlH!n..ur;ZrK!!(LF!!(L@!;k7E!!(LG!<1IH!!(LF!!(LH!!:ULe,97Kdf9Bsqu?`G
+r;ZiHp](<CJH3"Vs!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!n..ur;ZoJ!7UlH
+!7UH<!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH!7UlHs3prI!7UcE!7UcE!7UfF!7UoI!7UlH!7UoI!7UcE!7UfF!7UoI!7UlH!n.,LrmUiH
+!7UfF!7UlH!n..ur;ZrK!!(LF!!(L@!;k7E!!(LG!<1IH!!(LF!!(LH!!:ULe,97Kdf9Bsqu?`G
+r;ZiHp](<CJH3"Vs!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!n..ur;ZoJ!7UlH
+!7UH<!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7U`D!7UlH!7UK=!7UlH!7U`D!7UlH!7UZB!7UlH
+!7UlH!7UlHs3prI!7UcE!7UcE!7UfF!7UoI!7UlH!7UoI!7UcE!7UfF!7UoI!7UlH!n.,LrmUiH
+!7UfF!7UlH!n..ur;ZrK!!(LF!!(L@!;k7E!!(LG!<1IH!!(LF!!(LH!!:ULe,97Kdf9Bsqu?`G
+r;ZiHp](<CJH3"Vs!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Jdf@kq
+!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK
+!!(LB!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe+itDe,'+Fe,B@Ie,B=Ldf9Bsq#CEDqZ$WFrW)uI
+rW!#K!7UfF!7UlH!n..ur;ZoJ!7UlH"4I5Me,01Ge*m>;e,B=Ie,01Ge,'+Fe,97Jdf@kq!!:UL
+e,97Kdf9Bsqu?`GrW)uIq#CEDJH2tUs!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Jdf@kq
+!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK
+!!(LB!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe+itDe,'+Fe,B@Ie,B=Ldf9Bsq#CEDqZ$WFrW)uI
+rW!#K!7UfF!7UlH!n..ur;ZoJ!7UlH"4I5Me,01Ge*m>;e,B=Ie,01Ge,'+Fe,97Jdf@kq!!:UL
+e,97Kdf9Bsqu?`GrW)uIq#CEDJH2tUs!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Jdf@kq
+!!^mP!7LoJe+!D<e+s%Hdf9Bskl:h7!!(L;!!C[M!7UiG!7UlH"4I5Me*m>>df9Bsqu?`Gr;ZrK
+!!(LB!!(LG!!(LI!<:LK!7UlH"4I5Me,'+Fe+itDe,'+Fe,B@Ie,B=Ldf9Bsq#CEDqZ$WFrW)uI
+rW!#K!7UfF!7UlH!n..ur;ZoJ!7UlH"4I5Me,01Ge*m>;e,B=Ie,01Ge,'+Fe,97Jdf@kq!!:UL
+e,97Kdf9Bsqu?`GrW)uIq#CEDJH2tUs!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B@Ge,9:He*mA7
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WFqZ-QC
+rrDuG!W^[LrmUiH!7UfFr6tZGr6k]IdfBBrrW)oGrW)oGrW)oGrr<&Jr;ZrK!!(LG!;k7<!!(LI
+!!(LF!<(CG!<(CG!<(CH!!(LH!!C[M!7UfFrmLlJe+j"@dt%M.!<48C<It1$s+13$s-<TbN;rV,
+"J,Vj<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B@Ge,9:He*mA7
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WFqZ-QC
+rrDuG!W^[LrmUiH!7UfFr6tZGr6k]IdfBBrrW)oGrW)oGrW)oGrr<&Jr;ZrK!!(LG!;k7<!!(LI
+!!(LF!<(CG!<(CG!<(CH!!(LH!!C[M!7UfFrmLlJe+j"@dt%M.!<48C<It1$s+13$s-<TbM?!;'
+"I]>f<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B@Ge,9:He*mA7
+e,B@Ie)p`2e*[59e,04Fe,9:He*[59e,04Fe,9:He+NbAe,'.EdfTU!!!)uHrVurIqZ$WFqZ-QC
+rrDuG!W^[LrmUiH!7UfFr6tZGr6k]IdfBBrrW)oGrW)oGrW)oGrr<&Jr;ZrK!!(LG!;k7<!!(LI
+!!(LF!<(CG!<(CG!<(CH!!(LH!!C[M!7UfFrmLlJe+j"@dt%M.!<48C<It1$s+13$s-<TbK)bPp
+"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*S,`Q<r;ZiHa8c4hr;ZiHJH1E)s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*S,`Q<r;ZiHa8c4hr;ZiHJH1E)s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*S,`Q<r;ZiHa8c4hr;ZiHJH1E)s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH3UgrR8adrR6;tK`M,ss&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oJH3UgrR8adrR6;tK`M,ss&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oJH3UgrR8adrR6;tK`M,ss&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYHC!7UE;rR:]Fs3p-2s3pB9s3p]BqpY$7s3pZArR:?<!7U'1
+!n..ukPtV3JH16$WrW/Ds&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYHC!7UE;rR:]Fs3p-2s3pB9s3p]BqpY$7s3pZArR:?<!7U'1
+!n..ukPtV3JH16$WrW/Ds&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U66s3p34qpYQFrR:cHqpYHC!7UE;rR:]Fs3p-2s3pB9s3p]BqpY$7s3pZArR:?<!7U'1
+!n..ukPtV3JH16$WrW/Ds&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$WFr;clHnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+o)Jd>nGi[?!!(LC!!(LH!!(L?!!(L1!!:ULe+`nCe+*J=e)LE.dt%LM!6P<A,6(Yos+13$s+138
+rrJ)Yp=oeB!;fbrJ,~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$WFr;clHnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+o)Jd>nGi[?!!(LC!!(LH!!(L?!!(L1!!:ULe+`nCe+*J=e)LE.dt%LM!6P<A,6(Yos+13$s+138
+rrIuVp=]Y<!;fbrJ,~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$WFr;clHnGiR<r;[&N!!(IJ!7U04"4I5Me*m>>df9Bs
+o)Jd>nGi[?!!(LC!!(LH!!(L?!!(L1!!:ULe+`nCe+*J=e)LE.dt%LM!6P<A,6(Yos+13$s+138
+rrI`Op=0;.!;]\qJ,~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Ge,97Jdf@ke!!(LH!!:ULe,97He*?u6e,97He+*J=e,97H
+e+E\@e+!D<e,97He+itDe,97He+E\@e)gW4df9Bskl:_4iW&u-JH16$aoMGcs&FXMJcC<$JcD#8
+!K@'Pg]X2Kqc-XH~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Ge,97Jdf@ke!!(LH!!:ULe,97He*?u6e,97He+*J=e,97H
+e+E\@e+!D<e,97He+itDe,97He+E\@e)gW4df9Bskl:_4iW&u-JH16$aoMGcs&FXMJcC<$JcD#8
+!K$jMg'!iEqc-XH~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Ge,97Jdf@ke!!(LH!!:ULe,97He*?u6e,97He+*J=e,97H
+e+E\@e+!D<e,97He+itDe,97He+E\@e)gW4df9Bskl:_4iW&u-JH16$aoMGcs&FXMJcC<$JcD#8
+!J:@FeHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHr;ZrK!!(L7
+!!:ULe,97He*?u6e,97He+*J=e,97He+NbAe*m>;e,97He+<V?e+E\Cdf9Bsr;ZoJ!!)uHrr<)K
+!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$`I!!(LH!!C[MdfBBrrr<&Jr;ZrK!!(LI!!1OKrR6;t
+JH3mos!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHr;ZrK!!(L7
+!!:ULe,97He*?u6e,97He+*J=e,97He+NbAe*m>;e,97He+<V?e+E\Cdf9Bsr;ZoJ!!)uHrr<)K
+!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$`I!!(LH!!C[MdfBBrrr<&Jr;ZrK!!(LI!!1OKrR6;t
+JH3mos!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHr;ZrK!!(L7
+!!:ULe,97He*?u6e,97He+*J=e,97He+NbAe*m>;e,97He+<V?e+E\Cdf9Bsr;ZoJ!!)uHrr<)K
+!<1IE!!LaN!7LrIe,9:He,B=JdfBBrqZ$`I!!(LH!!C[MdfBBrrr<&Jr;ZrK!!(LI!!1OKrR6;t
+JH3mos!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LI!!(LI
+!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7UT@!7UT@!7UoI!7UlH!n..u
+r;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!C[M!7UoI#1EPPdf9Bs
+rVurIrW!&L!!(K!!.b-m!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LI!!(LI
+!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7UT@!7UT@!7UoI!7UlH!n..u
+r;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!C[M!7UoI#1EPPdf9Bs
+rVurIrW!&L!!(K!!.b-m!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LI!!(LI
+!!(L8!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7UT@!7UT@!7UoI!7UlH!n..u
+r;ZrK!!(LI!!(LH!!(LI!<:OI!!(LH!!(LI!<:OI!!(LH!!(LI!!(LH!!C[M!7UoI#1EPPdf9Bs
+rVurIrW!&L!!(K!!.b-m!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7UlH!7UoI
+!7UB:s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7UZB!7UB:!7UlH!7UZBs3pW@!7UlH!7UlH"Od>N
+e'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,97He,B=Ldf9Bs
+JH16$aoMGcs&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7UlH!7UoI
+!7UB:s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7UZB!7UB:!7UlH!7UZBs3pW@!7UlH!7UlH"Od>N
+e'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,97He,B=Ldf9Bs
+JH16$aoMGcs&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7UlH!7UoI
+!7UB:s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7UZB!7UB:!7UlH!7UZBs3pW@!7UlH!7UlH"Od>N
+e'n3p!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,97He,B=Ldf9Bs
+JH16$aoMGcs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7UlHqpY'8
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7UZB!7UB:!7UlH!7U]C!7UN>!7UlH!7UlH!7UlHs3prI
+!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,01Idf@kr!!(K!!.b-m
+!<48C<It1$s+13$s-<TbN;rV,"J,Vj<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7UlHqpY'8
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7UZB!7UB:!7UlH!7U]C!7UN>!7UlH!7UlH!7UlHs3prI
+!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,01Idf@kr!!(K!!.b-m
+!<48C<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7UlHqpY'8
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7UZB!7UB:!7UlH!7U]C!7UN>!7UlH!7UlH!7UlHs3prI
+!7UcE!7UlH!7UlH!7UlH!7UoI!7UlH!7UoI!7UlH!7UlH"4I5Me+s(Ee,01Idf@kr!!(K!!.b-m
+!<48C<It1$s+13$s-<TbK)bPp"H`]\<E4P~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+p](<CnGiR<q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97He*R,;df9Bsqu?`GrVurIo)Jd>qu?`G
+rW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@Ie,KCJe,'+Idf9Bs
+r;ZoJ!7UoI!7UoI!7QK!JH3sqs!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+p](<CnGiR<q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97He*R,;df9Bsqu?`GrVurIo)Jd>qu?`G
+rW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@Ie,KCJe,'+Idf9Bs
+r;ZoJ!7UoI!7UoI!7QK!JH3sqs!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+p](<CnGiR<q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,97He*R,;df9Bsqu?`GrVurIo)Jd>qu?`G
+rW)uI!<CUI!!C[M!7UfF!7UiGs3prI!7UlH!7UoI!7UlH"4I5Me,01Ge,B@Ie,KCJe,'+Idf9Bs
+r;ZoJ!7UoI!7UoI!7QK!JH3sqs!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie+`nCe+!G8
+e,B@Ie)p`2e*[59e,04Fe,B=Ie*I)7e,04Fe,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WFqu?cH
+!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!!(LG!!(LH!!(LH!!(LG!<1Gu!.b-p!<48C<It1$s+13$
+s-<TbN;rV,"J,Vj<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie+`nCe+!G8
+e,B@Ie)p`2e*[59e,04Fe,B=Ie*I)7e,04Fe,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WFqu?cH
+!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!!(LG!!(LH!!(LH!!(LG!<1Gu!.b-p!<48C<It1$s+13$
+s-<TbM?!;'"I]>f<E4P~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie+`nCe+!G8
+e,B@Ie)p`2e*[59e,04Fe,B=Ie*I)7e,04Fe,KFFe+`nCe,'.EdfTU!!!)uHrVurIqZ$WFqu?cH
+!<1IH!;t:H!7UlH"4I5Me,'.Edf]["!!(LG!!(LH!!(LH!!(LG!<1Gu!.b-p!<48C<It1$s+13$
+s-<TbK)bPp"H`]\<E4P~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oc2[jnhZ*Z*JH16$JH4I*s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pT?!7U?9s3pW@s3pE:!7Tj+
+!7QK!JH2&;s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pT?!7U?9s3pW@s3pE:!7Tj+
+!7QK!JH2&;s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!$b/!7U66s3p34qpYQFrR:cHqpPNFqpY'8rR:]Fs3p-2s3pB9s3pT?!7U?9s3pW@s3pE:!7Tj+
+!7QK!JH2&;s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$]H!7U<8!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M!7UWA
+s3pE:"4I5Me+WhEdf9Bsn,NI;huEc+JH16$QiR.1s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$]H!7U<8!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M!7UWA
+s3pE:"4I5Me+WhEdf9Bsn,NI;huEc+JH16$QiR.1s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%.:!7UZB!7U35!7U!/!n..ur;ZiHqZ$]H!7U<8!7UlH#1EPPdf9Bskl:h7!!(L;!!C[M!7UWA
+s3pE:"4I5Me+WhEdf9Bsn,NI;huEc+JH16$QiR.1s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Jdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U]C
+!n..un,NI;r;ZiHq#CEDr;ZiHn,NI;i;`l,JH16$QiR.1s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Jdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U]C
+!n..un,NI;r;ZiHq#CEDr;ZiHn,NI;i;`l,JH16$QiR.1s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!$b/!7U35!7U$0"4I5Me,97He,01Jdf9Bsm/R.8r;ZoJ!7UlH!7U66!7UlH!7UK=!7UlH!7U]C
+!n..un,NI;r;ZiHq#CEDr;ZiHn,NI;i;`l,JH16$QiR.1s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHrVuuJ!<1I6
+!!:ULe,97He*?u6e,97He+*J=e,97He+NbAe*m>;e,97He+itDe,97He*m>;e*d;6e,KFHe,KCK
+dfBBrJH16$S,iR5s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHrVuuJ!<1I6
+!!:ULe,97He*?u6e,97He+*J=e,97He+NbAe*m>;e,97He+itDe,97He*m>;e*d;6e,KFHe,KCK
+dfBBrJH16$S,iR5s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%ICs3guKe,9:He,9:Fe,KCKdfBBrrW)oGrW)oGqu?`Gjo>D1rVurIr;ZiHr;ZiHrVuuJ!<1I6
+!!:ULe,97He*?u6e,97He+*J=e,97He+NbAe*m>;e,97He+itDe,97He*m>;e*d;6e,KFHe,KCK
+dfBBrJH16$S,iR5s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LI!<:OI
+!!(L9!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7UB:!7U97"4I5M
+e,97Kdf@kGrVurIJH16$SH/[6s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LI!<:OI
+!!(L9!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7UB:!7U97"4I5M
+e,97Kdf@kGrVurIJH16$SH/[6s&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!%IC"OdA"!7UlH!7UoI!7UlH"4I8!e,B=Ie,'+Hdf@kq!!(LH!!(L1!!(LH!<(CE!!(LI!<:OI
+!!(L9!!C[M!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7UB:!7U97"4I5M
+e,97Kdf@kGrVurIJH16$SH/[6s&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7U?9!7U?9!7UlHs3poH
+!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7U?9!7U?9!7UlHs3poH
+!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n.,Lr6kWGqpYKD!7U*2!7UlH!7UlH!7UoI!7U]C!7UE;
+s3prI!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7U?9!7U?9!7UlHs3poH
+!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7U?9!7UB:!7UcEs3puJ
+!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7U?9!7UB:!7UcEs3puJ
+!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UfF!7UlH!n..ur;ZoJ!7U]C!7U*2!7UlH!7UlH!7UoI!7U]C!7UH<
+!7UiG!7UlH!7U66!7UlH!7UK=!7UlH!7UWA!7UE;!7UlH!7U`D!7UlH!7U?9!7UB:!7UcEs3puJ
+!7UlH!7QK!JH25@s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,'+Fe*d8=df9Bsqu?`Gr;ZrK!!(L7
+!!(L<!!(LG!!(LH!!:ULe,97Hdt%LM!1a,i,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,'+Fe*d8=df9Bsqu?`Gr;ZrK!!(L7
+!!(L<!!(LG!!(LH!!:ULe,97Hdt%LM!1a,i,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC"OdA"!7UlH!7UoI!7UlH!n..ur;ZoJ!7UoIs3guKe,97He,97He*$c3e,01Ge,97Kdf9Bs
+qu?`Gr;ZiHnc/[=q>^WH!!(L4!!C[M!7UE;"4I5Me,01Ge,'+Fe*d8=df9Bsqu?`Gr;ZrK!!(L7
+!!(L<!!(LG!!(LH!!:ULe,97Hdt%LM!1a,i,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,B@Fe*mA;e,04Fe,9:He*?u6e+*M9e,KFHe,KCJe,97Hdt%LM!1a,i
+,6(Yos+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,B@Fe*mA;e,04Fe,9:He*?u6e+*M9e,KFHe,KCJe,97Hdt%LM!1a,i
+,6(Yos+13$s+138rrIuVp=]Y<!;fbrJ,~>
+s!%IC!7UoI!n.,Lr6tZGrR:cH!7UlH!n.,LrmLrLdf9CHe,B@Fe*6o5e,'.De,B=Ie,'.De+!G8
+e,B@Ie)p`2e*[59e,04Fe,B@Fe*mA;e,04Fe,9:He*?u6e+*M9e,KFHe,KCJe,97Hdt%LM!1a,i
+,6(Yos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s!!!oc2[jnhZ*Z*iW/l)JH16$JH5]os&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!"cLqU9uqJH16$JH4C(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!"cLqU9uqJH16$JH4C(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!"cLqU9uqJH16$JH4C(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!"cL!7UiG!7QK!JH16$JH4C(s!%JCJcE@^r\K-*JcC<$hZ!V8s7Y4NScJXf<Ib~>
+s!"cL!7UiG!7QK!JH16$JH4C(s!%JCJcE@^r\K-*JcC<$hZ!V5s7Y.LRK34b<Ib~>
+s!"cL!7UiG!7QK!JH16$JH4C(s!%JCJcE@^r\K-*JcC<$hZ!V.s7XtGOT>5X<Ib~>
+s!%1;s8Vfns8VHdrr:sX!7UiG!7QK!JH16$JH4C(s!%JCcMmn/r\FP#WrE=KIo/?e7;/CCs8FhR
+s8Fg*s+13$s5a1\N;rV,"J,Vj<E4P~>
+s!%1;s8Vfns8VHdrr;Zls8W*!!<;Ti!7UiG!7QK!JH16$JH4C(s!%JCcMmmcr\FPqX8`J)]QHe+
+3(n:sdf9;&rr;sRJcC<$JcFg2!K$jMg'!iEqc-XH~>
+s!%1;s8Vfns8VHdrr:sX!7UiG!7QK!JH16$JH4C(s!%JCcMmljr\FQ=X8`J%WGG$_3`1=Adf9;&
+rr;sRJcC<$JcFg2!J:@FeHD!7qGgOG~>
+s!%1;s8Vfns8VEcs8VHd!7UZB!7UiG!7QK!JH16$JH4C(s!%JCcMmm0r\FO>XT&=sHhfJGs8FhR
+s8Fg*s+13$s5a1\N;rV,"J,Vj<E4P~>
+s!%1;s8Vfns8VEcs8Vfnqu?Tp!7UZB!7UiG!7QK!JH16$JH4C(s!%JCcMml@r\FONXT&=i?MQD*
+s8FhRs8Fg*s+13$s5a1\M?!;'"I]>f<E4P~>
+s!%1;s8Vfns8VEcs8VHd!7UZB!7UiG!7QK!JH16$JH4C(s!%JCcMml0r\FP>XT&=K7enjgs8FhR
+s8Fg*s+13$s5a1\K)bPp"H`]\<E4P~>
+s!$b/s8VEcs8VKerR:QB!7UiG!7QK!JH16$JH4C(s!%JCci4%@2#]931qBdh$N4cs1JGORrT_(<
+bl@YuJcC<$JcFg2!K@'Pg]X2Kqc-XH~>
+s!$b/s8VEcs8Vfn"TJH%s8W#trR:QB!7UiG!7QK!JH16$JH4C(s!%JCci4%62#]932"%OH$Mm1I
+1MG&,q;SVebl@YuJcC<$JcFg2!K$jMg'!iEqc-XH~>
+s!$b/s8VEcs8VKerR:QB!7UiG!7QK!JH16$JH4C(s!%JCci4$V2#]932#+6R$L'W.1P=BVpY)?9
+bl@YuJcC<$JcFg2!J:@FeHD!7qGgOG~>
+ruqUHs8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts6fphdf@kk!!(LG!!(K!!.b-$!.b.(!<48C
+<R:[Lb;1qr1G_r,rrr(H5s9Gbr\OQR#Q:o<5;brWh8fNuf/#3OqYC-rrMa-e2b\kfrr;sR%K2ec
+6&GX9J3Z;Ap&G'k1Ca;Q76ue1pOGLmG4kn8r\OTSqD8!Jr\Fr\S4,`#s7_%/5'HVurs/M-A3VqA
+HJST#&cA5'4Z,fX_Z0Z6Sln368UJ>Rrs%461Gh-oRf36iomoClGP1qkrr36%Z"-'V7sa!Bs+13b
+rrJ)Yp=oeB!;fbrJ,~>
+ruqUHs8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts6fphdf@kk!!(LG!!(K!!.b-$!.b.(!<48C
+<R:[LJMT*Y1GaU[rrqP&4[Y2,r\OQR#Q1/t4?-,po>gk6R56X*rqZR!qNb,B3E;@?rr;sR%K(c@
+8YQ1MD)t%CrVuos1Ca855"VIJlYS[MN;`eVr\OTSqD8!Jr\Fr[JNcZ!s6FM_6]D!Crs/In><Fl@
+Mt?rJ&bq8]3]L#neGoRDMbuMp;M`j%rs#/Q1Gh:(Yl4S*k&*=LN;``3rr36$Sm+<::Q+gqs+13b
+rrIuVp=]Y<!;fbrJ,~>
+ruqUHs8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts6fphdf@kk!!(LG!!(K!!.b-$!.b.(!<48C
+<R:[L;DU+M1Gd5PrrpMP3D$.Jr\OQR#OdUK3BC95qT&U<>Ve1#q#:T`KM=Eh?E!i%s8Fe`nSL9b
+_#MY`2bg4Ls8W'S%In9q;o&FX>;o9Srr<#t1]RLO1]%.N1CN_i3E*`nc!*,$VuH\q#OdUK3BC95
+qYpL,jEsT[3a7m3s8V/-9/nt:Q0/)G#$j#@2+)3%rVm&C?o^fVrr+_Qrs/"O;)p[>Sbdp;JcELb
+!J:@FeHD!7qGgOG~>
+ruqFCqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8VKermUWB!7UiG!7QK!JH16$
+JH4C(s!%JCd/OCM:GY$,@P]q3rr3#p<;eTQ;#W9NrrN(=q_J75b/jSbHS[IKq>UKnD>Q*k4l65=
+r\FPSrA+Is?MuY]>6"X%1B=HR1BDW)rA+LYs8W'Ss8VpOqZ$ON!35uR!Hh`I1B^n]s8@!81B]_\
+s8SVc1]RITSGG&@rrBD&1B_aus7oXm1B:8N1]RIUrGqck!BJ;Rs+13crrJ)Yp=oeB!;fbrJ,~>
+ruqFCqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8VKermUWB!7UiG!7QK!JH16$
+JH4C(s!%JCd/OCL3\s#!4u57trr3#i4T.&9GlBN!rrMpmq_J7<nAtV375Ha]q>UKi9`$UJ9DAJd
+r\FOorA+JW5Q*A>O8o7Z1B;Fn1BFXCrA+M9s8W'Ss8VpOqZ$ON!-.rn!NnZc1B`d=s7oOh1B]u4
+s8QC$1]RIT?2?AVrr?0u1Ba`Xs7/;N1B;\!1]RIUq,.#F!C6.*s+13crrIuVp=]Y<!;fbrJ,~>
+ruqFCqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8VKermUWB!7UiG!7QK!JH16$
+JH4C(s!%JCd/OC@2D\h<3AXJ0rr3#E2uPN4Y5U6WrrM+Dq_J7Wq8iR<4#8\aq>UKP4o7#;D>aG6
+r\FOJrA+Jj3W1`8d/X.F1B:,I1BG<PrA+N%s8W'Ss8VpOqZ$ON!)3>I!Ppep1Bc))s5H9?1B^qX
+s8POa1]RIT7J\h>rr>Ia1BcS7s3<S%1B=TW1]RIUi]m;r!F,ANs+13crrI`Op=0;.!;]\qJ,~>
+ruqFCqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8VHd!n..uq#CEDqu?`GJH16$JH16$g&V-s
+s&IGG#j4!"?2rS61Ni]s#/;rM9BGr:r\OTS$-4nYJF*6^1G_PBrrYG@1[k/>$cXtY:$)2B1G_o.
+s8FeU:$q$@1C$\Bi\NANs8W'S!_r(Cr\FdSmG]oX3WK-Y1]IFR1\^qK1BL;<jSgq]:@7$s1HGL8
+a>5W&m/><f1IqKF4u5".rq"*Ss8P8=1VNeZ`HhI_&<5'2rT#aj3rf5p1G_\cpmM+;s8NDH1GaRJ
+rR!DW7tL\ks1nX8N;rV,"J,Vj<E4P~>
+ruqFCqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8VHd!n..uq#CEDqu?`GJH16$JH16$g&V-s
+s&IGG#fAGSSH#*81W04l#&uFTEUiR;r\OTS$%F`eW:]o!1G`O^rrY/81]."J$[jfeFRepE1GaIZ
+s8FeUGk]A[1C&4"a>5V:s8W'S!dOI^r\Fe)pW,-H5QCc_1]IFR1\^qK1BMgqb5O1CH2#B91I(p>
+IkrmZo_H0V1LpIb2D[/Irp@1*s8Ou51Z89"[q,L<&<,H@r73Y[6i[1+1Ga%@nSeC_s8NCT1Gc!%
+q7SR?@tFZ2s1nX8M?!;'"I]>f<E4P~>
+ruqFCqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8VHd!n..uq#CEDqu?`GJH16$JH16$g&V-s
+s&IGG#^%pZg&G>61["c;##-m0ReYr9r\OTS#uNK7_>3bp1Gc8VrrY,71]@.L$W/]9SbM8@1Gd&N
+s8FeUV#-;R1C'cRO>A\'s8W'S!i5^Ur\FeUqiETiAH2]/1]IFR1\^qK1BOBLOo@-_V>H?11M$Oc
+;):#Eq=U:71U-oZ2)@&VrSskRs8Or41[b5%WDNTo&>8.`q7e^AF8u871GbKpj@]D-s8NC&1GclC
+opmlpY^uh*s1nX8K)bPp"H`]\<E4P~>
+ruqXIs8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs6fsde+`nCe,01Gdt%LM!.b-$
+!87GQ,6(Zirs4W@2:_a(4#9)"rruab1WBCoq>N2Mrr?C$1B9>SrrYG@1[k/>$XkhIaT);91G_&k
+s8FeU`W,o91C(esr\ZJgs8W'S!lb3<r\Fers8Fl32#mUT1]IFR1\^qK1BPPqrVeSY_Z0Tm1Go.3
+?MQA`2ZNf(1G_F=Pfj"*#(&-^6ueI6rr3-#[Uh`^r\Fj<s8Q@\1WBCoq>N2Mrr?C$1B9=as+13c
+rrJ)Yp=oeB!;fbrJ,~>
+ruqXIs8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs6fsde+`nCe,01Gdt%LM!.b-$
+!87GQ,6(Zirs2=T2>."B2)@u+rrtVB1\(MFnbt?Err>4X1B9GVrrY/81]."J$U-@&o)Ja\1G_5p
+s8FeUnc/Od1C*IMrA6;fs8W'S!qH<gr\FfLs8=c12?3^U1]IFR1\^qK1BR+Hr;JJXnc/PE1H#44
+4o$l?3WK+K1G`!TS_F)C#"CC)<-Xtfrr3-"TNXK8r\Fj<s8P5<1\(MFnbt?Err>4X1B9Fds+13c
+rrIuVp=]Y<!;fbrJ,~>
+ruqXIs8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs6fsde+`nCe,01Gdt%LM!.b-$
+!87GQ,6(Zirs1eE48]'.2)C9lrrtG=1\q(N`;VRmrr>%S1B:.jrrY,71]@.L$TU"!q>^K91G`J>
+s8FeUq>]s`1C*aUpbXcds8W'S!r;lcr\FfTs7eE,3<0$X1]IFR1\^qK1BRCPnGY3Lq>^4H1H>F7
+3;G?::&k5U1G`<cVsXK`#!=[t?%/^=rr3,rNDhkpr\FjCs8P&71\q(N`;VRmrr>%S1B:.#s+13c
+rrI`Op=0;.!;]\qJ,~>
+ruqXIs8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uum/R.8pAb3Bqu?`G
+JH16$JH16$g&V-ss&IJH!;?1D#.":/3\rSgrr;sRs8N'XpbU"k"+)g[Sb`9f4>Seirr<!S!]C#X
+r\FWRs8W'S#Q+Q$2)@&gs8FeUr;Zfr1C*gWs"uSgs8W'Srr;sRp](4K!rW)ur\FiWs8Or41]RJ6
+pbVsM!qUOmr\Fa8FT;C4FZ04T">k6#s2"Les8N0^1Gen,s8FhSrr>"Q1P,RWs1nX8N;rV,"J,Vj
+<E4P~>
+ruqXIs8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uum/R.8pAb3Bqu?`G
+JH16$JH16$g&V-ss&IJH!:9J:$1.]l2)@&fs8W&s1]RIT2>AuKrrY\G1ZeH4$T0^rrr<#t1G^og
+s8FeUrr<#t1C*pZs"lMfs8W'S!ri6"r\FfYs8Oo31]RLS1]IFR1\^qK1BRRUs8Fe[rr<!T1Gf(2
+2>B!-rrV.h2#]981njsLiF=_D1B]P.s8RZG1]RIZ2)@&fs8W&s1]RIT2>AtYs+13crrIuVp=]Y<
+!;fbrJ,~>
+ruqXIs8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uum/R.8pAb3Bqu?`G
+JH16$JH16$g&V-ss&IJH!4)AU"nqur1c$rerrDlo1]RIT2#&lJrrY>=1\:GB!];birr3/t1G_2o
+s8FhRs8FhRrrb/71]RLS1]IFR1]ICW1c$rfs8FhRs8FhKs8FhRs8FhRrrk581]RJ3pbVsM!kqVj
+r\Fa9f)Pca<&FS1"?"d1s&AeMs8N-W1Gf%1!;ZUMs8N'UpbRL$JcEOc!J:@FeHD!7qGgOG~>
+ruq[Js8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs5X.[e,01Gdt%LM!.b-$!87GQ,6(Zj
+rrC+71C6nXs'7E:b5_M;r\OTS"(!c>ahn&\f/#3OqYL4"@5B^\s8VmN1HGL8r\OQRr\OQRr\OTS
+r\OQRr\OQRr\OTSr\OQRr\O<Kr\OQRr\OQRr\OTS"(!c>anPf=qq8A51H>@5%K"hd1G_#js%Y@+
+WVZSm1]RIZ>r+:Zs8Voo1]RIW?8FCZJcC<$])Meis7Y4NScJXf<Ib~>
+ruq[Js8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs5X.[e,01Gdt%LM!.b-$!87GQ,6(Zj
+rr@HA1C8I/s#i.oo)Ja[r\OTS"$JFro"tD0QSUF)rqcX&4u5"cs8VXG1Htj=r\OQRr\OQRr\OTS
+r\OQRr\OQRr\OTSr\OQRr\O<Kr\OQRr\OQRr\OTS"$JFro(W.fo[Kcp1Hk^:%J8/J1G_2os#Dkk
+bl.J=1]RIZ4Ynnbs8VWg1]RIW4YnnbJcC<$])Mefs7Y.LRK34b<Ib~>
+ruq[Js8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs5X.[e,01Gdt%LM!.b-$!87GQ,6(Zj
+rr>mj1C;,%s#;ejq>^K5r\OTS"#r(mq83.6>;J("q>Ug_1Gek,s2ZuP@K6B,1]IFR1]IFR1]RLS
+1]IFR1]IFR1]RLS1]IFR1\^qK1]IFR1]IFR1]RIW3&<Adp\tE`cAOJ7=oJ@0m*:MF1KjbX2D[/H
+rpftDs8N9_1Gek,s2=mms8N0\1GeiXs+13]rrI`Op=0;.!;]\qJ,~>
+s!"cL!7UiG!7QK!JH16$JH4C(s!%JCdf0IK9/AB0rr3E$1G^rUs1^?G:ZqPBr\OTS$-=tZ7EbN&
+iN[7@rtkWJ1G__>oDS'mFoTH;1JR$-T//9"s8W'Srr;sRrr;sRs8W'Srr;sRrr;sRs8W'Srr3'e
+1GciAs8FhRs8FhRs8FhSs!>cC1I]L_q;JSqs8Q$%kl'X"1H#44;m>KajteeNs8PSF1UR"cr\OTS
+#/;rM:ZqPBr\OTS$-=tZ7EbN&iN[6Ns+13crrJ)Yp=oeB!;fbrJ,~>
+s!"cL!7UiG!7QK!JH16$JH4C(s!%JCdf0II3AWJYrr3Do1G_&gs)BhNH1UQFr\OTS$%arh@+tSQ
+fqhrprtkK!1G`ajp\X'X@fLj41N`3ZFYbh$s8W'Srr;sRrr;sRs8W'Srr;sRrr;sRs8W'Srr3'Z
+1Ge"bs8FhRs8FhRs8FhSs!<7Q1LSr8p=Z9Is8QfJnG^ro1H#44Bts0:eMB!=s8P&71Y;>ar\OTS
+#&uFTH1UQFr\OTS$%arh@+tSQfqhr)s+13crrIuVp=]Y<!;fbrJ,~>
+s!"cL!7UiG!7QK!JH16$JH4C(s!%JCdf0I:2D[/`rr3D41G_]&s%P:*U&!eCr\OTS#uWQ8K]W1(
+d@!\Lrtjl\1Ga^;qYAsD:]F9J1S+@)9f"TEs8W'Srr;sRrr;sRs8W'Srr;sRrr;sRs8W'Srr3'X
+1GeOqs8FhRs8FhRs8FhSs!:Q!1PFlgo?it"s8RSmp&29S1Hkd<J'@Ta[50U%s8Or41[4@=r\OTS
+##-m0U&!eCr\OTS#uWQ8K]W1(d@![Zs+13crrI`Op=0;.!;]\qJ,~>
+s!"cLqU9uqJH16$JH4C(s!%JCdf0F21G_2lrs"981N<Bi;uJKP:]<0MrrN(Eq(p(k!Vgm71BRUS
+C\omi4l$);r\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQR!1`sCqZ$ONrr;sRrr;sRs8N,uHMKAs
+s8"MQ7fWMb1BU,Hs0_e]!)!5Hs8N,q;uJKP:]<0MrrN(Eq(mU%JcEOc!K@'Pg]X2Kqc-XH~>
+s!"cLqU9uqJH16$JH4C(s!%JCdf0E_1G_W#rru%N1VNhZ4T.&9GQ'DurrMptq(p(k!UX.f1BRUN
+8c(:G8b`8br\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQR!*/qQqZ$ONrr;sRrr;sRs8N,q=SXcQ
+s8"MQ@K6B(1BV(cs)Iun!,_]ks8N,j4T.&9GQ'DurrMptq(mU%JcEOc!K$jMg'!iEqc-XH~>
+s!"cLqU9uqJH16$JH4C(s!%JCdf0Dg1GajbrrtVB1ZeY]2uPN4Xo:-VrrM7Kq(p(k!R=.01BRU4
+4o7#;CAe,3r\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQR!($N=qZ$ONrr;sRrr;sRs8N,^6MWG;
+s8"MQU&Y/h1BX?Ns%NAI!3#lQs8N,E2uPN4Xo:-VrrM7Kq(mU%JcEOc!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCdf0E)1G`kFrsn'F1Hkd<omo@kG4RLG2?*U]rk*,;2EOok`l7ribC*2L
+2+2,Os8W%p>s(#;J`Zn2r\OQRr\OQRr\OTSr\OQRr\OQRr\OTSr\OQR!r%(.r\OENr\OQRr\OQR
+r\OQR,lYGo75d5-K?!rkjcNY*2bSS_s8V2C=?/<5IH^_2rK]l4C$kmUrr38sJNuAAo.r0[rr39'
+]P^.r4&ppQJcC<$_#FFos7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCdf0D@1GcQ=rslOp1J.WHj_d.HMtf(a2u`g_rMa<m2*G3*f#I_&rOI#A
+3B'QNYlFb!PuTh)<0R.Ws8FhRs8FhRs8FhSs8FhRs8FhRs8FhSs8FhRrrVP%4T7/5s8FhRs8FhR
+s8FhRs!7QBA3`"8>`[J9s3cQs2`X`qq>^KCKMXTf;3(JPs8%.,5CWM/1]IC[j_d.HMtf(a2u`g_
+rMa<m2*G3*eq*jPs1nX8M?!;'"I]>f<E4P~>
+s!!!oJH16$JH1B(s!%JCdf0D41Ge(hrsij$1Pc#1aBpktVW]fl7/m2lp6]&I2*tiCkJmN7q5A$s
+2E=W__#OGsJkJ!a?)@N!s8FhRs8FhRs8FhSs8FhRs8FhRs8FhSs8FhRrrU>J3;t`1s8FhRs8FhR
+s8FhRs!7<*><Oi1A=Mc^s1ieK2*5!9rVuo5G"=JP>,(uqs645X7$dfN1]IC[aBpktVW]fl7/m2l
+p6]&I2*tiCkCNYas1nX8K)bPp"H`]\<E4P~>
+s!!!oJH16$JH1B(s!%JC^Ae<(1G_1Fs/l;'mkZa_JcC<$[/U/cs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JC^Ae;g1G_URs/l;'feYEUJcC<$[/U/`s7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JC^Ae:q1Gao>s/l;'N\`JKJcC<$[/U/Ys7XtGOT>5X<Ib~>
+s!!!oJH16$JH1B(s!%JC_uC!B[dX1MAhu5[JcE%U#Z\>%rS2!@1Mq^CJcE+W!K@'Pg]X2Kqc-XH~>
+s!!!oJH16$JH1B(s!%JC_uC!Y`qB2Q6o-X'JcE%U#].NRqTVDa1U)H1JcE+W!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JC_uC!ndeWUI3\rSNJcE%U#_CG"p:34?1Z<obJcE+W!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JC_uKQh!E&]Es0D\$1BCALJcC<$[/U/cs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JC_uKQh!HJ*is0D\$1BDLpJcC<$[/U/`s7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JC_uKQh!18?;Z2aYV!18?;JcE(V!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JC_uBu"K1\!c@&!UNs0;S/i.FWZ5@C5aJcC<$Zi:&bs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JC_uBq`F@%iOBsiNlYl=pMF@%iOBsiNlJcE%U!K$jMg'!iEqc-XH~>
+s!!!oJH16$JH1B(s!%JC_uBqKB0A1DFio:8Yl=p8B0A1DFio:8JcE%U!J:@FeHD!7qGgOG~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s!!!oJH16$JH1B(s!%JCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+JKfXhJKfXhJKk+oJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+JKfXhJKfXhJKk+oJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+JKfXhJKfXhJKk+oJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+JKfXhJKfXhJKk+oJcC<$\,X&?JcDSH!K@'Pg]X2Kqc-XH~>
+JKfXhJKfXhJKk+oJcC<$\,X'aJcDSH!K$jMg'!iEqc-XH~>
+JKfXhJKfXhJKk+oJcC<$\,X&?JcDSH!J:@FeHD!7qGgOG~>
+s!WFlJP:VgJP:\is&FXMJcE4Z!!']g!!%TMV>gRTs7Y4NScJXf<Ib~>
+s&FVpJTu`jJTufls&FXMJcE4Z!-c-V!-a"oV>gRQs7Y.LRK34b<Ib~>
+s*'$^JXM(WJXM.Ys&FXMJcE4Z!!']g!!%TMV>gRJs7XtGOT>5X<Ib~>
+JLH'tJLH'tJLLOuJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+JQ78$JQ78$JQ;_MJcC<$\,QGP^&J(VJcDSH!K$jMg'!iEqc-XH~>
+JTlZhJTlZhJTq,oJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7qGgOG~>
+JLH'tJLH'tJLLOuJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+JQ78$JQ78$JQ;_MJcC<$\,QGP^&J(VJcDSH!K$jMg'!iEqc-XH~>
+JTlZhJTlZhJTq,oJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7qGgOG~>
+JLH'tJLH'tJLLOuJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+JQ78$JQ78$JQ;_MJcC<$\,QGP^&J(VJcDSH!K$jMg'!iEqc-XH~>
+JTlZhJTlZhJTq,oJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7qGgOG~>
+kpQQ3lR;f5r@%XEpF-"?r@%^Gr$_UFlR2c5JLH'tJLH'tlmVm6_#OE7VuQbsq>^Hpi;`fWnc/Uh
+kl1e`KdI!(lMpkaoDegjm/R(coD\dj]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+ku@``lW*ubrDigrpJq1lrDimtr)NdslW!rbJQ78$JQ78$l;bY"s+mTQrrDlprrD!WrrDThrrD9_
+"SldO!s%WdrrDZjrrDEcrrDZj!-c-V!-a"oV>gRQs7Y.LRK34b<Ib~>
+l$!.-lZ`C/rHJ5?pNQT9rHJ;Ar-/2@lZW@/JTlZhJTlZhm!&J0_#OE7VuQbsq>^Hpi;`fWnc/Uh
+kl1eG<"o?5lMpkaoDegjm/R(coD\dj]ncXgJcDSH!J:@FeHD!7qGgOG~>
+oI'_>pF$%Al6lZ4r[7dHr?q[Gq'Z7Cr?qmM-n,*D.0'8p"90bts6M-9s!T;qJLH'tJLH'tmjS39
+dJjF.FXm\&/qs'"rrBJ,!jVeLpAb-mq>^Hpi;`fWnc/Uhrr;uumJd9`!+#9^s8N*!rs%A'.gH>4
+L&CuN!:9ac!;$3j!8!&,!9o:>!.k0HrrJ)Yp=oeB!;fbrJ,~>
+oMknkpJh4nl;[iar`&surD`jtq,IFprDa(%<E9'!<WE%u"92A$s6N_fs&E)!JQ78$JQ78$m8_R6
+#3E:[M2nC[p](8L[Jp;)!)WChrrDlprrD!WrrDThrrE&urrDHd"%rWeqW\%[!<<''a($4o%6L3[
+s8N)cs8N)jrr@8ps8N)`rr@7os/#_rM?!;'"I]>f<E4P~>
+oQL<8pNHW;l?<7.rc\ABrHA8Aq0)i=rHAJGGBa(2GQ7Yd"93Rhs6Oq3s*&\eJTlZhJTlZhms"e3
+dJjET;AK?K9"t'"rrBJ,![.QLpAb-mq>^Hpi;`fWnc/Uhrr;uumJd80!6"m$s8N*!rs#]*('>7C
+^AS$2!:9ac!;$3j!8!&,!9o:>!.k0HrrI`Op=0;.!;]\qJ,~>
+kpQQ3l6lZ4r[7dHr?q[Gq'Z7Cr?qaI.0'5o!rj\Kr?q[Gr?q[Go-aV=r[7dHJLH'tJLH'tmjS39
+dJjFrO4jEoGQ9l$s8N)-rri9>!!DHZs8N)ps8N)Ws8N)cs8N)drrO2@mc=BQ,ELOTk]d(irVult
+m/R(coD\djf80G,l%f<>JcDSH!K@'Pg]X2Kqc-XH~>
+ku@``l;[iar`&surD`jtq,IFprD`q!<WE"t!rl:#rD`jtrD`jto2Pejr`&suJQ78$JQ78$m8_R6
+#Gfl@rpHkD_"ds0Lpm<dq?I!*qY1$i!;ZZp!9!nW!:9ac!:Bdf#6=Y^rs(Z\jo*q/!-eDArrDEc
+rrDZj!-d&prrD<`!-a"oV>gRQs7Y.LRK34b<Ib~>
+l$!.-l?<7.rc\ABrHA8Aq0)i=rHA>CGQ7Vc!rmKErHA8ArHA8Ao6137rc\ABJTlZhJTlZhms"e3
+dJjGNZgR_5+991Os8N)-rrhNf!#tn2s8N)ps8N)Ws8N)cs8N)drrN<'roF(a<3u#iarg]!rVult
+m/R(coD\djf80G,l%f<>JcDSH!J:@FeHD!7qGgOG~>
+r@%^G!@\!H.0'>G./j2G-is>rrr;sGrVujFrVudD!<<$H!rjYsrr3!Is8=>Gs8+2Gs![pG-j'Ds
+s8=>Gs8FGGs7@]@s!T;os8=AGrrjhN-n,*Drr7NtJLH'tJLCRJ<E79C!rDs#q#C?o[f6Kh!"8j*
+p](6nq>^Hpi;`fWm/R(cmJm1dhZ!ZS!!N9#rrDEcrrDZj!!(W,rrD;>!!%TMV>gRTs7Y4NScJXf
+<Ib~>
+rDimt!EK0u<WE*t<W2st<<<,"rr;strVujsrVudq!<<$u!rl8#rr3"!s8>pts8,dts&K*t<<E2#
+s8>pts8H$ts7B:ms&E(ts8>strrlF&<E9'!rr7OLJQ78$JQ;\Lbl7b@LlD-/s+n,`"LS4S!4DS$
+rrDlprrD!WrrDEcrrDHdrrCpU!qcO!rVultm/R(coD\f7fDkjNl2La-JcDSH!K$jMg'!iEqc-XH~>
+rHJ;A!I+SBGQ7^AGQ%RAG6._frr;tArVuk@rVue>!<<%B!rmIgrr3"Cs8@-As8.!As*+MAG67eg
+s8@-As8I6As7CL:s*&\cs8@0ArrmWHGBa(2rr7OnJTlZhJTh0><E79C!n@8lq#C?o[f6J.!"8kd
+p](6nq>^Hpi;`fWm/R(cmJm1dhZ!Z-!$;+=rrDEcrrDZj!!(W,rrD;>!!%TMV>gRJs7XtGOT>5X
+<Ib~>
+r?qgK./t^qr?q[Gr[7dHr?qdJ.0'>H-ij;E-j'Dss8=>Gs8=>Gs8FDSs![mq./t\Ds!T;qq^;RH
+-n,,o-j'Dss8=>Gs8=>Gs7@]>s8=>Gs8+2Ls![mqs![pIr[7dHJLH'tJLH'ts&I;C!rDs%q#C?o
+"oWf]#u1'krs&1@,6ecSb5VG@!<)rt!<3#u!"/Em"987M-jBu7QJqiHI/of<&H)P4fes!bbl@bC
+rs%.7"Y@mu!;ZX&70&t[s+M$as7H?trr33#NA(YI5Ipdnrr<`.?O.L)s8VtJ-jBu7QN-sb!<<)r
+!<<''r/EB:$pV<!s8)d$s7UX]"qjVPrr;uu!qo7hqZ$QqqYpWo!!`E%rrE&u#536c"qjVPrr3N%
+E?56(L]@AS!<<)e)$Hf3rr<&qM#RG_LI)CT2i*2O$jA29reM,;8IY_23/!*DL.)gZ"WU?pqZ-YP
+#)5bh"U6/\reURS!eVm&rJ1FRJcDSH!K@'Pg]X2Kqc-XH~>
+rDa"#<W?)!rD`jtr`&surD`t"<WE*u<<3'r<<E2#s8>pts8>pts8H"+s&K)!<W?'!s&E)!qc*au
+<E9(t<<E2#s8>pts8>pts7B:ks8>pts8,e$s&K)!s&K+!r`&suJQ78$JQ78$s&I;C!rIe5q#CAM
+"oPZbO1G8hrs&/'PDPL1pAY*lM#IARM#RGSL^NdHM#[@_QALX"gYr/8,QQ?p,lIZHXs=-:nGiRg
+rs#VO"@DVY!;ZX&&HM%ps!&`fs6'Fprr32sFX%)&:u2-Nrr<`&63JU;s8Ve+*<Qa;ZN'q)!<<)r
+!<<''pN7\b&Q%<[s8)d$s63i,!uPD2rr;uu!pD?>qZ$QqqYpWj!"8c*rrE&u#3fG2!uPD2rr3Mj
+=qh)kVZ6Yr!<<)J"prlVrr@9>s8N',q-FRKL]@$M&.ig[rr3PmB+>(kKDtoNp1PHK%77B#qZ-Zr
+#5<6b"qa\frr;uu!pD?>rVlkAJcDSH!K$jMg'!iEqc-XH~>
+rHADEGQ2merHA8Arc\ABrHAADGQ7^BG6%[?G67egs8@-As8@-As8I3Ms*+KeGQ2l2s*&\eqf`/B
+GBa)cG67egs8@-As8@-As7CL8s8@-As8.!Fs*+Kes*+MCrc\ABJTlZhJTlZhs&I;C!n[K*q#C?o
+"m/,T)3+Xprs$P<&dBV+p\t3m!<)rt!<3#u!"-=Z!WUnR'`o(Ldc(3/&-/4#IJj*LL_pG+q#CEo
+rs"8r$"3Q/!;ZX&#QXPtrt'h_s.99[rr32[>o<b_BCc'%rr<_V/-\&ds8UhQ'`o(Ldf9=I!<<)r
+!<<''hd%*&)/&O:s8)d$s2[kH"seHfrr;uu!kTKSqZ$QqqYpWL!&"6MrrE&u#09IN"seHfrr3MI
+7h#\fbQ%SB!<<(l"!d:1rr<&qM#RG^HR/h.?ANYH"V4E-L]qfJ"9]ZEreLf%/IMRe/T?OC!<7iZ
+G;9U/%6&k;M#RGVA.Se?L]@F+s/#_rK)bPp"H`]\<E4P~>
+r?qgK./t^qr?q[Gr[7dHq^;IEr?qaI-n,#n!%@aEr?q[Gr[7sM./t^qs8FGHs84;Fs8FDHs8=>I
+s![pG-ij;:-ij;F-ij;E-jK]"s![mqs8=>Gs+)SL."Ndt.0!;lrr_S<!d"/:rr<b"]D7?b3<0$R
+/d8!EegUg@s8N'!rVultrr;uu$@p=Zs+(/OkPX"Rir95W!Y#*>!OVk+&aou7c1,EH!<<)f#S#&K
+B)hr-s"(Y[5l^cm$fq?C!$D7@qa^jPo]JaJ[/^.+!/\tj<<89_JH/d7r7Q,jrr<&us8N)trs8Km
+"Hi?>8-H<rs8N)urt"lW"eteC.0d]irr<%LbMrBurrDrr"7(L>F8c.=!<<':pau`Epspku_uKK]
+"I8TDJcG`M!<;X>"Jkhm!!)kOrr=6?@YIPW2E,*!:&lJoLkH1?Kn)bq*/KD>!%rVQF?PG9!!)tR%
+u)D49nI^=!aph?!!#E'H2WO!!.k0HrrJ)Yp=oeB!;fbrJ,~>
+rDa"#<W?)!rD`jtr`&suqc*XrrD`q!<E8ts!*/prrD`jtr`'.%<W?)!s8H$us85mss8H!us8>q!
+s&K*t<<3'g<<3's<<3'r<<iJ's&K)!s8>pts++1$<In/$<W?(Drr_eqMUqS&s+hAqlh[c?`;fl4
+O,`/tif0#os8Rn2rVunRrr<"S$E<UUs.G1jq#'9Xir95M!?(nT!U]md&_@(+jQ'#8!<<)N![$La
+9`P1hs"$hDW;l\u"o81q!)3Fmp)OCCq:->gkl:Y_!)M\:*s1'o1B<F(q8u\:rr<&us8N)trs8<=
+#I4*T)$oI&s8N)urt"Q.$c2_U$4cS*rr<$gj1tNkrrDrr"5m2_Vu?Yq!<<':mg]`AqnNOKnGhnb
+$+0K_@/p6,!<;$c#h8YL!-e;>rr=6Hde6fD\NA75=TFH]s6qGVr8qDfFoVIt!0-LDb#JE@!!)ut
+&,%"KZ2)of#jD<g!!#LK_#=95GCfdjrrIuVp=]Y<!;fbrJ,~>
+rHADEGQ2merHA8Arc\ABqf`&?rHA>CGB`ub!-e>?rHA8Arc\PGGQ2mes8I6Bs87*@s8I3Bs8@-C
+s*+MAG6%[4G6%[@G6%[?G6\(ks*+Kes8@-As+,BFGCashGQ1[grri;I,S&T(s8N'5@cuqt!7(WE
+_?MOBpRh[Cq#C?o!<)rt!<3#u!"*<,IfC,_YP.Y!1?/<<ZiO_;$j-2&rt1Cp<q4Fj!!*'!Oo\VR
+c%l?"q>Vuf!8[\=$k<.756/4ns4If%b58aX+SPj8!!$d(bmasIrtPO;p@YpNs8N'!rr;uurVm/V
+$m*Rg\dKYSqZ$Qqrr3MG"tS="TER"Ds8N'!Aak0Fs8N)srri;I,S&T-s8N*!ru&ZX/(aNg"Y]ZN
+^'5e)qo_#"rr<'!ZNVQ@q#:<oqM>.O+u4In'**/*H@?M-EJTE^-$4l_(]\9+L^O2gK7dVPLkl$2
+rJ1u+"qYU*@g3NtLkl$22Ln0nL]@F+s/#_rK)bPp"H`]\<E4P~>
+r?qgK./t^qr?q[Gr[7dHq^;IEr?qaI.0'5o!rj\Kpa?.Br[7sM-n,*Ds8FGHs8=>Gs848Fs8=>I
+s![pG-ij;:-ij;F-ij;E-jTc#s![mqs8W'H!<7TuJLH'tJLLOuci<tE!=4e]s8N'+C&e5+!"/c+
+XT25trs%<[+TMHA!<)rt!<3#u!!$a4rrNK,WS[XZb5aX(ec7?%rt1RtC]FG!!!*'!QN1h$s60L`
+q>V#g!#bh'%X;L`VuTits1A>#rr3Pq!#tt<!!$g7s69S"rs8\)qu?Zrrr;uurVlr3!(Hne!p]h*
+qZ$Qqrr3&%!)`aq#MoG's8N'!C&%`.!<)rs!!*@er;Zcss8N/&!)`aq#2T>&s/H&pqu?Zr"8FkZ
+UA+Zf!;_NO!"1]@Lk>[02Md0A!!W4T#DW9]Lkl37>5O-U!<%]TA,mqTL^/>.%Z#o@!''k3!!%TM
+V>gRTs7Y4NScJXf<Ib~>
+rDa"#<W?)!rD`jtr`&suqc*XrrD`q!<WE"t!rl:#pf.=or`'.%<E9'!s8H$us8>pts85jss8>q!
+s&K*t<<3'g<<3's<<3'r<<rP(s&K)!s8W'u!<7UMJQ78$JQ;_Mci=!#!Kl=7s8Rl^k5YJSLlq`;
+X,,L/rs%/4XT/<VM#IARM#RGSL]HW;rrS%5kMH4CG6!p.PlQ%-rt.!dcN!pf!!*'!1'#W"s2tBB
+q>V#D!'1).*?EH*2ZUbqs'l&$rr3PV!'pSa!!(=Es31O!rrW8Equ?Zrrr;uurVlq/!2'8j!mgp4
+qZ$Qqrr3$n!3lJ&#H[u$s8N'!bkV5<!<)rs!!*bHr;Zcss8N-o!3lJ&#-@l#s%!-jqu?Zr"76^,
+e+`kBGP_@>!"6gHs6BXm`rH)(!#GG2#Pe?/s8N0$bPV>>!<)p!@fW/#rs-mN5l^ia!6k??!-a"o
+V>gRQs7Y.LRK34b<Ib~>
+rHADEGQ2merHA8Arc\ABqf`&?rHA>CGQ7Vc!rmKEpic`<rc\PGGBa(2s8I6Bs8@-As87'@s8@-C
+s*+MAG6%[4G6%[@G6%[?G6e.ls*+Kes8W(B!<7UoJTlZhJTq,oci<tE!A!:+s8N'+l2UdY!)ijs
+*rt6urru7!Y5eM%!<)rt!<3#u!!)<`rrN3$jPKn@/caK&3rmJ'rt-"HlMplu!!*'!('*Y"s(MH5
+q>V"+!36'6Gn0->(]`^us!Ig"rr3ON!2BMn!!)<as(_V%rrE,\qu?Zrrr;uurVlpH!87AO!cn@9
+qZ$Qqrr3$A!9!kV#>Y?&s8N'!lM1DZ!<)rs!!+V3r;Zcss8N-B!9!kV##>6%ruM0squ?Zr"2kHf
+me?_]!;_NO!"411LfsccI#*S^!&48*#C6@jLkl'3HM`Nu!<%]T'``@TL^-'C<euP3!.Fa#!!%TM
+V>gRJs7XtGOT>5X<Ib~>
+r?qgK./t^qr?q[Gr[7dHr?qaI.0'5o!rj\Kr[@gH!@\!H-ij;G-ij;H-ij;D-jK]"./t\Ds8",G
+s!T;qr[7mK-n,,n-ij;@-ij;E-ij;H-jou&./t^q./t^q./s6t."Ndt."NcJ-rj9lrr_1_!dXS@
+rr<D_s8W&u!rr9W!7:`F#5S<(s8N'!rVultrr;uu!8%5M"`+/>0p:AOru4$#`rGi<#Q"K#-NMp$
+s8)crs8OGHg].<N!!)ip&GcG5s1pD5,6'J#ci=#0!5AI4'E%n7s8N'!g].<N!!WC=!!+g;h>[HS
+!<3#u!<)p!56/FsrrW-!"oA9!!<3!"1]Yo%rs/B##64]'!8%#GrrDrr"5m>aH2[dC!<<'#1]Yo%
+rs&<"#6-:Udej(E!!5aqT_ABc!;_NO!"3t+Lkbs1G)1s0!!3(T!a$NLrW!3)Lkn(l!?+^VreURS
+rJ1M!!+l.c#DW9]Lkl$2F8Lan!.k0HrrJ)Yp=oeB!;fbrJ,~>
+rDa"#<W?)!rD`jtr`&surD`q!<WE"t!rl:#r`0!u!EK0u<<3't<<3'u<<3'q<<iJ'<W?'!s8#^t
+s&E)!r`'(#<E9(s<<3'm<<3'r<<3'u<=8b+<W?)!<W?)!<W<#L<In/$<In0L<R1UIrp$#1h"^pL
+L^O%Zs8Ih2s8S+8qYpL!qM:13s+lL0s8RoSs8RlTqu6U!R>?["deMi%*<$EKo)J7]%fZM.$39i#
+s7QEms8NE+p](9e!!)ip&G,u5s'C"t;u[:-o`+q%!:^!f'D_\:s8N'!p](9e!"/`O!!,cbnG`If
+!<3#u!<)p!%fl+urrW#s$i9o'!<3!"%06&"rs//r%KHG.!;?3frrDus"T?^u"1.t+rrE*!!Y#/%
+rr32p!"Jr9!;-0grr<*?#grAG!-e;>rr<Z*s8Vus!;HNnqu?m"s8@a*$2so1!WW0F!!,cbnG`If
+!<)p!%fl+urs/B#$ig5,!;?<i!-a"oV>gRQs7Y.LRK34b<Ib~>
+rHADEGQ2merHA8Arc\ABrHA>CGQ7Vc!rmKErceDB!I+SBG6%[AG6%[BG6%[>G6\(kGQ2l2s8$pA
+s*&\erc\JEGBa)bG6%[:G6%[?G6%[BG7+@oGQ2meGQ2meGQ.VnGCashGCar>G?%Ygrri21&e*dp
+s8N'+r;Zff!"Ao-"p"N!rs$dL2#mRU!<)rt!<3#u!!)oqrrir6!G&>.ir98[#6jr'`W81#rt,D7
+qu?]M!!*'!"T\H"s4RGQq>V#P!BC*+bqH^/"p4Z$rs&Q!rr3Yr!%\*L!!)ors4RH$rt#/2A?G\,
+s8N)us8N)trrNE*q#:9pkl<71s8N)urrNB)qYpL"cN#g%rr<&rq#C?or;Qor]+PP3rVults8N-)
+!;c]p#1!9+rrrK"qu?Zr!Xp.;pAY*mqM>.O&Vc*tJH,\)LkpT^$&FCj4;.hr!!iX^L^=%^2-bk7
+M#RJRL]R\ZK`6c4HiOt=L]@F0qhP4PJcDSH!J:@FeHD!7qGgOG~>
+r?q[Gr[7jJ-n,#ns![jGs!RmIr?qaI-n,)p""=0t./j2F./a,F./j2G-ij;G-is>rqu?XDs8W!F
+s8W!Frr;^@!<;mDrr;sG!<<$H!rj\KJLH'tJLH'tr$_SFbl7b;!!rB"rrE#trrE*!!XSl&rVm$$
+!rr9#!<)rt!<3#u!!)oqrs&:E*rl9CHfP,+m.p\cF8u7C!;c]prrE*!!X&N"rr;uuq#:Y)!4c'V
+n-Jag$i^/8#lk&0!W`9$!WW0"!;c]p%0-G/q0=%^!!@TJrr<&us8N)trs/o2!s8T*!!!&rs8N)u
+rrNK,q>L<t!!<3#!!)oks8N)qrrVin#lXf'!<<'##lsf"rriB(rriE#qu?Zr!YkcopAY*mqM>.O
+rJ:IRrJ:IRs+h@t!#]j4L]@F2LkS,,!!!'eLkl$2rJ1md!!33&!<<*#Lkl$2LAQc,!.k0HrrJ)Y
+p=oeB!;fbrJ,~>
+rD`jtr`'%"<E8tss&K$ts&B(!rD`q!<E9%u"',A$<W2ss<W)ms<W2st<<3't<<<,"qu?Xqs8W!s
+s8W!srr;^m!<;mqrr;st!<<$u!rl:#JQ78$JQ78$qGkc>!qhA2q#CAMrVunRs8N+VM#@8VLl)03
+Lku$0s+p[Ss+pXR#5GTfLkpuCj8T,-q>_5Xs8N*"rr<#t!!*'!!<E-!s8Duuq#:X9!:CQXh@T&S
+(B4=T!WW<)!W`9$!WW0"!<3#urW!!!mpQh/!!]Y,rr<&us8N)trs/Z+!s8T*!!!&rs8N)urrN9&
+rr2p&rW!'#rr<&uq#C?oqYpW]!##81rrE*!!WrH%rr30$!!E6%!;c`q!!3<,]_;@*GP_@>!<)rt
+!<)rt!<<'5AcQN*rr)lts8VOr&c_n9YQ+V&!<)p,!WW<)!W`9$!WW0"!<2lq!-a"oV>gRQs7Y.L
+RK34b<Ib~>
+rHA8Arc\GDGB`ubs*+GAs*"JCrHA>CGBa&d"*achGQ%R@GPqL@GQ%RAG6%[AG6._fqu?Y>s8W"@
+s8W"@rr;_:!<;n>rr;tA!<<%B!rmKEJTlZhJTlZhr-/0@bl7aB!(cnbrrE#trrE*!!<E3!rs&5u
+$NL,+!<3!"rVurts8N)trs$eD#QOi@i8ah;F8>k>m/R(d!<3!&q>^NqrrE-!rrW#s!;QR#$NTr/
+n9dR/!*fI&$ip>1!s/K'!!E9$!!*#u%f-//s3FCF!!!hns8N'!rr;uurVm-(!!<<)!<<*%qZ$Qq
+rr3!"!<)p%p]([$rr<&ns8N)qrrT(u8H&Sg!<<'"!<E)u"o&')rrE,rs8N'#!taPerr<&qM#RJR
+M#RJRM#RJTL_LX*:4A"Q!!%h2DCG\g!"=(-L]@GRL^X:a!WiB'!!!(VL]@GOL]@F+s/#_rK)bPp
+"H`]\<E4P~>
+V^MQFi[=g,JLH'tJLH'tr$_SFbPqSC!Vl]p!<)rt!<<'#1B>f$rs\`(#64]2!:p0iqu?`rs8N)q
+rr_//!!_K`!hfTOrr3b]!#kn;-NMp$s8)crs8OGHg].<N!!)fo$,Q[3"7c@)N;t=)rrOqUeG9.E
+!!V-Ws8)d"rVm,[J,ffRrr<&us8N)trrOqUeF`e@!<3!"1B>f$rs&<"#64]'!;HNn!;ZWq!!3&u
+rrE*!!]'i'rr33!!!`HV!7LcErr</`'EX0drr<&qM#RJRM#RJRM#RJTL^+OmFbkj-!!)qQ#BrQ9
+",Ma5!<%]T)ZXmRM#RJOL]@F+s/#_rN;rV,"J,Vj<E4P~>
+Vc<`si`-!YJQ78$JQ78$qGk`=!JlU-s8RoRs8RoTrrS4:qYpL'qM:13s+uR2s8VtPM#RGSM#.,R
+l*Z>-j8T0E!/UXS(5MrSs8NE+p](9e!!*'!$39i#s7QEmq#:Y,!3QM'qurhq?N0s+$iotrs8N'&
+p](9f!"/])#L?fY%KHG.!<3#u!<)p!$iotms8N)urrNW0o`"jpoDf@#rr<&ns8N)qrrW0"!r`0!
+!<<'#%06&"rs&)q%K?h:o_\[g!!C%@"MFL/!-e;>rrE#trrE#trrE*!#7(>(s8VWi!;uj%cX?e_
+s8N'!rVlp-!;60frrDoq!-a"oV>gRQs7Y.LRK34b<Ib~>
+Vfr.@icbD&JTlZhJTlZhr-/0@bl7b>!!rB"rrE#trrE*!!X8Z$rr3DR!&X`U!W`6"s5!_Urr;uu
+qu6fu^GGpJj8T0!!7CfG(,Z)cs8N6&qu?]M!!*'!"T\H"s4RGQq#:XI!2UG0nH2#V_Z'Q:"p"Pr
+s8N'&qu?]N!%7dG#l_Rq!&afV!!*#urrE#t!X8Z%o`+pkrr3$(!;c]p#1*?,s8N'!p](6nqYpWl
+!!rQ'rrE*!!X8Z$rr32L!&X][!;cTmrr<.]!taPfrr<&qM#RJRM#RJRM#RJTL^*t]L5:Y#!!)tR
+#`!"3!$$fN!!)tR!WrFWq2#%NqM5+OJcDSH!J:@FeHD!7qGgOG~>
+LF<0&JLH'tJLH'tr$_SFbl7b9!"8T%rrE#trrE*!!iuB!rr3Da!$D7@;?3Qns6'F_rr;uuq>UQr
+!!3)\rr`-/!QG'<(AS.9g&I?<D#aP#!!*'!Q2kb$s69Raq#:Zd!"'><s,70_A,cK0\,\tns8N'&
+D#aP$!#>G3#6"T'rr2rurr3$+!;HKm!k85!o`+pkrr3&$!)`aq#2]D&s8N'!p](6nqYpWg!"8c*
+rrE*!!iuB!rr32[!$D6A!)WRmrr<3%jq7`Qq#:<oqM>.OrJ:IRrJ:IRs+gmd!.'HWFoVO>L^/\8
+!JcI7!/1?-!b)-Uq2#%NqM5+OJcDSH!K@'Pg]X2Kqc-XH~>
+LK+?SJQ78$JQ78$qGkc>!qM/2q#CAMrVunRs8N/$Lt_k.%,-N<s8S4;p&G'RLku'1s+pLN!r[q3
+jSo>U"9S,mrtb,+"SVjM!71]Fbl@bDs"ON"s8U=D!;QR#ci>%4s8ODY!7:`F!aPenq>^Hp"jd5K
+c2]Tsrs&?#!rr9#!<3!"!s&<!rrQI+R.UFY!<3!"9)u3qrs#\-9`P+m!;HNn!;c]sirBnos8N*!
+rrPgnYl=Y,YQ.As8H>jhs8N'%s1ed@]_ML,GP_@>!<)rt!<)rt!<<'("9A8ts/5ntqu6ou!!<3#
+!s&<!rrQI+R/-d^!;c]qGCfdjrrIuVp=]Y<!;fbrJ,~>
+LN`auJTlZhJTlZhr-/0@bl7a4!+,I#rrE#trrE*!!ZqF#rr3C(!3Q;$$39c!s(;<3rr;uuq>UN`
+!!_Na"5*_[q>UC0`;pMHrtPP"s8Qg6!<<'6!:0[bC&e8/rs<08%upVh&I/=%rr3$G!7^iErr<5g
+s8Qm8Qi-jfm/R@jrr<&urrE-#rVlpF!7^Z@rrE&u!ZqF#rr31"!3Q;$!!)cnrrDoq!gs$prVult
+s8N-B!9!kV##PB&ruM0squ?Zr"TOG_&ENWd!!)kOrrE"RrrE"RrrE(T#6=g[LkmDY!;hQVIK0J+
+L]IMSL]S7jEVYFj!;_KO!.k0HrrI`Op=0;.!;]\qJ,~>
+JLH'tJLH'tJLLOudJjG*ZLRnB9*'D7s8N)ts8N*!rt>)V"f(nF.gEfhs31NelfVUT!<3#u!<)p%
+/#_n6\H!E+rrUmS'`@tGNW;EGmKX6JnnJ.)s8VKl%aX]\!!)fo$2b#.2uip-!!2$WruV)9!c?]i
+n@Mp)rr<%Tcgk3>NrLW.mejTq(B=C7!<3!.BE3ecs8W!p!c?]in@Mp$s8N)urs\ZP"f(nF.gEfh
+rr<&ns8N*!rs(6`nbpp0!IOeFrrE*!)YbccU\WLl#/L96.Kl(1l[f*9!!*'!jUqWPq>UEpqM>.O
+rJ:IRrJ:IRs+hsr!$[#<,QIh#L_j6EL1:2lLkmti7u)nVL+E?dFbYEW0o1Vc!;_KO!.k0HrrJ)Y
+p=oeB!;fbrJ,~>
+JQ78$JQ78$JQ;_MdJjHSj88f8Q\jVps8RoRs8RoTrt>'dNT9utNK3c5s29_sqs1PDM#RGSM#I>X
+X5NjOcA8.SrrShn0Dthb0*%[FeH-oVj\GjVs8UUN+m.l^!!)fo$2=Q%OT5?A!!;rpruUn_"HM[D
+kc7#Lrr<$qk2mfgec/7Sp%OdQ2#mRU!<3!"*!!kTrs8?I"HM[Dkc7#Gs8N)urs\9'$c;eX$OuP(
+rr<&ns8N*!rs)H?pA2WK!k\F2rrE*!)XRq@_Y_1X%IX8a$jj?<h-g9_!!*'!^'+YPq>UG=qZ$Qq
+rVultrVults8Nfr!.ape8H8bjs%9rspQkk:s8O&=_Z'QDpF$0)kPaVF63$rb!;c]qGCfdjrrIuV
+p=]Y<!;fbrJ,~>
+JTlZhJTlZhJTq,odJjGide`U:%0tths8N)ts8N*!rt<'M/(jZm"YBHKs#:"=qmr$m!<3#u!<)p%
+B$C,?@/tl>rrPLeNr8nl'EHkeNWE;RcA2H#s8S)[=n9jo!!)fo$/bgaeGoP-!!iH$ruTr,%]Agn
+hO#Yirr<%8o$7dNmf-nCqX7hmJcG`M!<3!"%055`rs7Bk%]AgnhO#Yds8N)ursZXG/(jZm"YBHK
+rr<&ns8N*!rs*JjqXgft#NYj`rrE*!)SZG+f_M9G/GT7Z"s_@hbW5_'!!*'!MujROq>UEpqM>.O
+rJ:IRrJ:IRs+hC!!*t:^9)nsJLc0+(Il%-oLkl99G5d:+FU8:UJ;/5E'SqPF!;_KO!.k0HrrI`O
+p=0;.!;]\qJ,~>
+s!WFlJP:VgJP:\is&IJH#2!H+!>%Ppp](6nrVultrr32rFWgo"9#pr2#QB]""?tiG!<3#u!<)p%
+fk)3*'3*fKrrQa3@/U$4jo>his49+2/'@nmrr32S2$>GQ!!)cn#B9a+s8VZj%K-5Hrh2Rg!YnD/
+s8N'!q-+(>L&_2+AfLjc<8ITS!!*#u%e!:/!<E0"rh2Rg!YnD/qZ$QqrVm)qFWgo"9#pr2rrDfn
+rrE*!#2!H+!>%Ppr;Zcsrr32rFWgo"9#pr2$1r'Q![*=!rr<&urr_<n!fHjS!!)kOrrE"RrrE"R
+rrE(T-&"Ad"!`!i!/QGQ2@ffq/Tur+Ik1p-!/QGd<[%hN$Ro;9L]@GOL]@F+s/#_rN;rV,"J,Vj
+<E4P~>
+s&FVpJTu`jJTufls&IJH#2lYGLm"q%p](8LrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eQrrO)=_u0NB_Z1VTs/R@H5O\XQrr32',6L1"!!)cn#93a*s8V0\*;ogWqh[-<"<Lme
+s8N'!n3-q!X8i47;A'$MC%qZ-!!*#u%bElQ!<E0"qh[-<"<LmeqZ$QqrVm)b>S[DW?0V@grrDfn
+rrE*!#/*kH!>\PPr;Zcsrr32c>S[DW?0V@g$05/!"#$SPrr<&urr]n:"MFU2!-e;>rrE#trrE#t
+rrE*!-1k"?$X*6)!<<)6;A'$MC%qZ-f00TD!<<)rM)5VD*aZbarr<&qrr@7os/#_rM?!;'"I]>f
+<E4P~>
+s*'$^JXM(WJXM.Ys&IJH#,=Hm"!1t6p](6nrVultrr32A8e;.MG4tq8#PCds&9n$P!<3#u!<)p%
+V*PLm-\M?XrrNT/k5>5e?iXd<s+M3n>kn@"rr31V('e+?!!)cn#7U\)s8S2]EW#hWmW0f`#:ONG
+s8N'!asmNOfDklI5n!lDKDbcL!!*#u%]V2f!<E0"mW0f`#:ONGqZ$QqrVm)@8e;.MG4tq8rrDfn
+rrE*!#,=Hm"!1t6r;Zcsrr32A8e;.MG4tq8$,T%:#=-K4rr<&urr\,[&EN]f!!)kOrrE"RrrE"R
+rrE(T-#t(0$UBFH!/QG5,6e2a7YZ_T>8dVF!/QG\4Ve2('g$PoL]@GOL]@F+s/#_rK)bPp"H`]\
+<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcE4Z!-c-V!-a"oV>gRQs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcE4Z!-c-V!-a"oV>gRQs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcE4Z!-c-V!-a"oV>gRQs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7qGgOG~>
+s![UAs8Vfns8VHdrr:OL!7UQ?!7QK!JH16$JH5*<s![nIJcC<$\,QF.]ncXgJcDSH!K@'Pg]X2K
+qc-XH~>
+s&Jdns8Vfns8VHdrr;Zls8W*!!<;0]!7UQ?!7QK!JH16$JH5*<rDeFKJcE4Z!-c-V!-a"oV>gRQ
+s7Y.LRK34b<Ib~>
+s*+2;s8Vfns8VHdrr:OL!7UQ?!7QK!JH16$JH5*<s*+KCJcC<$\,QF.]ncXgJcDSH!J:@FeHD!7
+qGgOG~>
+s![UAs8Vfns8VEcs8VHd!7U66!7UQ?"4I5Mdt%LM!.b-$!:^'h.0!:us+13Zrr<&4L]@F+s/#_r
+N;rV,"J,Vj<E4P~>
+s&Jdns8Vfns8VEcs8Vfnqu?Tp!7U66!7UQ?"4I5Mdt%LM!.b-$!:^'f<It1$s0r".GJ4"VGCfdj
+rrIuVp=]Y<!;fbrJ,~>
+s*+2;s8Vfns8VEcs8VHd!7U66!7UQ?"4I5Mdt%LM!.b-$!:^'hGQ1Zos+13Zrr<&4L]@F+s/#_r
+K)bPp"H`]\<E4P~>
+s![15s8VEcs8VKerR:-6!7UT@!7UoI!7QK!JH16$JH53?s![nIJcC<$\,X&?JcDSH!K@'Pg]X2K
+qc-XH~>
+s&J@bs8VEcs8Vfn"TJH%s8W#trR:-6!7UT@!7UoI!7QK!JH16$JH53?rDeFKJcE4Z]6Ai+V>gRQ
+s7Y.LRK34b<Ib~>
+s**c/s8VEcs8VKerR:-6!7UT@!7UoI!7QK!JH16$JH53?s*+KCJcC<$\,X&?JcDSH!J:@FeHD!7
+qGgOG~>
+s!S$Ns8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts6fphdf@kj!<(CG!<1FJ!7UT@!n.,LrR:]F
+s3h,Odf9Bs!<1Gu!.b-$!.k4N.0!:us+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s&B4&s8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts6fphdf@kj!<(CG!<1FJ!7UT@!n.,LrR:]F
+s3h,Odf9Bs!<1Gu!.b-$!.k4L<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s*"VHs8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts6fphdf@kj!<(CG!<1FJ!7UT@!n.,LrR:]F
+s3h,Odf9Bs!<1Gu!.b-$!.k4NGQ1Zos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!RjIqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8VKermUWB!7UlH!n..urW)uI
+p&G*Ar;ZiHqZ$lM!7Lqs!7TEr!!(K!!.b-$!.t:O.0!:us+13$s+138rrJ)Yp=oeB!;fbrJ,~>
+s&B%!qu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8VKermUWB!7UlH!n..urW)uI
+p&G*Ar;ZiHqZ$lM!7Lqs!7TEr!!(K!!.b-$!.t:M<It1$s+13$s-<TbM?!;'"I]>f<E4P~>
+s*"GCqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8VKermUWB!7UlH!n..urW)uI
+p&G*Ar;ZiHqZ$lM!7Lqs!7TEr!!(K!!.b-$!.t:OGQ1Zos+13$s+138rrI`Op=0;.!;]\qJ,~>
+s!RjIqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8VHd!n..uq#CEDqZ$WFr;ZiHpAb3Bqu?`G
+qZ$iL!7Lqs!7UlH!7QK!JH16$K)kp"s&FXMJcC<$JcD#8!K@'Pg]X2Kqc-XH~>
+s&B%!qu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8VHd!n..uq#CEDqZ$WFr;ZiHpAb3Bqu?`G
+qZ$iL!7Lqs!7UlH!7QK!JH16$K)kjMJcC<$JcC<$Q2^lAs7Y.LRK34b<Ib~>
+s*"GCqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8VHd!n..uq#CEDqZ$WFr;ZiHpAb3Bqu?`G
+qZ$iL!7Lqs!7UlH!7QK!JH16$K)kpqs&FXMJcC<$JcD#8!J:@FeHD!7qGgOG~>
+s!S'Os8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs6fsde+`nCe,'+Fe,97He+WhB
+e,01Ge,'+Mdf@hsdf@kGrVurIJH16$JH1<&s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B7's8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs6fsde+`nCe,'+Fe,97He+WhB
+e,01Ge,'+Mdf@hsdf@kGrVurIJH16$JH1<&rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"YIs8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs6fsde+`nCe,'+Fe,97He+WhB
+e,01Ge,'+Mdf@hsdf@kGrVurIJH16$JH1<&s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!S'Os8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uum/R.8pAb3Br;ZoJ
+!7UoIs3p`C!7UfF!7UoI$I\tTdf@hsdf@hsrmQDuJH16$JcPg!s&FXMJcC<$JcD#8!K@'Pg]X2K
+qc-XH~>
+s&B7's8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uum/R.8pAb3Br;ZoJ
+!7UoIs3p`C!7UfF!7UoI$I\tTdf@hsdf@hsrmQDuJH16$JcPaLJcC<$JcC<$Q2^lAs7Y.LRK34b
+<Ib~>
+s*"YIs8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uum/R.8pAb3Br;ZoJ
+!7UoIs3p`C!7UfF!7UoI$I\tTdf@hsdf@hsrmQDuJH16$JcPgps&FXMJcC<$JcD#8!J:@FeHD!7
+qGgOG~>
+s!S*Ps8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs5O+Xe,B@HdfBHtp](<Cq>gNDrVurI
+rW!#K!7QK!JH16$JH5ZLs![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B:(s8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs5O+Xe,B@HdfBHtp](<Cq>gNDrVurI
+rW!#K!7QK!JH16$JH5ZLrDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"\Js8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs5O+Xe,B@HdfBHtp](<Cq>gNDrVurI
+rW!#K!7QK!JH16$JH5ZLs*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!W^(!7QK!JH16$JH5ZLs![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FmU!7QK!JH16$JH5ZLrDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*';"!7QK!JH16$JH5ZLs*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!W^(!7QK!JH16$JH5ZLs![nI_#OE7S,`Kgg&M'Po`+pkq>^HpaT)8?mf3:err;uuq>^HpSH&Th
+f)GmNKdI!(lMpkaP5bQAs7Y4NScJXf<Ib~>
+s&FmU!7QK!JH16$JH5ZLrDgZ5s+m0ErrCaPrrD]krrDlprrC.?rrDKerrE&urrDlprrAShrrCXM
+"SldO!s%WdrrA5^!K$jMg'!iEqc-XH~>
+s*';"!7QK!JH16$JH5ZLs*+KC_#OE7S,`Kgg&M'Po`+pkq>^HpaT)8?mf3:err;uuq>^HpSH&Th
+f)Gm5<"o?5lMpkaP5bQ7s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nId/WtCp](6n\,ZI.r;Zcsmf3:eo`+pkkl:Y_o`+pkq>^HpkPkSR$i9o'
+!:Bgd!:Kme!<3#u!;ZZp!71]F!7:cG!7q/PUB"Tml2Ub`s8N;\FXm\&/qoep!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5EqhY"Hs+n/arrDusrrDKerrD]krrD9_rrD]krrDlprrD6^!T=jks8N)d
+s8N)es8N)us8N)ps8N)Fs8N)Gs8N)MrrYmoT_dpQrrE*!#013r!t@>aS,WMGs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/WtCp](6n\,ZI.r;Zcsmf3:eo`+pkkl:Y_o`+pkq>^HpkPkRA?2FU$
+!:Bgd!:Kme!<3#u!;ZZp!71]F!7:cG!7q/P*WX.Xl2Ub`s8N;-;AK?K9"pep!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nId/X+GoDegj\,ZI.r;Zcsmf3:eo`+pkkl:Y_o`+pkh>[Mh2u<RS!:Bgd
+!9sO`!;ZZp!71]F!7:cG!7q/O*<>Ngrs'd0g&'uX!'HeO!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5Es+p:Hs+n/arrDusrrDKerrD]krrD9_rrD]krrCmT!F1Z]s8N)ds8N)`
+s8N)ps8N)Fs8N)Gs8N)MrrNE*qrIb^4JLs9gJ.`mSGrVHs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/X+GoDegj\,ZI.r;Zcsmf3:eo`+pkkl:Y_o`+pkh>[L%e,'+E!:Bgd
+!9sO`!;ZZp!71]F!7:cG!7q/O"9AG^rs)N0meb-L!5G'(!J:@FeHD!7qGgOG~>
+s![UAs8Vfns8VHdrr7NLnc/[=JH16$JH3Ugs![nId/X+GoDegj\,ZI.r;Zcsmf3:eo`+pkkl:Y_
+o`+pkh>[L-^A@m0!:Bgd!9sO`!;ZZp!71]F!7:cG!7q2M!8d_WqZ$bhrrJ)Yp=oeB!;fbrJ,~>
+s&Jdns8Vfns8VHdrr;Qis8RZN!7QK!JH16$_uTa9d/X-%oDeiH\,ZI.r;Zcsmf3:eo`+pkkl:Y_
+o`+pkhZ!ZU%.O,nrrDHdrrD<`rrDlprrCCFrrCFGrrCXMrrCpU!qcO!SGrVHs7Y.LRK34b<Ib~>
+s*+2;s8Vfns8VHdrr7NLnc/[=JH16$JH3Ugs*+KCd/X+GoDegj\,ZI.r;Zcsmf3:eo`+pkkl:Y_
+o`+pkhZ!ZO#Pe/qrrDHdrrD<`rrDlprrCCFrrCFGrrCXMrrCpU!n@8lSGrVAs7XtGOT>5X<Ib~>
+s![UAs8Vfns8VEcs8U^O!7TX%!7Sjd!7UN>!7QK!JH16$dfBCrs&IGGrrDZjrr<6$HkH`[o`"jp
+p3._c&kpIIs8N)ts8N)us8N'+p.GMfqgp4##rIt-s8N)ss8N)ts8N'%q-OCEM#RDYfes!bbl@bC
+rs84P(]t^kq#CBk!<<''r/EB:$pV;urs%.7"Y@mu!<3!&r/EB:$pV<%s8N'%q-OCEM#RGS!<3!&
+o8"4c)eo*Hs8N'&rHo4a:%\Da!UL?ns8)frrs&1@,6ecSb5));!!N+)#T/Bss8N)ts8N)us8N)u
+s8N)urs%.7"Y@mu!;ZX!o8"4c)eo*Cs8N',rHo@kBE.jM(CF(9rr39%NA(YI5IpgoqZ-Zr#4mWf
+!uktLq#C?o"SlC1(l81k#4mWf!uktLrr3i.E?56(L]@AS!<<)e)$Hf9s7;$`!uktLrr32Q2$GPV
+!!*#u#5jH7#n0&/qZ$Em#QOLA,6ecSb5VG@!!;je"8`&t!;c]sqZ$hjrrJ)Yp=oeB!;fbrJ,~>
+s&Jdns8Vfns8VEcs8VZjs8W*!s8VEc!7TX%!7Sjd!7UN>!7QK!JH16$dfB>Hd/X-%oDeiH"oPZb
+O1G8hrs&/'PDPL1pAY*lM#IARM#RGSL^NdHM#[@_QALX"gZ&85!;uls!<)rt!!MgY"=:5Mrs#VO
+"@DVY!<3!(k@Y8.-%l3ss8)frrs&4?,6e`Vh>.'TXs=-:nGiRgrs&4?,6e`Vh>[HS!!MgY"=:5M
+s8N)urs%Y!%L"/2rr2rt!!W1&#nLbKrVloI+o;69!<<''l!>2/(glV)s8N'%nNm@)Y5\J$!<)rt
+!<3#u!<3#u!<3!&Xs=-:nGiRbrs%Y!%L"/2rqZTo!"8U/%iC*%oiVh;E;ok:#krHd"qa\fs8Vrr
+s8N;dB+>(kKDtZGrr<2l63JU;rr32cB+>(kKDtlM)!+p8">-MNrr<'!s3h/Yf)Pd5B+>(kKDtlM
+#,iaL6Lk*Vrr32sFX%)&:u2!JqZ$m$l!>2/(glV.s8N'#kV3,7s8N)qrrVlo$_74tM?!;'"I]>f
+<E4P~>
+s*+2;s8Vfns8VEcs8U^O!7TX%!7Sjd!7UN>!7QK!JH16$dfBDls&IGGrrDZjrr<5b63S6drr2p%
+a@m3N,^B(_s8N)ts8N)us8N'+],h"QgJemh'NNT@s8N)ss8N)ts8N'%bU`rWg&D!UL_pG+q#CEo
+rrpqH#RE2[rr;iqs8N;\>o<b_BCblu#)F*&@/0d&rr32[>o<b_BCc'%rr<2G/-\&drr;uurr3/P
+9F(nZUAb,l!!VLO"W<=!rVln;HM[[=!<<''a@m3N,^B(Zs8N'%bU`rWg&D$O!<)rt!<3#u!<3#u
+!<3!&L_pG+q#CEjrrpqH#RE2[q#C?o$Kjha+gD!u5RAEqrVm/\>o<b_BCc*&qZ-Zr"k?9P#Vr.K
+s8N'%bU`rWg&D!TeP$5S18=aI(W8fQ#=$E3rr<'!s.BH=n,NF<9F(nZUAb)rJeeZ#q#CEors%@d
+)$Cgio(rC`!!iPF9G.OTGk_4;rr<,4*Wc-;rrDoq!n[K*SGrVAs7XtGOT>5X<Ib~>
+s![15s8VEcs8UaPrR9O%!7Sjd!7UN>!7QK!JH16$dfBCrs&IGGrr<-?"!WZts8N'5Qb3'O!'(#Y
+pau`Epspku_uK`:!<)rt!<3#u!"+8"ir=Q0=6KM7EoR-!!;uls!<)rt!#UR;nPoUQs6g4&c1,EH
+!<<)o(9.-!MZ>U5s8N)trs8Km"Hi?>8-H<ss!mIC%F+EU!!*'!qa^jPo]JaJ[/^.+!/\tj<<89_
+rr<'!s7dA/q=':B2#dOT!!S_$q2554rVlo!7JZu`!<)p'pau`Epspku_tsE5!""M,nPoUQs8N'!
+rVultrr;uurr;uus8N>m#S#&KB)hr.rs/<7WVQ%A!&XNOrr<t)\,)9gAn\[MP5mlJs8,=iOn@g-
+"LS4/!!)ut#P](6q=':B2#.+N!'c=bnPoUQs7dA/q=':B2#mUN.Kl%.l@K!8!!*&j.0QIHs7dA/
+q=':B2#mUC"qT)OD?'\:s8,=iOn@g-"LS%*rrE&u&,7a\UA3:g#/gK@!!%Pmiqi]T!;lcul[]+Y
+SGrVKs7Y4NScJXf<Ib~>
+s&J@bs8VEcs8V]ks8W&us8VHdrR9O%!7Sjd!7UN>!7QK!JH16$dfB>Hd/X-%"-AD3g%YOHL_R2]
+qQ>Xms8VkTNT0orNK<l7s+lL0s8RoSs8Rl^WUf'KTSUbcr8t3Bs8N)ss8N)ts8N'9:ZURY!n[J(
+![$La9`P1ns6qGVr8qDfFoMF@!<)p'p)OCCq:->gkkkB0f)d&Tj@oUSs8Vd5#I4*T)$oI+rr<$p
+jQ%BafDkjN!<<)g.)u2I@/tHLs8N'&?.JRE!.k+K!C`p^s8N)trs8''$c2_U$4cS%s8N'*:ZURY
+!n[JP!!)utrrE&urrE&urrE*!#M0#!jQ'#8!;c^#n0l<Sk$\74q>^Hp)HtS_=TGuode6fDNW9%P
+*=&kFeJSYVs8N'!rVm,l.)u2I@/tHFs8N'`:ZURY!n[JA.)u2I@/tHMs6^:%[.rEas8N'!s5F@k
+eGoR<.)u2I@/tHMs3^rmk2oVC!<<)m*=&kFeJSYVqZ$Qqrr3Mt%L^,M^^:S@s8N'!7cV;\s8N)r
+rr_1["K.di!K$jMg'!iEqc-XH~>
+s**c/s8VEcs8UaPrR9O%!7Sjd!7UN>!7QK!JH16$dfBDls&IGGrr<-/#sm)8s8N'5@cuqt!7(WE
+_?MOBpRh[Cq#C?o!<)rt!<3#u!"*<,IfC,_YP.Y!1?/?6!;uls!<)rt!#TJ@bmasIs,mC`n]cji
+!<<)57b[dl/HE`gs8N)trs79d*m4Ak$R#0?s!j04<q4Fj!!*'!faJqEqmm.XpAb-m!,D&K%1)G&
+rr<'!s1UtVr7<M#`;]f:!!QipkTBlNrVlm=h"h!M!<)p'_?MOBpRh[Cq"k$j!"!E1bmasIs8N'!
+rVultrr;uurr;uus8N=e!ESa8L]@GOrs-8-gAKPS!6"^5rr<sCjm42lgem2",663ms4If%b58aX
++SPj8!!)ut#JN[]r7<M#`;'B4!'b5gbmasIs1UtVr7<M#`;fkO"sV7fb;oV&!!*&*"X<C7s1UtV
+r7<M#`;fjp!F#'@MZ<bWs4If%b58aX+SP[3rrE&u&&JN$fCtpA0DPSI!!$U"Ies*E!;uj"rQlf"
+gRS9EK)bPp"H`]\<E4P~>
+s!S$Ns8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts4RGSdf@kj!<(CG!<(CH!!1OKrmUiHrR:cH
+rR:H?rR:`GrR:cH!Rh&Je,B@Ge,B@Ge,KCKdfBBrrW)oGrr<)K!<1IH!<(CH!<(C@!!1OKrmUlI
+!Rh&Je,B@HdfBHtJH16$JH59As![nId/O;/a8==C!I4D>rr<C?s8V`l$NL..!)`aq#2T>&s8N'!
+rVultrr;uu!,;H4!XSk+hZ*TUr;ZcsrVult%Vu+El2VV"QN1h$s60L`qYpWq!!`H&rrE#t!k\M%
+rr3&c!#th8%$ps0s8V<`!<<)3!(Hne&F0<8s8N'!C]FG"!#GV7!!)lq!rW*'rr;uu"_n#:o`,?u
+rrW-;f(o@G!<)p!XT25trrV$W+Su-<!"!H@s69S"s8N'!rVultrr;uurr;uus8N=j!,MW7kl:_V
+rrW-!#5S<!!"`cBs7QErB)ho)!"/c+]DtD"rs%ch)uop<!;QQqr;[&ss8N'&C]FG"!#GJ3#Q4W,
+s8T)!:](1l!!E!V"JY_l&cD\6s8S;`Du]k'!!*'!]DtD"rrVKd)uBU7!<3!"XT25trs.B\+TMHA
+!,;6.rrE#trVus)OIQ7NN;rV,"J,Vj<E4P~>
+s&B4&s8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts7?<ks8N)ss8N*!rr`?%rr<&ss8E!"df@kj
+!<(CG!<(CH!!1OKrmUiHrR:cHrR:H?rR:`GrR:cH!Rh&Je,B@Ge,B@Ge,KCKdfBBrrW)oGrr<)K
+!<1IH!<(CH!<(C@!!1OKrmUlI!Rh&Je,B@HdfBHtJH16$JH59ArDh5E#.*^qiK&fSq#CAM$KhBg
+on\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<rr3%VM!*XprrDusrrE#trr<PSs8U=D1B0*0cN!pf
+!!)lq!r2g*rr;uurVlq/!2'8j!mgp4qu7'[!7(WEb5_PBs'l&$rr3PV!'pSa!!(=Es31O!s8N'!
+qYpWm!"Jr-rr<5Es8V<`'`S+6q?cijs8N)trrPjoYl=Y(XT2,ms8N'*cN!ph!&FTS!!)utrrE&u
+rrE&urrE*!#;Q;)s8U7B!;6?nq#Cm"s8N'1`rH))!"6gHs69S"s8QR/TDnipci??2rr<&orrVur%
+J]u'!!U[Js31O!qu6os!"Ju.8-#^fs8N'$m1K]Rq>V'&!"Ju.0*'E"s3L`Gs8QR/TDnilci??-s
+8N)urrPjoYl=Y-XT2,rrr<&Cq#C?orVuis!>E/9rrIuVp=]Y<!;fbrJ,~>
+s*"VHs8N*!s8E#ts8;rrs8N)ss8E#ss8E#ss8;rts4RGSdf@kj!<(CG!<(CH!!1OKrmUiHrR:cH
+rR:H?rR:`GrR:cH!Rh&Je,B@Ge,B@Ge,KCKdfBBrrW)oGrr<)K!<1IH!<(CH!<(C@!!1OKrmUlI
+!Rh&Je,B@HdfBHtJH16$JH59As*+KCd/O;ukk:bV"6TCYrr<Djs8Sho;ZHb=!9!kV##>6%s8N'!
+rVultrr;uu!:'R`!W`;^hZ*TUr;ZcsrVult%dO)oCB0b%('*Y"s(MH5qYpWX!&jiVrrE#t![e!$
+rr3%@!2BAj$l/j.s8Qd5!<<'H!87AO&9@iGs8N'!lMpm"!1<fd!!)lq!os>>rr;uu"mQ'eUB"3k
+rrVHpqt^9l!<)p!*rt6urrPsrY581u!"%rjs(_V%s8N'!rVultrr;uurr;uus8N<>!:'UaB`J/+
+rrV6]2YmCQ!"eAos/>u2kl:[]!*]F&-NMj!rs!NEUAt5n!;QQqj8_+5s8N'&lMpm"!1<Z`#NPkC
+s8O,?hY[?Q!!C.F+R](*&``pMs8Nf6m/R*'!!*'!-NMj!rrR6AUAFoi!<3!"*rt6urs)="Y5eM%
+!:'@ZrrE#trVusLjdZ8NK)bPp"H`]\<E4P~>
+s!RjIqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8UaPrmUWB!7UlH!n..ur;ZrK
+!!(LI!!:ULe,97Kdf9Bso`,!@r;ZoJ!7UlH"4I5Me,B=Kdf@kq!!:ULe,97Kdf@kGrW!#K!7UlH
+"4I8!e,B=Kdf@kq!!C[M!7UT@s3prI"4I8!e,B=Kdf@kr!!(K!!.b-$!:g-i.0!;krrVEb%f$)(
+!".T_s8E!"s8OnUd/O%Lq>^a"rr<&ts8N)us8N'!fDbdRC]FJjP25*srrDusrrE#trr<P`s8Vrr
+"ofqMg].<N!!*#u!i7pfrVup!rr;uurVlp`!5AI4!rW*&qu7'P!8IPRqZ$Wrs$$Ltrr3Q.!!WE&
+!!(dRs8)d"s8N'!rr3%r3Y),h!!3*!rr<5Zs8W&u!ri3#jV@RjrrE#t!]0o(rr3&r!!`<"rr<A[
+s8Vrr"onT&!<)rt!<3#u!<3#u!<<'(-NMp$s8)crq>UMm3Y),h!!2oqrr<Ves8W&u!8dbUrW!$"
+s$$Ltrr33$!!WE&!!)rs!i7pfrW!!#s8W#trr;uu$JYU\qZ$g"s.qadrW!*&s8O\Odej(E!!5aq
+T`"fkV)f+c!"T,1s!@a$s8Vus!<<'`!5AI4!rW*&qZ$Qqrr3$V!7:`F#PnE)s8N'!fD,CG!;lcu
+i*$2-SGrVKs7Y4NScJXf<Ib~>
+s&B%!qu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8V`ls8W#ts8W#tqu6j#s8N'!
+s8W&urmUWB!7UlH!n..ur;ZrK!!(LI!!:ULe,97Kdf9Bso`,!@r;ZoJ!7UlH"4I5Me,B=Kdf@kq
+!!:ULe,97Kdf@kGrW!#K!7UlH"4I8!e,B=Kdf@kq!!C[M!7UT@s3prI"4I8!e,B=Kdf@kr!!(K!
+!.b-$!:g-g<QtIEjbT5ts8Rl^qu?]qLl)03NemQ2rs&=UNrT-8M#IARM#RGSL]I>OrrngHLo\u!
+iW&oXr;ZcsrVult'_hY-p&GI"$39i#s7QEms8W%R/IDCV!!3*!rrE#t!Y5;#rr3&r!"8]($jm"/
+s8Vcm!<<'0!:^!f(A\"=s8N'!p](9e!"/c+!!*'!rJ3$3rVup!rr;uu"o&&squ?iurrKngq#C?o
+rVlp.!;-9j!qZI%qZ$Qq$2=K"p&GI"rr<&ts8N)us8N)us8N*!rs&l2p](9e!!)lq"9"$-$2so)
+!Vucq!"eo)s82isp](9k!!N?%%fl+urs&<"$ig5,!<)p"rJ3$3rW!!#s8W#trr;uu$MXT#p&GI"
+rJ3$3rW!*&s8NH,o_\[g!!4,GdJa(IrJ3$3rW!H0s8NB*p](9f!!*'!%fl+urrW#s$i9o'!<3!"%
+06&"rs//r%KHG.!;?3frrDus"T?^u"1+Nt!K$jMg'!iEqc-XH~>
+s*"GCqu?Wqs8W&us8W*!s8N9's8N'!s8Vuss8N9's8N'!s8W&us8UaPrmUWB!7UlH!n..ur;ZrK
+!!(LI!!:ULe,97Kdf9Bso`,!@r;ZoJ!7UlH"4I5Me,B=Kdf@kq!!:ULe,97Kdf@kGrW!#K!7UlH
+"4I8!e,B=Kdf@kq!!C[M!7UT@s3prI"4I8!e,B=Kdf@kr!!(K!!.b-$!:g-iGQ1[errR*=F85e8
+!"/Z(s7--us8N9'qYpL!cN#g%rr<&ts8N)us8N'!qu6U!&-)`AXngrUrrDusrrE#trr<c1s8UdQ
+./sGNqu?]M!!*'!pM_>]rVup#rr;uurVlp(!;QQn!pK\8qu7'.!;lfrg&M-Qrs&Q!rr3bu!%\*L
+!!)ors4RH$s8N'!s8Vh4,6n,I!!E6#rr<6#s8VWi%0$8->*A[\rrE#t!X8Z$rr3&G!&XQPrr<B&
+s8UdQ.0';I!<)rt!<3#u!<3#u!<<'("T\H"s4RGQqYpZlE$GSd!!!,ss8N'1r;Zff!!)rss7-.$
+s8N<(q#:9tkl<76rr<&trr`"7,6n,I!X&K&r;cisrr<E's8UdQ.0'$\,6n,I"U"f)"p"Mss8N'#
+$m+g7rr`"7,6n,I%g2k3"T\K#s4[MRs8N<(q#:9pkl<71s8N)urrNB)qYpL"cN#g%rr<&rq#C?o
+r;Qor]+PP3SGrVAs7XtGOT>5X<Ib~>
+s!RjIqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8U^O!n..up]1?Cr;ZiHq>^NEqu?`Gr;ZrK
+!!(L?!<:OH!!(LE!!(LG!;k4F!;k4G!7UlH"Od>Ne'n6q!7UlH!n..ur;ZrK!!(L@!!(LH!!:UL
+e,97Jdf@kr!!(K!!.b-$!:g-i.0!;krrW-!!r2fq!<)rt!<<'##lsf"rriB(s8N'!rVultrr;uu
+!;lcq#5NNd!!!+Jir9&_!;l`p!<<0!s8N'!qYpKu!!3*&!;c]prrE*!#IXUcfDPXK!<3#u!<)p'
+#lk&0!W`9$!W2lu"9A;ts8N*!rs]87!s8T*!!!'"rr<&qrr3K/!WW0"!<<)-!&)t%rr<&us8N)t
+s8N)urrJBdq#C?orVlp*!;ZTn!<<2ts8N'!qYpKu!!3-"!!)utrrE&urrE&urrE*!!X&N"rr;uu
+qYpf/!&)t%rr<&ps8N)ts8N)ts8N*!rsT26!s8T*!!!'"rr<&trs?+60A$.%!!*'!r;cisrr<&q
+rr3K/!WTS.0A$.%!!*'!"T\Jts8N'#'`s9krsZ=90A$.%!!*'!"9A>us8N*!rs/o2!s8T*!!!&r
+s8N)urrNK,q>L<t!!<3#!!)oks8N)qrrVin#b:nqN;rV,"J,Vj<E4P~>
+s&B%!qu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8Vcms8Vuss8W#tqu6j#s8N'!s8W#t!n..u
+p]1?Cr;ZiHq>^NEqu?`Gr;ZrK!!(L?!<:OH!!(LE!!(LG!;k4F!;k4G!7UlH"Od>Ne'n6q!7UlH
+!n..ur;ZrK!!(L@!!(LH!!:ULe,97Jdf@kr!!(K!!.b-$!:g-g<QtIErJ6@+s8RoRs8RoTrrIt4
+r;QqVM?!U3M#IARM#RGSM#I>XppH3>Ll:!HrrN3$rr2p!rVuuts8N'9rr<#t!!3*#!<3#urVuru
+s(27EjSo,Y!<3#u!<)p'!WW<)!W`9$!W2mH!<E-!s8Duus8N-#!s8T*!!!'"rr<&us8W&u!WW0"
+!<<(2!,1HmrVurts8N)ts8N)urrFmgq#C?orVlp$!<2ut!r`0%qZ$Qq$3'u)rW!!!rr<&ts8N)u
+s8N)us8N*!rs&Q)rr<#t!!)lq#A*sLjSo,Y!;ZZp!<)rt!<)rt!<<'-!WW<)!W`9$!WW0"!<)p(
+AcQN*rr)lts8W#trr;uu')qq2rW!!!AcQN*rr)lts8N*"qZ$Qq!X/_>rVmjL!,1HmrVururrE-!
+s8W&u!<<'#!!<<)!<<*#qZ$Qqrr3$%!<2ut#Q=]*s8N'!rqQNn!;c]skl;?drrIuVp=]Y<!;fbr
+J,~>
+s*"GCqu?Wqs8W&us8Vuss8W*!s8W*!r;Q`squ?Wqs8U^O!n..up]1?Cr;ZiHq>^NEqu?`Gr;ZrK
+!!(L?!<:OH!!(LE!!(LG!;k4F!;k4G!7UlH"Od>Ne'n6q!7UlH!n..ur;ZrK!!(L@!!(LH!!:UL
+e,97Jdf@kr!!(K!!.b-$!:g-iGQ1[errVKd&GZ;*!<)rt!<<'"!<E)u#5A0*s8N'!rr3'!!!*#u
+rrE#t#1$!L!!!hnir9#[!<)p!qZ$cts8N)urrr6!"oeT'rr3E'!!*'!/-(k#s7lWprr;uurVm-(
+!!<<)!<<*%qu6Zt!<3!1q>^NqrrE*%!s/K'!!E9$!!*#u&GcA1s8N'!s8OVMP3r;F!!*#urrE#t
+rrE&u!>X\js8N)trrE-#rVlro!"/T&rrE&u#5S<'s8N'!rr3'!!!*#urrE&urrE*!!<E3"rrW#s
+!;c^#/-(k#s7lWpq>^HprVultrVults8NK.!!<<)!<<*%s8N'!rVm0T!0ZaLq#CEps8;rss8N)u
+rt"r+"og+RP3r;F!!*'!!<Durrr<*&&ENfi$S2:@mJlt^!<<'"!<3!-q>^NqrrE*%!s/K'!!E)t
+rrE&u!<E3!rs&5u$NL,+!;HNn!;c]sVZ98XrrI`Op=0;.!;]\qJ,~>
+s!S'Os8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs4RJOe+E_@e,KCJe+s%Ee,01G
+e,97Kdf9Bsnc8^=rr<&Jq>^NEqu?`GqZ$WFqZ$WFr;ZiHr;clHrr<&Jr;ZoJ!7UlH"4I5Me+E_@
+e,B=Kdf@kq!!:UL!<1Gu!.b-$!:^'h.0!;krrW-!"8Mor!<)rt!<<'#1B>f$rs\`(#64]2!:p0i
+qu?`rs8N)qrr_//!!_H_!\+3&rr3&s!!W?$rr<njs8Vrr"ofqMg].<N!!*'!+TU9ss7lWprr;uu
+rVlpS!7^]A$mu&0s8Vrr!<<'S!7^iErr<_es8Vrr"onT&!<<'B!8IPRq#CEos8N)ts8N*!rrW'-
+kkP2X!<)p!1B>f$rrW#s#5\B"!"[ias8)d"s8NH,o)Jaf!!*#urrE&urrE*!#:BN+s8Vrr!;c^#
++TU9ss7lWpq>^HprVultrVults8N-U!7^iErrE#t#9a*%s8Vlp!;QTo!#+,es8)d"ruhBss8Vlp
+!<<'P!7LcErr</`'EX0krtZaXg].<L!!*'!,lld$s82iss8OhSeF`e@!<3!"1B>f$rs&<"#64]'
+!;HNn!;ZWq!!/Vi!K@'Pg]X2Kqc-XH~>
+s&B7's8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs7QHms82lss8;rts8N*!rs/W)
+rr<'!rr<&te+E_@e,KCJe+s%Ee,01Ge,97Kdf9Bsnc8^=rr<&Jq>^NEqu?`GqZ$WFqZ$WFr;ZiH
+r;clHrr<&Jr;ZoJ!7UlH"4I5Me+E_@e,B=Kdf@kq!!:UL!<1Gu!.b-$!:^'f<QtIErJ6@+s8RoR
+s8RoTrrS4:qYpL'qM:13s+uR2s8VtPM#RGSM#.,Rl*Z>-ir9&e!;?El!qlU%rVult)#+(1pAbR#
+$39i#s7QEms8N?)p](9a!!*#urrE#t!Xo)%p&>F-!;HNnp&G*mrsSo#q>^Hp'DMP,pAbR#rr<'!
+rs/W!s8VWi!<3#u!<)rt!<<'#p'CNis8N)trrNW0o`"jloDf?ss8N'0p](9f!"/c+!s&9!s7ZKn
+rr;uurr;uus8N<2!;HNnp&G*hrs&f0p](9a!!)iprrE#trrE#trrE*!!Xo)%q>^HprVm*.!;HNn
+nc/[bs8N'4p](9f!"/`3!;HNnnc/[irsSo"qu?Zr"2P-D]`.pH#QXW!s7--is8NB*p](9f!!*'!
+$iotms8N)urrNW0o`"jpoDf@#rr<&ns8N)qrrW0"!hB8kM?!;'"I]>f<E4P~>
+s*"YIs8N'!s8W&us8W&us8Vuss8W*!s8NB*s8N'!s8N*!s7u`qs4RJOe+E_@e,KCJe+s%Ee,01G
+e,97Kdf9Bsnc8^=rr<&Jq>^NEqu?`GqZ$WFqZ$WFr;ZiHr;clHrr<&Jr;ZoJ!7UlH"4I5Me+E_@
+e,B=Kdf@kq!!:UL!<1Gu!.b-$!:^'hGQ1[errVHc'DVV-!<)rt!<<'#"p"N!rs[6S2#mRW!<3#u
+h>dQTs8N)rrri>91]TDmrrN?(qu6Tsf)R?"s8N'9qu?]N!%7dM!;lfrg&M-Qrr`?"s8U(=!<3#u
+!<)p!"p"PnrsT&2qu?]M!!*'!"p"Prs8N'4qu?]N!%7gH!!*'!"9AB"s2G$=rr;uurVults8N/P
+)#a70rrE#t!X8Z$rr3&H!&XQPrr<T,s8UgR-ia2J!<3#uh>dQTs8N)us8N*!rs&]-qu?]M!!)lq
+#6Y&)s8U(=!;ZZp!<)rt!<)rt!<<'#"p"Prs8N)trs&Z,r;Zf:!!)forr<`0s8UgR-iX;Lr;Zf:
+!!*'!"p"Mss8N'$NWTjRrr3`:!;uls`W-#=rriE#s8UjS!<<''!;lEgrrE&u!X8Z$rr32L!&X`U
+!!)cnrrDoq!r)a$SGrVAs7XtGOT>5X<Ib~>
+s!S'Os8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uufDkp#pAb3Br;ZoJ
+!7UlH"4I5Me,01Ge,97Kdf9BsrVurIq#CEDr;ZoJ!7UlH"4I5Me,01Ge,97Jdf@kq!!:ULe,97J
+df@kq!!:ULe,97Jdf@kq!!C[M!7UoI!7UlH!7UoI!Rh&Je,KCJe,97Jdf@jJ!.b-$!:Bje.0!;k
+rrV9^');M,!<)rt!<<'#X8l,srs[cb+92@=!2]_qkPtV^s8N)prr`6#!WM-Z!h97+rr3&b!#Y\7
+rr<mPs8VBb(&sR"D#aP#!!*'!&HLnls4mYTrr3$+!;HKm!k85!p&>Gd!,V]8l2Uhas0r%tq>^Hp
+'5[^KlMq\"rr<'!rt,7ls8UmT!<3#u!<)rt!<<'"h&H+g!XSl$rr3&$!)`aq!oEu"qZ$Qq%rD:G
+lMq\"s&&ins8V9_!<3#u!<3#u!<<'(Q2kb$s69RaqYpd4!9F1[h#IHNs8N)ts8N)ts8N*!rrT\1
+7JZrb#ls`!rs',9jT#89!!)forr<^Ks8VBb(&njGjT#89!!*'!WrPuns8N'>s5jpqMZ<\g!9F1[
+h#IHTs-!G&s8VEc!<<)/!(HP[rrE&u!iuB!rr32[!$D7@!!)cnrrDoq!qQC"SGrVKs7Y4NScJXf
+<Ib~>
+s&B7's8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uupAk6nqZ-Zr$3:,+
+!<<'!!<<'!r;ZZp!7UZB!7UlH!n..ur;ZrK!!(LG!!(LH!!C[M!7UoI!7U`D!7UlH!n..ur;ZrK
+!!(LG!!(LH!!:ULe,97Jdf@kq!!:ULe,97Jdf@kq!!:ULe,97Kdf9BsrVurIr;ZiHrVuuJ!<1II
+!!(LH!!:ULdt%LM!.b.<!<#pArrV/8S,!$`M#IARM#[JVX,,L/rs[V;X8i3^M"UfJjbS`ls8RoN
+rrW.TM;nO:2uq8'rrUIG3;rmW!#X&^s3:U!s"ON"s8U=D!<<'%!;ZZpVuQhsrrN9&rVlfu>l^8b
+rsUU^ci=$i!!*'!>l^8fs8N'4ci=$j!&=NR!!*'!"9A8ts/5ntrr;uurVults8N,!621B\!s&<!
+rrPgnYl=Y(YQ.Ans8N'0ci=$j!&=NR'EIFus2P*>rr;uurr;uus8N<Y!71]Fbl@b?rs&Z,q>^Jn
+!!)iprrE#trrE#trrE*!!aPenq>UKu!<)os#6Y&&s8T"t!;QTo!#*]Ys3:U!rr`>ts8T"t!<<'j
+!3H(trr=)>^]akRs8N3%q>^Jn!!*'!0*'K$s3UfHs8Q@)R.UFY!<3!"9)u3qrs#\-9`P+m!;HNn
+!;c]sirBmcrrIuVp=]Y<!;fbrJ,~>
+s*"YIs8N'!s8W&us8W&us8W*!s8Nc5s8N'!s8N*!rr<'!rrE*!!!*'!rW)uufDkp#pAb3Br;ZoJ
+!7UlH"4I5Me,01Ge,97Kdf9BsrVurIq#CEDr;ZoJ!7UlH"4I5Me,01Ge,97Jdf@kq!!:ULe,97J
+df@kq!!:ULe,97Jdf@kq!!C[M!7UoI!7UlH!7UoI!Rh&Je,KCJe,97Jdf@jJ!.b-$!:BjeGQ1[e
+rrQd4KD>KH!<)rt!<<'#*rt6ursVa)XoJD.!;6BlB)hr2s8N)prrVQf#3,Xa(]`k#rrQs9SGiKf
+!#Y&%s(h\%rtPP"s8Qg6!<<'#!<)rt8cSkjrrE-#rVlpF!7^]A$l&d.s8Qg6!<<'F!7^iErr<_u
+s8Qm8QiI'c!<<'#!<)rt8cSkjs8N)ts8N*!rrGWgp\t6p!<)p!*rt6urrQ$tXnr(t!"\Dqs(h\%
+s8NE+p&G&)!!*#urrE&urrE*!#8I7)s8Qg6!;c^#!W`3!s%37kq>^HprVultrVults8N-H!7^iE
+!<E3!rs&T*rVumi!!)forr<_us8Qm8Qi@*erVumi!!*'!*WY'os8N'>s,@'kjT#5]!<)rt8cSkk
+rtGJ"s8R!;!<<'F!7^Z@rrE&u!ZqF#rr31"!3Q;$!!)cnrrDoq!gs$pSGrVAs7XtGOT>5X<Ib~>
+s!S*Ps8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs3:WCe,B@Ge,B=Ie,'.De,9:Ge+Wk@
+e,B@Ge,B=Ie,'.De,B@Ge,KCJe,97Jdf9CHe,KCJe,97Jdf9CHe,9:Ge,9:Ge,KCJe,'+Fe,97J
+df9CHdt%LM!.b.@!<4JI<RLgO0!+O=`@(hYq#C?orVults8N`,.KuUCf..'@s8U=D+m\;u!!*#u
+rrE#t"tQY?r4)eCir9;T'b%\Nj%TWPrVult(l6N/=TOQ_mKX6JnnJ.)s8S8_5P*`"!!*#u%VPis
+rVuoq;?C^ir:%=&qu8/6#7f)NC&e86s85arD;5!X]3G=8!!%i$nlZ!Rs8N'!s8S8_5P*`"!!*#u
+rrE#trrE*!!IJYWrsi]BLAh/PpaQHBq:@,$_#"*2!"Xn3nlZ!Rs8U=D+m\;u!!*#urrE&urrE*!
+#OVg,cgkfN!;c^#P5mi=hF%>Dq>^HprVultrVults8Nr6;?C^ir:%=&s8Qa4LAh/PP5mi=hF%>D
+q#C?o5D[YV=TOQ_P5mi=hF%>Ds8VjD"IA`HJcG`M!<<)\&d!sjP5mi=hF%>Ds8VHi&(0uf!!*'!
+r)*T5g\gQQ>PeC"!<3!,paQHBq:@,$_#OE7!;HNn!<<'(0XC6Idn9^gSGrVKs7Y4NScJXf<Ib~>
+s&B:(s8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs7lZps7u`ps8N*!s8N*!rrN3#s6Tgb
+e,B@Ge,B=Ie,'.De,9:Ge+Wk@e,B@Ge,B=Ie,'.De,B@Ge,KCJe,97Jdf9CHe,KCJe,97Jdf9CH
+e,9:Ge,9:Ge,KCJe,'+Fe,97Jdf9CHdt%LM!.b.@!<#pFrs,XbqYSs*Ms^<>s+pXRs+p^T').EG
+j8J"tNq`SR`/(Vol`u>&rr<"SrVm)&i;3>rLnNc-#iGk+df%T6"l]F[rr<m4k2mfgec4/$+m.l^
+!!*'!490p.a@Q@3rr3$>!5ea8#ko_MNp$B)X$QX_.b+SDk2fA=!<<)n-j5RnrTL:Js8N'!;!-m`
+!nI>N!!*'!490p.a@Q@3rr;uurVults8N*DchIG@*!!kTrs8!#$c;eX$OuP#s8N'0;!-m`!nI>N
+JH/[Ce6)bOrr;uurr;uus8N>S![6^f:B1Ckrs(XdJGR>Y!!)iprrE#trrE#trrE*!%JM7RNp$B)
+X$Qdc*!!kTrs(XdJGR>Y!!)forr>8[k2mfgec.`3JGR>Y!!*'!mL0E0qV>QZrr<'!s1SX>]`1(o
+JGR>Y!!*'!dK1`Xk>_K^s8VgA"HM[Dkc7#Gs8N)urs\9'$c;eX$OuP(rr<&ns8N*!rs)H?pA2WK
+!kY!&!K$jMg'!iEqc-XH~>
+s*"\Js8N'!s8N)rs8N)ts8N*!s8N*!s8N)ss8N)ts8N)rs3:WCe,B@Ge,B=Ie,'.De,9:Ge+Wk@
+e,B@Ge,B=Ie,'.De,B@Ge,KCJe,97Jdf9CHe,KCJe,97Jdf9CHe,9:Ge,9:Ge,KCJe,'+Fe,97J
+df9CHdt%LM!.b.@!<79C<RLgOC<lYEOTcNhq#C?orVults8N_H"Y87$UBN4Ds8P%YNr-DQ!!*#u
+rrE#t#%l*UmpQ3Iir9:\"&7hQ\I95DrVult(i8ch%L;G%NWE;RcA2H#s8Nr:Y55)U!!*#u!Y#.c
+rr38Z&.YW-qqd\equ8.+!Eo!=L]@GTs4e.qVssT?QmVk5!!$j+cOL3Js8N'!s8Nr:Y55)U!!*#u
+rrE#trrE*!!>+SkrrNW0h>[E[^BH.?q4e*Eq"k$j!"Wo:cOL3Js8P%YNr-DQ!!*#urrE&urrE*!
+#EAgfo$3$k!;c^#)$$i9W/L]Vq>^HprVultrVults8NP`&.YW-qqd\es8NN.h>[EZ)$$i9W/L]V
+q#C?o5A]o:%L;G%)$$i9W/L]Vs8Te;,L$&/3WK*Z!<<(X!YFGm)$$i9W/L]Vs8RrW?1ZI&!!*'!
+g^jsnnGD(0-MmcB!<3!,^BH.?q4e*Eq#C?o!;HNn!<<'(DpnLSWso<pSGrVAs7XtGOT>5X<Ib~>
+s!WEuWrN.KrVurIoDem?r;ZiHJH16$JH59As![nIdJjF'A/bR^8%A<nrrE#trrE&u#530_"V=;H
+rr36&N>Md^irB)Ys8N)trs%.g*!-dQh;SA<mq3XD%RIH!s8N'%q-+(>L&V)`f/3[]b5_PBs8$OD
+#!q,H!<3!.mnsf"!<<)uTg0.j'hkY(rs%(4"=qXq!<3!0rh2Rg!YnD/s8N'!q-+(>L&V,P!<<'(
+qJ6`J6/MYBrr;uurVult"98-%p%SIqmnsf"!<<)mFWgo"9#pc-rr<2t>6bptrr36&N>Md^irB)Y
+s8N)us8N)urs%(4"=qXq!;c^#qJ6`J6/MYBq>^HprVultrVultrr3f6Tg0.j'hkY-s6ii!!<E/r
+C_6k;hZ*ZOs8N'/q-+(>L&_2LC_6k;hZ*ZUrsA=7)?M%;s8N'!rr3Ae&-@acC_6k;hZ*ZUrs$t0
+">%dt!WN*(rh2Rg!YnD/qZ$QqrVm)qFWgo"9#pr2rrDfnrrE*!#2!H+!>%PpS,WMJs7Y4NScJXf
+<Ib~>
+s&HB*s8RWMqZ$WFrVurIoDem?r;ZiHJH16$JH59ArDh8F#2lVFM3G74p](8LrVunRrr32pZ]^0.
+Zh==t#QD8pN3W;:M#RGSM#I>XiNA9!Q+?eNrs$tM'EStGeboII!!MdT"!alGrt)4U"$c8T!<<)k
+:^IM4p](<nrsmXE$ipA.s8.X0$j7VX_tsB;X!7^2n,NIfrt,'a1^jL.?GlgC!!)LP"!alGs8N*!
+rs/0m#n'o2!!*#urrE#trr<0$n-f3hrsdRD$ipA.s6!W&!u>2,q>^Hp"RnSW,HLhD#Q8?H#Zpg%
+!<3#u!<3#u!<3!&X!7^2n,NIbrs/0m#n'o2!!)iprrE#trrE#trrE&u(]0%G$j7VX_uKbg4q%Gl
+s7B+o$X*6)!;QTo!"SK^"!alHs7B+o$X*6)!<3!)jAulp0;njM!!*#u$bQTF]_##,$X*6)!<3!&
+V]l70n,NOhrs/FX1^jL.?GlX>rrE#t#3T5,!u>2,rr;uup](6ns8N;:;%`mF;9#+*!K$jMg'!iE
+qc-XH~>
+s*'"oWrN.KrVurIoDem?r;ZiHJH16$JH59As*+KCdJjEG577T<D=I<"rrE#trrE&u#/s1G"X8-`
+rr35r9aD;Squ?`rs8N)trs#;c$j7r1r8IY[Z9\s'*G=j=s8N'%asmNOfDbd]Kbanuq#CEps4'.6
+'R9NU!<3!.W\=YY!<<)eF"%D#-u[o;rs"/m#@.')!<3!0mW0f`#:ONGs8N'!asmNOfDbgM!<<'(
+eN*jJGl.OArr;uurVult"96.drqHF%W\=YY!<<)<8e;.MG4tb3rr<2E.KhW\rr35r9aD;Squ?`r
+s8N)us8N)urs"/m#@.')!;c^#eN*jJGl.OAq>^HprVultrVultrr3f&F"%D#-u[o@s/IaX!<E/M
+3X$4Bqu?`ls8N'/asmNOfDkm$3X$4Bqu?`rrs?P0$3ri>s8N'!rr3@`!YFGC3X$4Bqu?`rrs"#h
+#[d3(#lai/mW0f`#:ONGqZ$QqrVm)@8e;.MG4tq8rrDfnrrE*!#,=Hm"!1t6S,WM@s7XtGOT>5X
+<Ib~>
+s!WEuVZ6_Go)Sa<JH16$JH56@s![nIJcFp5rrAJe!Rr?Fs7--h!71ZHq>^bOs5O%ZN;rV,"J,Vj
+<E4P~>
+s&HB*s8RWMpAb3Bo)Sa<JH16$JH56@rDeFKkPtP^RK!;J=+UDAs8N)FrrVcl%Y=Z>rrIuVp=]Y<
+!;fbrJ,~>
+s*'"oVZ6_Go)Sa<JH16$JH56@s*+KCJcFp5rrAJe!B7T@s7--h!71ZHblBbTs5O%ZK)bPp"H`]\
+<E4P~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcFp5rrAJe!FCJ2s7--h!71ZHiW'mJs5O%ZN;rV,"J,Vj<E4P~>
+s&B%!qU9uqJH16$JH1Z0rDeFKkPtP^RK!:(hLY^ss8N)FrrTY05(WanrrIuVp=]Y<!;fbrJ,~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcFp5rrAJe!=SCJs7--h!71ZH<</nIs5O%ZK)bPp"H`]\<E4P~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcFp5rr@WML]@ASe,KV3bl$-P!hY&Dir9%<s7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKkPtP^JcCN*rrCOJ#%-0a`!uq.JcFa0!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcFp5rr@WML]@ASe,KW&lM@Ib%e>2Nir9%2s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcFp5rr@WML]@ASe,KTr7LKAQT7R%$rrJ)Yp=oeB!;fbrJ,~>
+s&B%!qU9uqJH16$JH1Z0rDeFKkPtP^JcCN*rrCOJ"fjHa#sZ:Xs5EtYM?!;'"I]>f<E4P~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcFp5rr@WML]@ASe,KT1-3FfWk(3QkrrI`Op=0;.!;]\qJ,~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&B%!qU9uqJH16$JH1Z0rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*"GCqU9uqJH16$JH1Z0s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!RjIqU9uqJH16$JH1Z0s![nI_#OE7L&_/QoDegjm/R(co`+pkmf3:ePlLa`JcCi3!K@'Pg]X2K
+qc-XH~>
+s&B%!qU9uqJH16$JH1Z0rDgZ5s+lC/rrDZjrrDEcrrD]krrDKerrA;`rr@WMOT,?<s7Y.LRK34b
+<Ib~>
+s*"GCqU9uqJH16$JH1Z0s*+KC_#OE7L&_/QoDegjm/R(co`+pkmf3:ePlLa`JcCi3!J:@FeHD!7
+qGgOG~>
+s!RjIqU9uqJH16$JH1Z0s![nId/WtCp](6n\,ZI.!=&/prr`-.!!(aQrrE*!#2aPR#7)r9r;Zcs
+m/R(co`+pkmf3:err;uuRK*9err;uuJcD#8!K@'Pg]X2Kqc-XH~>
+s&B%!qU9uqJH16$JH1Z0rDh5EqhY"Hs+n/arr<'-r;Q]uo`P6pgAh0Qs8N;D@itj_4.lHNrrDEc
+rrD]krrDKerrE&urrAJerrE&urr@WMQ2^lAs7Y.LRK34b<Ib~>
+s*"GCqU9uqJH16$JH1Z0s*+KCd/WtCp](6n\,ZI.!A=BNrr^gR!!(aQrrE*!#-^u@!u+AAr;Zcs
+m/R(co`+pkmf3:err;uuRK*9err;uuJcD#8!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nId/X+GoDegj\,ZF-!+#U(!8%2Mf)Gt"O4jEoGQ9l)s8N)cs8N)Qs8N(`
+s8N(Ms-<TbN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5Es+p:Hs+n/arVur5rr2tdrW(OL#<\aBrS('IGQ%RA!:9ac!8@JQ!0mN`
+!.k08rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/X+GoDegj\,ZF-!9O4[!'gG_f)GtSZgR_5+991Ts8N)cs8N)Qs8N(`
+s8N(Ms-<TbK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/X+GoDegj\,ZI.!Ab>errZF/!!(FH!rDs#rVultm/R(cgAh0QPlLa`
+JcD#8!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5Es+p:Hs+n/arr<'/-iX,J((C6DdJj:@!!rQ'rrDEcrrCdQrrA;`rr@WM
+Q2^lAs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/X+GoDegj\,ZI.!="&QrrWTb!!(FH!n@8lrVultm/R(cgAh0QPlLa`
+JcD#8!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nId/X+GoDegj"oWf]#u1'krs&1@,6ecSb5VG@!<)rt!<3#u!"/Em"987M
+-jBu7QK%rE!!pFBX8h_j-ia8GrsSOE,6ecSb5_,7"nMZm$i:53ec5Q,0F8.P\bZ:*!;c]sqZ$j!
+s8N)urs&1@,6ecSb5VDOol2#U*f'dq!!*'!mMQ/(qZ$Qqrr;uu"oWf]#u1'fs8N*!s8)d$s8.Br
+"pm,PqYpcnG9[;)9ZmA7$Uk&fs8Rcas8V`l#lal(!!W=K&d_;)q>^Hp$hd3qs8W"V0F8.P\c2X/
+!!N+)#T/BsrtY6O,6ecSb5_M=Jg^g01m\1A!!*'!qZ-Zr#536c"qjVPrr;uu#51[lpB:ZTrr3)u
+$3J_.s0Ve,N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5Es+p:Hs+gjVZAajTrr2p%osBp>PI1&_s8RoRs8RoSs8Rl^oUgs>qmi#L
+Ni1Xks8N')A-)#rhuI<g!<)p*l!>2/(glV/kPttfrr3B!!X&,qpN7\b&Q%<Zs8N)qrrVlo$iU,*
+!<3!&l!>2/(glV.rt"3p'Eg"bs8N'!s8UOP$.etQrrE&urr<5u>6tgSrV?Kn!<<)r!!iPtBH70a
+6F-If#3fG2!uPD2rr3?<!9jI_,9m0fkPu4os8N'&q-+.9C&Rl-rr<Gj0`h=SpN7\b&Q%<_s8N'%
+nNm@)Y5\G9l!>2/(glV/s7U+H!t@T&s8N'!s8Vrrs8N;f?5Nb]?gI^krr<8e0`gVA#5A,s"8;m"
+on!.MrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/X+GoDegj"m/,T)3+Xprs$P<&dBV+p\t3m!<)rt!<3#u!"-=Z!WUnR
+'`o(Ldc1<,!!jtRpA^-Q_>jT7rsQnA&dBV+p]$rf-iX,F$do%bqu>PZ)$Cgio(i=c!;c]sfDmQ&
+s8N)urs$P<&dBV+p\t1'`((7A5Kj*,!!*'!TE?G-qZ$Qqrr;uu"m/,T)3+Xks8N*!s8)d$s4^Kf
+!YeY_qYpc@9G.OTGk_4;$O?b*s8NX_s8S\k7K3>e!!VLO"W<=!q>^Hp$bIG\s8Ut^)$Cgio)A[h
+!!LLs"uk67rtWUK&dBV+p](9J<##HK<RUpI!!*'!qZ-Zr#09IN"seHfrr;uu#.koWYQ5X>rr3)T
+!Y"sWs0Ve,K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/X+G!uh=dMtd8O!#1d3q2554s8VjH"eteC.0d]irr<&ts8N)us8N'+
+JBQsPJH/d7r7Q,Ms8N')o)L3=ZN-9k!<3!,pau`Epspku_uFcXA,cK:gAi,kqa^jPo]JaJ[/0h&
+!;lcul[]+YrVults8Nu3/d8!EegUg@s7e&HQ1O9ls8N'!s77ZBV"t&j!<3#u!!S_$q2554q>^Hp
+rr;uurVm(Q!*A@]flHui(AKKcUA3:g#/gK@\,\eor=04rs4dSrrr;uu"dcjsMZ>a4s8N'MJBQsP
+qa^jPo]JaJ[/^.+!/\tj<<89_pau`Epspku_uG8f=6KM7ErZ.>!<3#u!<)p2pau`Epspku_uK`:
+!.`8Ps-`pLrr3&[!#U:eZi:&bs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh5Es+gc=MOrMqs8RlhZg7IjLrB>nplCEorSiftq#CAMM#IARM#RGSL^L-P
+ir>[-b4tnsYN#T^!!qZdAH,O-jT#;[rs\?+$c2_U$4cS*+99I]rsY\'49,!p#I4*T)$oI&s8N)r
+rr_1["K24urrE*!)=J%C_>D"T%e0Md$jj<9ggL0^!!*&Y$4,/Ws8N)us8N'&?.JRE!.jtGrrE&u
+rrE#t"u?7=nG14+qu7H#%L^,M^^:S@s8PamW;l\u"o81q!)3Clrr<4.eau]=Jbf?G!%^V"_#O*K
+#I4*T)$oI+rr<$pjQ%BafDk:L$c2_U$4cS*1B<F(q8u\:rr<&us8N)trtFi2$c2_U$4cS*rr<$g
+j1t[Z!07'Y!kSFlJcE(V!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCd/X+G!t,E$eG'"C!#/o*kTBlNs8Tq?/(aNg"Y]ZNrr<&ts8N)us8N'+
+Aak0K'`bH2oscd:s8N')Q2n]"+TV*6!<3!,_?MOBpRh[Cq#:j)kl1Sj6NE_XfaJqEqmm.XpA4gh
+!;uj"rQlf"g\q0P!<<':_?MOBpRh[Cq#A&4,0Tl,3WK*Z!<9A/,4>:,rrE&urr<43kNF#gcM@M?
+!<3#u!<)p%'`bH2oscdSrt`HU/(aNg"Y]ZNruV6ss6'k#r;St]\GlO.!!QipkTBlNq>^Hp/7n="
+s4If%b58aX+SPj8!!$d(bmasIs2"sjfCtpA0DPP^!3c+h\2+*a!!*#urrE#t'>ar(fCtpA0DPSI
+!!$U"IfC;deGfIL;?32;s0M_+K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/O;/a8==C!I4D>rr<C?s8V`l$NL..!)`aq#2T>&s8N'!rVultrr;uu
+!,;H4!XSk+hZ*TU#ldg+ko1!0!!*#u!j)H"rr32Z!$M=#!#PY7#'9ics1A>#rr3&c!#te7rrE#t
+rVus)OSo.Y!<<'#XT25trs%<[+TJGA:](1l!!E!V"JY\krrE&urr<4:s8V`l$Mj`%!<3#u!<)p!
+#lpt!rrT;&;?$S,h>e\us5j;!s6L5?A,iJ-<W<$u!!R*:s7H@!q>^Hp!,;H4!k\M%rr3Pq!#tt<
+!!$g7s69S"s/c8urr32Z!$M:J!3,kqrrE&urrE#t!j)H"rr35[!$M=A!!$a4rs8/q#PA&rSH*AT
+s0M_+N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5E#.*^qiK&fSq#CAM$KhBgon\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<
+rr3%VM!*Xprr<?)'FFF;'`S.5rr3$n!3lJ&#-@l#s0D\_rr30E!7:aU!2'8j!mgp4qZ$QqrVuis
+!>E0Es8N*!rrPjoYl=Y,XT2,r8-#^fs8N'$m1K]Rq#C?orr;uu"j-fEkl;Fns8N)us8N)trrN9&
+bP2#<9E;<rrt):4:B1@3!'1).*?EH*2ZUbps8N'&aoDD*!#58/rr<&Crr3%0!2'8j&C:DBs8N'!
+cN!ph!&FRJ!3lJ&#-@l#rrW8Equ?Zrrr;uurVlpm!3lJ&#H[u$s8N'!bl7VJhuF8cs8OqVbCT]"
+rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/O;ukk:bV"6TCYrr<Djs8Sho;ZHb=!9!kV##>6%s8N'!rVultrr;uu
+!:'R`!W`;^hZ*TU#lb5WjTAK^!!*#u!ZqF#rr30u!3Z?"!13]b"qCY!s!Ig"rr3%@!2B>irrE#t
+rVusLjo#/Y!<<'#*rt6urru7!Y5]OChY[?Q!!C.F+R]%)rrE&urr<5es8Sho;Yg@m!<3#u!<)p!
+!<D3TrrO8Bi;W`f:B7Qts&B'!s(ZfhlMh\$k5PD\!!VWes.]Qlq>^Hp!:'R`![e!$rr3ON!2BMn
+!!)<as(_V%ruV7!rr30u!3Z>&!9F%WrrE&urrE#t!ZqF#rr34!!3ZA%!!)<`rs4nj3WB'Y(BE`O
+s0M_+K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIbl7b/!"Sf(rr<D_s8W&u!rr9W!7:`F#5S<(s8N'!rVultrr;uu!8%5M
+"`+/>0p:AOs8N')s3Ug(!&X]U!<3!"1]Yo%rt,#,#64WF!n.,D!XJT%56/FsrrW-!"oA9!!;lcu
+i*$2-rVults8N-W!7:`F#5S<(s"4<"qu?Zr!_NTgp](6nrr;uu"lB:ZrW!#qs8N)us8N)trrm3=
+!ATbnqYpUR!7:`F&GcA2s8Vos#QMUobTd'D!RLcFrr<5Zs8W&u!r;lr!!(XMrrPCb^Ae-Dr;[$$
+rr<&Rs8Vrr"ogCZd/O%Oq>^a"C]FJjP26-;rrE&urrE#t!]0o(rr36"!!`K'!!(XLrs+)T=o\F8
+#53WJZi:&bs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh)A!p,6(q#CAM$N'l'reQF2s,Mp3rr33!LlVN8Lku$0s+p[Ss+g[Prr3.i
+Lkr+[pu28Q!!rUZ!,MXjrr<&urrNW0o`"k%oDf@#q?R2rs6]mtrr3K/nG`Fhq>^p"s8N)srri;J
+.g*-Vs8N*!rrNW0o`"jpoDf@#$NThrs8N'#*!jsds8N)us8N'&p](9k!!E&srrE&urrE#t"XF'K
+9V1bMrrNW0o`"k%oDf@#s7?=%s'C"t;u[:-o`"mj!!W,ss82j!q>^Hp!;?El!Y5;#rr3Q+!"8i,
+!!)cns7QF"rs\u#rr3;s!"JrR!!,cbnG`If!<3#u!<)p!%06&"rs//r%KHG.!;?Bk#:ok`s7um-
+rIP!TrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCbl7`_!-@r8rr<E(s8VWi%0->3!;c]p#1!9+s8N'!rVultrr;uu!;lcq
+"V:Y7A?G[ds8N')s"j^3!7CfH!<3!""p"N!rt*KV2#lkE$N'k5!B^>]#6=PurrVEb/,K;G!;uj"
+qR[@Kir/oW!<<'#"p"N!rs$dL2#da[qYU<m!!3QMmJ$Y\!<3#u!!W<#s7--uq>^Hprr;uurVm$4
+!!-W4q>1*m"p"N!rt*KV2#mU%!BC*+bqH^/"p4Z#s8N'&r;Zff!"A]'rr<&rrr3$)!;QQn&Es0F
+s8N'!qu?]M!%@jO!;c]p$-rT.rt#/2A?G\,s8N)us8N)trrNB)qYpL"cN#g%rr<&rrVm'8!94%E
+"#,<+ZMsrWs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIbl7bC!!;rqrrE#trrE*!!XSl&rVm$$!rr9#!<)rt!<3#u!!)oqrs&:E
+*rl9CHfG)*!!rW"!WW84rr<&urrNK,q>L=.!!<3#])Y+rd/Yj"rs8Z-!s/K'!!2rrrrDoq!qcO!
+rVults8N-,!;ZTn"TSW("T\Jts8N'#'`s9es8N)us8N)ts8N)ps8N)us8N)trs&:E*rl9CHi*gE
+#lsf"rrE*$rr3:/!4c'Vn-Jag$iU,*!<)rt!;ZZp!!)oqrs]87!s8T*!!!'"rr<&qrr3-%!WNH+
+q>L=&!!<2rGom"d"+1(J!!*#urrE#t!XSl&rVm'%!rr9#!;l`p#4)=!s60M5JcE%U!K@'Pg]X2K
+qc-XH~>
+s&FUMJH16$JH1B(rDh)A!r[q4q#CAMrVunRs8N+VM#@8VLl)03Lku$0s+p[Ss+pXR#5GTfLkpuC
+irB#Y#lj>o!!2Qg!!*#u!WrH%rr3c5!!E9$?3$PrL&cJurrN0&!s/K'!!2rrrrDoq!pK[trVult
+s8N-&!<2ut"o\K(rrE,rs8N'#"U)L4s8N)us8N)ts8N)ps8N)us8N)trs%q#&c_n9YP\>$!s&?"
+rrW0""9/<,('*b:hVJh2!#GP5rrE#trrDlprr<&urr3`8!!<<)!<<*#s8N'!rr<#t!!3*%!<2ut%
+fQG1s6jA/!!!5,s8N'!rr;uurVlp$!<2ut#Q=]*s8N'!rr)j$d/Y-cb5c7-s0DY*M?!;'"I]>f<
+E4P~>
+s*'"oJH16$JH1B(s*+KCbl7b1!"er*rrE#trrE*!!<E3!rs&5u$NL,+!<3!"rVurts8N)trs$eD
+#QOi@i8Xe:!!rV9!<<2rrr<&urrE-#rVmZ.!"/c+,llWu1]Y`!rrE*%!s/K'!!E)trrDoq!iH#h
+rVults8N*#!<)p$p]([$!<Durrr<*&&ENTcrrE&urrE#trrDlprrE&urrE#t#1$!L!!!hnqu6Zt
+!<)p!p]([#rs9&5p^6M<6F-YrrVultrVultq>^HprVm9,!!<<)!<<*%s8N'!rr3/u!!WB'!<)p-
+p]([$cV4ZF!#OSnrr<&us8N)trrE-#rVm)s!"/c+!!)rs#($>\s'l&IJcE%U!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIbl7bC!!E#rrrE#trrE*!!]'i'rr3E'!!`K'$NTbts82isrr;uuqYpZT
+J,ff5s8N*!rs!ZI&-)Y0!<3!"1B>f$rt,#,#64_r!"Am-!Or+/1'#hrs8N)prrE*#rVults8N-V
+!7:`F#5S<(s"=B#qu?Zr"6L:!MYR5O!<3#u!<)rt!;ZZp!<3#u!;c]thgb\2qu6^R!7:`F!r;m$
+rr3;A!(I(\rY1=l-N3uE!<)rt!;ZZp!<)p!1'#i"s8N'*g].<N!!WBY!7:`F!r;m$rVm,[J,ffR
+rr<&us8N)trrOtVd/O%Lq>^a"rr<&rrrm!7JZ]!KJcE%U!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh)A!r[q4q#CAMrVunRs8N.\M#.,N%/Pd?s8Rq3rr<#qLku'1s+pOO"6m4L
+NoL*=!<<''+93Sbrr<&urrNW0o`"k%oDf@#s5sA#rtPS&s8NK-p%8:a!;c]srW!#us8N*!rrNW0
+o`"jpoDf@#$ioqss8N'$_$'tSq#C?orr;uurVultq>^Hprr;uuqYpZD@/pc6rrNW0o`"jloDf@"
+rs<!3Xp+b$"eu'(rVultrVultq>^HprVlp-!;60frr<B"s8Vfn$NCP8o`"jloDf@!rs-kY!"Ju.
+!!*#urrE#t!Y#/%rr32p!"Ju.!!)or"WdZp70)S's0DY*M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCbl7b0!#,/-rrE#trrE*!!X8Z$rr3DR!&X`U!W`6"s5!_Urr;uuqu6fu
+^GGpJirB#Ys8N96!-eJC!!*#u!X8Z$rr3PV!&X`UT`A[($3U)'rrrK#o`+pkqYpWl!!rQ'rrE*!
+!X8Z$rr32L!&X][!;cTmrr<.]!taPgs8N)us8N)ts8N)ps8N)us8N)rrri>91]TE1rrNB)qYpKr
+ci>p%rs:"PV%s"""$ck'rVultrVultq>^HprVlp'!;lTlrr<B&s8UgR-iXANqYpKrci>p%rs8V=
+1]TE5rr<&us8N)trrNB)qYpL!ci>p&rr<&rrrii3mMu<#JcE%U!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIbl7b+!##),rrE#trrE*!!iuB!rr3Da!$D7@;?3Qns6'F_rr;uuq>UQr
+!!3)Zs8N*!rs%6Y7K<Af!<3!"X8l,srrV'X+9)9CEWD@)&cVe3\,\tis8N)qrrVcl$iU,*!<<'#
+X8l,srs%?\+9/AA;#C:m!!N>a&d!sds8N)us8N)ts8N)ps8N)urrNK,p\OmlrVuuur;Qi"!)`aq
+!oEu"rr3;j!"'><s,70_A,ZH-!<)rt!;ZZp!<)p!\,\tns8N'*D#aP$!#>O8!)`aq!oEu"r;R!#
+!!3*!!!*#u!XSl$rr3&$!)`aq#2]D&s8N'!qu6f\!#?ghJcE"T!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh)A!o\s)q#CAMrVunRs8N/$Lt_k.%,-N<s8S4;p&G'RLku'1s+pLN!r[q3
+irB#Ys8N;$!2oks!!*#u!_WNtrr3&(!)3Cl"<[]j!%7dG!aPeno`+pkqYpWW!#PV6rrE*!!_WNt
+rr32,!)3Da!3H(trr<3%^]akRq>^Hprr;uurVultq>^Hprr3$%!<)co!rDs!qu6^j!3lJ&!jDYu
+rr3;O!$!?cs!A?Yd/F"E!<)rt!;ZZp!<)p!>l^8fs8N'*ci=$j!&=LH!3lJ&!jDYur;Quu!!<3#
+!!*#u!WrH$rr3$m!3lJ&#-\)$s8N'!qu6f5!&Fp$JcE"T!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCbl7`V!/((HrrE#trrE*!!ZqF#rr3C(!3Q;$$39c!s(;<3rr;uuq>UN`
+!!_H_rrE*!#"8OIs8N'!rr3$A!9!kV!`8s"rr3*2!0.&1rr3$G!7^Z@rrDoq!gs$prVults8N-B
+!9!kV##PB&ruM0squ?Zr"TOG_&ENZerrE&urrE#trrDlprrE&u!<E2rrrVQf#5eE%*rt6urrQ$t
+XoA>,@fR%!s8NZ9!:0U`rrE#trrDlprrE#t![Rirq>^Hp$1%WkC]Kh%*rt6urrQ$tXo/2'm/R@j
+rr<&urrE-#rVlp@!9!kV##PB&s8N'!qu6e/!/C\mJcE"T!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJjG(XRH&*-j-"7s8N)ts8N*!rt>)V"f(nF.gEfhs31NelfVUT!<3#u
+!<)p%/#_n6\H!E)s8N)qs8N)urs8BL"f(nF.gEfgrrh6[#ln'+rs8O#!c?]in@Mp$s8N*!rs(6`
+nbpp0!IOeFrrE*!)YbccU\WLl#/L96.Kl(1l[f*9!!*'!jUqWPqZ$Qqrr;uurVultq>^Hprr3C?
+!/CIPs!t&9r4)eCqu6rs.KuUCf..'@rr3<&#66^_s3q#Li;N]U!<)rt!;ZZp!<)pGr)*T5g\gQQ
+>Q=^'!/Stl=TOQ_paQHBq:@,$_#Gp`mejTq(B=C7!<3!2BE3ecs8VjD"f(nF.gEfhrr<&qrrYpp
+!(DJ=Z2Xi`s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#HZq]qq6semJ-_]M#IARM#[JfpPt6nrSrltp](93Lp-^AZA=>9s8RoR
+rs#O^qYSQoT]6"O!;c`q!<3!(m0jB>qn`^Mmf*4hYlGU@])M^8pF$0)kPaVF62LW]!<<'(;T/;*
+_B8olrVults8O#)$k'rL_@$h@s6^:%[JJ]es8N'!s8Te:"MFU2rrE&urrE#trrDlprrE&u!ZV3W
+rr30p]_2#c!&XTQ#ji$._Y_1X%IX5q$2=Q%OT5?A!!;ros8N)ts8N)ps8N)ts![Ui"HM[Dkc7#L
+rr<$qk2mfgec5"F$c;eX$OuP(9"aikQN/lBrr<&urrO/?_Z'QDm0jB>qn`^Mmf3:e!;ld!rY#83
+V1JZOrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJjGdcM?sl"W$S%s8N)ts8N*!rt<'M/(jZm"YBHKs#:"=qmr$m!<3#u
+!<)p%B$C,?@/tl<s8N)qs8N)urs6@C/(jZm"YBHJrrc1!#ls#brs7Bk%]AgnhO#Yds8N*!rs*Jj
+qXgft#NYj`rrE*!)SZG+f_M9G/GT7Z"s_@hbW5_'!!*'!MujROqZ$Qqrr;uurVultq>^Hprr3$/
+!8[YS#%l*UmpQ3Iqu6r:"Y87$UBN4Drr3;_!<CXLs#0o_r;HZq!<)rt!;ZZp!<)pGg^jsnnGD(0
+-NF)G!,V5P%L;G%^BH.?q4e*Eq#=sMqX7hmJcG`M!<3!"%055`rsZXG/(jZm"YBHKrr<&rrri0)
+!!(c)s0;S)K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjF'A/bR^8%A<nrrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)t
+rs%.g*!-dQh;\J7!;c`q!<)p%p2qM^&5("Arri9C!!M]frs/Os5S*u39WIshrrE*!#2!H+!>%Pp
+r;Zcsrr32rFWgo"9#pr2$1r'Q![*=!rr<&urr_<n!fHmTrrE&urrE#trrDlprrE&u%.@(-!<E/Q
+AfLjc<8IEN#530_"V=;Hr;R"A!0R<]o)K6ts8N)ts8N)ps8N)srt,1'5S*u39WJ-m!!)h!#8W$m
+rtG*K+U&ELa8c1mAfLjc<8ITS!!*#u%I[1.!<E0"p2qM^&5("Bs8N)qrr^jQ!o&;+Z2Xi`s7Y4N
+ScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#2lVFM3G74p](8LrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eOs8N)qs8N)trs%Xk('>=Xl2CVbq?R',qu-O"qh[-<"<LmeqZ$Qqs8N;:;%`mF;9&P6
+rrE&u#3T5,!u>2,rr3;c<tGHeVuQbs!<3!#]EAAMqu?Zrrr;uurVultq>^Hprr3DY4q%Gls1_GE
+!ZPkJqYpc_>S[DW?0V:e#93a*s8V0\*;oj:!<)rt!;ZZp!;uj.qh[-<"<Lmes8N'!n3-q!X8`,4
+k?Jc)(1$2)s1_GE!ZPkJs8N'!rr3GZ4q%Gls8V7e('>=Xl2L__!;c]tQiI9`JcE"T!K$jMg'!iE
+qc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjEG577T<D=I<"rrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)t
+rs#;c$j7r1r8RbV!;c`q!<)p%`C^[F,'N\YrrhTi!$V=>rs.t5.1$5-Dqt3hrrE*!#,=Hm"!1t6
+r;Zcsrr32A8e;.MG4tq8$,T%:#=-K4rr<&urr\,[&EN`grrE&urrE#trrDlprrE&u%&tud!<E.r
+5n!lDKDbTG#/s1G"X8-`r;R!2!;$6jOT9D!s8N)ts8N)ps8N)srt+U>.1$5-DqtBm!!(.k"?"g1
+rtE@D&-X8$pAb/h5n!lDKDbcL!!*#u%B;)e!<E0"`C^[F,'N\Zs8N)qrrY:^&H%+ZZ2XiVs7XtG
+OT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$V#UGpaSu=p!#gFgYl=`_s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcDPGrrC.?!hTHWJcDtS!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$V#UGpaSu<(!2G,FYl=`Us7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$V#UGpaSu=\!.KM!Yl=`_s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcDPGrrC.?!b;;]JcDtS!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$V#UGpaSu;i!:>@;Yl=`Us7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$V#UGpao;G79celcYQ"W^s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcDPGrrC1@!pL@kJcDqR!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$V#UGpao;Fn$'Tr?YQ"WTs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$V#UGpb5VPD"#T"gs0)G'N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDeFKJcDPGrrC4A!rrO!pjrIKrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$V#UGpb5VPD$uGims0)G'K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI_#OE7OT5=\rr;uun,NCf])Vd1mf3:eg&M'Pp](6nkPtP^aoDA@mJm1d
+h>dKTU&Y,mm/I*Fs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDgZ5s+ld:rrE&urrDNfrrBY1rrDKerrCaPrrDfnrrD6^rrC1@rrDHdrrCmT
+rrAbmrrDEc!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KC_#OE7OT5=\rr;uun,NCf])Vd1mf3:eg&M'Pp](6nkPtP^aoDA@mJm1d
+h>dKTU&Y,mm/I*<s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIci41.>o<bpPkb:Y!4W".!;uls!9=+Z!<3#u!:Tsf!4r41!:Kme!9!nW
+!;uls!<3#u!;uls!9aC^!6P9@!:Bgd!9F1[!;uls!5nj:!9*tX!:9^dN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh2D"ll\HMkf&%s8Rnas8N)ss8N)Zs8N)us8N)fs8N)1s8N)es8N)Ws8N)s
+s8N)us8N)ss8N)^s8N)@s8N)ds8N)[s8N)ss8N):s8N)Xs8N)crrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCci40G4UqipdeNkB!4W".!;uls!9=+Z!<3#u!:Tsf!4r41!:Kme!9!nW
+!;uls!<3#u!;uls!9aC^!6P9@!:Bgd!9F1[!;uls!5nj:!9*tX!:9^dK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/O<r"Zt'+hfJSmrrBP.rrDusrrD*ZrrE&urrDNfrrAnqrrD!WrrDfn
+rrDusrrD6^rrC1@rrC@ErrDusrrBt:rrC4A!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5E#1&+8n,;ISq#CAM\,ZI.r;Zcsj8],Zrr;uun,NCfV>pPqi;`fWp](6n
+r;ZcskPtP^aoDA@cN!nEr;Zcs_uK`:b5VL!s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/O;_!K$+:]/'0]rrBP.rrDusrrD*ZrrE&urrDNfrrAnqrrD!WrrDfn
+rrDusrrD6^rrC1@rrC@ErrDusrrBt:rrC4A!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj:?#oW@7rrBP.rrDusrrD*ZrrE&urrDNfrrAnqrrD!WrrDfnrrDus
+rrD6^rrC1@rrC@ErrDusrrBt:rrC4A!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!qV8EoDeiH\,ZI.r;Zcsj8],Zrr;uun,NCfV>pPqi;`fWp](6nr;Zcs
+kPtP^aoDA@cN!nEr;Zcs_uK`:b5VL!s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj9E!K-LKrrBP.rrDusrrD*ZrrE&urrDNfrrAnqrrD!WrrDfnrrDus
+rrD6^rrC1@rrC@ErrDusrrBt:rrC4A!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj9T!-%Q0rr<6$HkH`[o`"jpp3._c&kpIIs8N)ts8N)us8N'+p.GMf
+qgp4##rIt-s8N)ss8N)trs&(N(]t^kq#:<n!!W=K&d_;)rr32U2?bYV!!*#urrE&u#5jH7#n0&/
+q>^Hprr33#NA(YI5Ipdn#1YR7/C"4qrr32oL_p45C&%]-$2&9Z"<N?m"U!T[rr`0+!n@,I$Uk&f
+s8Rcas8V`l#lal(!<3#u!!W=K&d_;)rr32U2?bYV!!*#u#536c"qjVPrr3?p!2';kKb4:ao`,9o
+s8)frs8N*!s8)frs8N)urt#$e0F8.P\c;^,Jg^g01m\"<rr<B$?O.L)s7Z[!h>[EVr!EMTqu?Zr
+$hd3qs8W"V0F8.P\c2X/!!W=K&d_;)rr32U2?bYV!!*#u#5jH7#n0&/rr;uu#51[ls8N'!rr;uu
+"oWf]#u1'krs%"2"Y@q!!;c`m!<<*!!!W=K&d_;)rr33#NA(YI5Ipdnrr<H*Hkm6*s8-jR$<$]q
+s8N'&rHo4a:%\Gb#kiHe"qjVPs8VrrqZ$QqrVultrr;uu"oWf]#u1'ks8N)ursn^A*X!O>s8Ve:
+,6ecSb5VDAN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F!j%4EoDeiH"oPZbO1G8hrs&/'PDPL1pAY*lM#IARM#RGSL^NdHM#[@_
+QALX"gZ&85!;uls!<)p%k@Y8.-%l3rs8N'&q-+.9C&S&2#-K3S6Lb$Urr;uurr32sFX%)&:u1sI
+rrE&u#5<6b"qa\frr32$,6U@(!!*#u#3TV/"XSg#rr3;d=qh)kVX+<fp\t0ppB(Njqu7$9!9jI_
+,9m0fkPu4os8N)us8N'&q-+.9C&S&2#-K3S6Lb$Urr32e?5Nb]?gI^k$P<C&s8O;fs8V9_&c2P)
+!<<*!!<<)r!<<*!!<3!/pN7\b&Q%<`s7U+H!t@T&qZ$Qq$1U=b-*I:7!=&;trr_ut"82Qkrr<Gj
+0`h=SpN7\b&Q%<_s8N'&q-+.9C&S&2#-K3S6Lb$Urr32sFX%)&:u2-Nrr<8e0`h=S!!*#urr<5u
+>6tgSrVlg$W$;F3nc/[ds8)frs8N'&q-+.9C&S&2#5<6b"qa\frr;uu$i+*>(l/.a=V)-`rqZTo
+!!W1&#nLbKrr38g?5Nb]?gIalqZ-KmrrE#trrE&urr<5u>6tgSrVlis!<3!.j]W?$/Z/RJl!>2/
+(glV.rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj7j!:BCXrr<5b63S6drr2p%a@m3N,^B(_s8N)ts8N)us8N'+],h"Q
+gJemh'NNT@s8N)ss8N)trrpqH#RE2[rVult"m/,T)3+Xprs"8r$"3Q/!<3#u!<3!&hd%*&)/&O9
+s8N)urs%@d)$Cgio)AXnJeeZ#q#CEorrpqH#RE2[rVm2B7h#\fbHM!br;Q]ugB%f\qu7$0!;6Bl
+&;1#_T)_=Zs8N)us8N'&k!B4hNW/qW#)F*&@/0d&rr32D9G.OTGk_4;$O?b*s8NX_s8S\k7Jd&]
+!<<*!!<<)r!<<*!!<3!/hd%*&)/&O?s4^Kf!YeY_qZ$Qq$-Xq)2qe58!?(h7rr_!W%/]r%rr<G=
+*Wc<@hd%*&)/&O>s8N'&k!B4hNW/qW#)F*&@/0d&rr32[>o<b_BCc'%rr<88*Wc<@!!*#urr<5b
+63S6drr2p%JeeZ#q#CEks8)frs8N'&k!B4hNW/qW#2`](";tkCrr;uu$Kjha+gD!u5RAEqq#C?o
+"m/,T)3+Xprs6\>&dBV+p](9j!;c`q!<)rt!<3#u!!VLO"W<=!rr;uurr3JH7h#\fbQ%U`9G.OT
+Gk_4;!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJjG@!4u&;#W&1Ls8N'5Qb3'O!'(#Ypau`Epspku_uK`:!<)rt!<3#u
+!"+8"ir=Q0=6KM7EoR-!!;uls!<3!'p_Kk)n;@9'rr;uu&!sp(MZ>a:s6g4&c1,EH!<3#u!<<')
+qa^jPo]JaJ[/0h&!<<'Iqa^jPo]JaJ[/]Lt&('lb!!*'!p_Kk)n;@9's8VjD"I8TDJcD/=49#6]
+irBqmrsQ=:5l^cm$fq?C!$D4?rrE&urr=I6]D7?b3<0$I#S#&KB)hr3s7e2MUA3:g#/gK@\,\eo
+r=04rs4dSrq>^Hpr;Zcsrr;uur;Zcss8NZ-8-G(Ik=>`_s+(/OkPX"RqZ$Qq$&Qps<<89_RK,GK
+rrV3\)#F:4!&fANirAmH"Hi?>8-H="rr<%c]D7?b3<0$I#S#&KB)hr3s8,=iOn@g-"LS4/!!%Pm
+irB#Y!<3#u!"YF.q2554s8VHj&('lb!!)iprrDusrr=1.]D7?b3<0$U8-G(Ik=>`_s8N'!R()pU
+!+ooRqNCnEq>^Hp'UQH-MZ>a:s7e2MUA3:g#/gK@!!)cnrrE#trrE&urr<4h]D7?b3<&sX!<<'5
+paQE3oBLo,pau`Epspku_uK1as7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#EXbsV2^M5jS8cTL_R2]qQ>Xms8VkTNT0orNK<l7s+lL0s8RoSs8Rl^
+WUf'KTSUbcr8t3Bs8N)ss8N)urs/$A`r+t-!-S;@rr<R8eau]=JcGc%![$La9`P1ms8N*!rs8<=
+#I4*T)$oI&s8N*!s![R]#I4*T)$oI+dK1WTk#;<\s8VR:`r+t-!-S>AmL0E/ptT9W56-`CrrTe4
+3;WX_9E;$kq?@-!s/#cirr;uurr;uu-sbBq;#l1Is47;ojQ'#8!<<)f%L^,M^^:S@s8PamW;l\u
+"o81q!)34grrDusrrE&urrDusrrE*!&G@+LZ2)of#jD:E!0-LDb#J6;rr<@$jQ%BafDe&8NrK%[
+])Xhes8N'W7cV;ap)OCCq:->gkl:Y_!+".I;#l1Is47;ojQ'#8!<<)m*=&kFeJSYVs8N'!7cV;a
+rr<&us8N'0?.JRE!.k1MdK1WTk#;<\q>^Hpr;Zcs+C3Oi;#l1Is7RH<Z2)of#jD<g!!$3Np/qC+
+44<h*!0-gSrr<a=eau]=JcGc=%L^,M^^:S@s8N'!p](6nrVultrr;uu"^T[N;#l1Hs8N*!rtOl0
+$+0K_@/o[*$c2_U$4cS*f89P$g'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjFW!1>GC&m"/is8N'5@cuqt!7(WE_?MOBpRh[Cq#C?o!<)rt!<3#u
+!"*<,IfC,_YP.Y!1?/?6!;uls!<3!'^.-iSf.@!@rr;uu%q=_c+99^es,mC`n]cji!<3#u!<<')
+faJqEqmm.XpA4gh!<<'IfaJqEqmm.XpA^!N>4U$u!!*'!^.-iSf.@!@s8Te;,0Tl,3WButeGfIL
+;?33_rsKnKh>c[I%K-5j!4`%.rrE&urr=HVkNF#gcN!p-!ESa8L]@GTs2"sjfCtpA0DPSI*rt-s
+kR7pus$$Lnq>^Hpr;Zcsrr;uur;Zcss8NY`$m*Rg\dKYSrtPO;p@YpNqZ$Qq$#9"T%1)G&)?A:d
+rrQ'uS,30b!&eEXIfJ(0*m4Ak$R#0Crr<%.kNF#gcN!p-!ESa8L]@GTs4If%b58aX+SPj8!!$U"
+IfKEJ!<3#u!"WQ%kTBlNs8RrW>4U$u!!)iprrDusrr=0NkNF#gcN!pt$m*Rg\dKYSs8N'!?01Dt
+!8LH5lluMZq>^Hp'Op7h+99^es2"sjfCtpA0DPSI!!)cnrrE#trrE&urr<43kNF#gcMmkD!<<'5
+^'5e)qo_#"_?MOBpRh[Cq#?M/s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJjI[!"lC0h*1t%q>^Hp$>KP?o`,@!s/c8urr32Z!$M=A!!)utrrE&u
+rr<%5rr3$+!3+iTp]1-i!rW*'rr;uu%r)(Do`,@!s-E_$s8V<`!<3#u!<<'#]DtD"rrVKd)uBU7
+!<<'#]DtD"rsS,m)ul-&Du]k'!!)lq#Q4W,s8T)!:]14unc/pes8SViC&7i;jo?;!lje8Ms/5ot
+rr;uurr;uu'P[UIo`,@!s-E_$s8V<`!<<)$!)`aq&DdC0s8V3])?9%5G[pcP!*/jprrDusrrE&u
+rrDusrrE*!!k\M%rr32g!#tqE!3,\lrr<RFs8V?a(B<q*#PA&rSH*C#s8N'!C&\,6]DtD"ru:8(
+)uop<!,;K5o`,@!s-E_$s8V<`!<<)3!(Hne#O;@/s8N'!C&S)3!<3#u!"WfDs7H@!s8S;`Du]k'
+!!)iprrDusrr<C?s8V`l$NL.=!(Hne''fN:s8N'!B)ho)!!R!7s7QF"q>^Hp$>KP?o`,@!s/c8u
+rr32Z!$M=A!!)cnrrE#trrE&urr<4:s8V`l$NC)*!<<'#WW5imrrT;&;?$S"h>e\uQ]1t<g]X2K
+qc-XH~>
+s&FUMJH16$JH1B(rDh8F#`4A#k5FG)M<Xj9s+h$Es8VbJOoPH^Lt_k.#2+g6s8Rn2rVunRrr<"S
+!9a@]!f;`rhZ*?Nq>UNl!"Jr-rr<SOs8V<`'`\1g!7(WEb5_PAs8N*!rrQ[1TDnilci??-s8N*!
+rrQ[1TDniuci??20*'E"s3L`GqYpfr!"Ju.8-#^grs7N_%fQG-2#thrrsQ^E3WIPK*R=[D!5ng9
+rrE&urr<bTs8V<`'`\1g!7(WEb5_PBs%EEsrr3P3!)ERo_Z2^sdiBISs#0qqq>^Hpr;Zcsrr;uu
+r;Zcss8N.1!2'8j#1*?8rrW8EpAb-m&'k4TblBO!huF8cs8OqVbPM8=!!(7BrrQ[1TDnj0ci??2
+rr<&@s8V<`'`\1g!7(WEb5_PBs'l&$rr35M!'pSa!!(7As8N)us8N'0aoDD*!#5J50*'E"s3L`G
+q>^Hpr;Zcs$H`>Jkl;Fts'l&$rr3VX!'pSa!!(%=s6BXm`rH)(!#GD1rr<DJs8V<`'`\2,!3lJ&
+#-@l#s8N'!p](6nrVultrr;uu"j-fEkl;Fss8N*!rrP^kX8Mu!9E;<rrs#S*:B*)+s7Y.LRK34b
+<Ib~>
+s*'"oJH16$JH1B(s*+KCdJjIR!'f<8XpGI%q>^Hp$L.TjUB"3lruV7!rr30u!3ZA%!!)utrrE&u
+rr<&arr3$#!9E#:p]1-i!os>>rr;uu&*a,oUB"3lrtYV"s8Qd5!<3#u!<<'#-NMj!rrR6AUAFoi
+!<<'#-NMj!rsNlJUAkr.m/R*'!!)lq#NPkCs8O,?hYdBZQ2irEs8Nl8lMCMg<<0'!C3^<Srtkau
+rr;uurr;uu'^>YtUB"3lrtYV"s8Qd5!<<'@!9!kV&5N;/s8Q(!WrHgZ%dO'2!9X+WrrDusrrE&u
+rrDusrrE*!![e!$rr31D!2BJo!9EkRrr<Sps8Qj7R/`HP3WB'Y(BEass8N'!lMgeb-NMj!ru6"Z
+UAt5n!9sO`UB"3lrtYV"s8Qd5!<<'H!87AO#BKm>s8N'!lM^b_!<3#u!"\>os.]Qls8Nf6m/R*'
+!!)iprrDusrr<Djs8Sho;ZHbE!87AO&p"&Is8N'!kl:[^!#"Mqs/5p$q>^Hp$L.TjUB"3lruV7!
+rr30u!3ZA%!!)cnrrE#trrE&urr<5es8Sho;Z?^r!<<'#*WY'prrO8Bi;W`\:B7Qt(4uS[eHD!7
+qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj7X!-A/>!p]guq>^Hp$Jtg_rW!$"s"j`&rr33!!!`K'!!)utrrE&u
+rr<&Nrr3.<!!+g;h;SD6!;uls!<)p!V)f+c!!!'!s8N'0hZ*WT!!<3#-NMp$s8)crrr;uus8N-b
+!5AI4!rW*&qZ$Qqs8N-b!5AI4$iL&/s!@a$s8Vus!<3!"V)f+c!!NE's"4<"qu6nP!*T@#'aFC.
+rsSZ)#QMUobTd'D!RLcFrrE&urr<bis8W&u!rr9J!8IPRqZ$Wrs"j`&rr3Q+!!`K'q>pp%_(a(W
+s"jc&q>^Hpr;Zcsrr;uur;Zcss8N-b!5AI4$2ji-s(hZ90p:Ags8N'0g].<N!!WE&JH/jQr=oP1
+qZ$Qq!8%5M!^?\!rr3r9!!WE&!!(mUs8E!"s8OGHg].<N!!*'!56/Fsrs/K&"onT&!8%2LrrE&u
+rr<Sds8W&u!rr9I!8RVSqu?`ms8N)ss8N'+hZ*WT!!<3#56/Fsrt>81"onT&!8dbUrVurTs8W&u
+!r;lr!".T_s8E!"s8OnUd/O%Lq>^a"rr<&ns8N)ts8N)us8N'&hZ*WT!!<0"rrE*!!\OK$r;QgT
+!7:`F#5S<(s!Nd*p=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!fDftrr3&`Lme)=s+h$Zs8W(SM?!U9M#.,N#5X.9s8Rn2rVunRrr<"S
+!;lcq"dt1&X4$e%s8N)ss8N)urr`4U/IDCV!!3*!rr<T(s8Vus"98B.!;HNnp&G*ls8N*!rrN]2
+nG`Fhq>^p"s8N*!rrN]2nG`G"q>^p'#ls`"s7ZKns8W%R/IDCV"TeZ'$NThrrs((T[f?1-%/p&&
+$hOH0s'C"t;u[:-o`"mj!<3#u!#52-s82j!s8NE+p](9e!!*'!%06&"rt+f&%KHJ#!=o-9H?rNi%
+0?+ss8N)ss8N)us8N)ss8N*!rrN]2nG`Foq>^p',QIj=T()RUrr<T(s8Vcm$NL,W!4Mq("UtA+s
+8N'!pAY'n%fl+uru:e7$ig5,!;HNnqu?j!rsAc#s8Vcm!<<'0!:^!f#PnE.s8N'!pAP$k!<3#u!
+"\i(s82j!s8NB*p](9f!!)iprrDusrr<E#s8Vus"98B3!:^!f')DS9s8N'!p](9k!!)cns82j"q
+>^Hp$MXT#qu?j!rs\u#rr32p!"Ju.!!)cnrrE#trrE&urr<5ss8Vus"9/?#!<<'#$NThsrrNW0o
+`"jpoDf@#$AnfVg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj7L!:0Xa!ce9kq>^Hp$N0r(nc0*urrrK"rr32K!&X`U!!)utrrE&u
+rr<&rrr3-5!!-W4q;MAR!;uls!<3!#pM_>]rVup#rr;uu&,cJ-nc0*urriE"s8UdQ!<3#u!<<'#
+#6=PurrVEb/,K;G!<<'##6=Purt4Jq/,obQr;ZfO!!*'!pM_>]rW!*(s8N9'qYU9s'*.%llN8j:
+rsR-R3<(>M0>%5g!rDorrrE&urr<c2s8VWi%0->2!;lfrg&M-QrrrK"rr3PU!&X`UcN-$*-I"3U
+rrrQ$q>^Hpr;Zcsrr;uur;Zcss8N-*!;QQn$0_F?rt#/2A?G\'s8N'/qu?]M!%@mI'*.%llN8j:
+s8N'!qu6Ts#6=Puru:2&/-#VL!;ulsnc0*urriE"s8UdQ!<<'(!;QQn#O)4=s8N'!qu-Qp!<3#u
+!"]#-s7--us8N6&r;ZfO!!)iprrDusrr<E(s8VWi%0->4!;QQn''TBHs8N'!r;Zff!!)rss7-.$
+q>^Hp$N0r(nc0*urrrK"rr32K!&X`U!!)cnrrE#trrE&urr<6#s8VWi%0$;,!<<'#"p"MtrrNB)
+qYpL!cN#g%"bQdJeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj8.!:'R`!rW*$q>^HprVults8N-,!;ZTn"TSW(rr<&ts8N)us8N'!
+qu6U"q0=%^!!@T-s8N)ss8N)urs,t40A$.%!!*#urrE#trrE*!!X&N"rr;uurr;uus8N?2!!<<)
+!<<*#qZ$Qqs8NK6!!<<)!<<*#rr`?!rr;uus8NM9!&)t%rr<'!rriE#qu6le!"Jtm!%RdD$!RD?
+<.+0@pAbU"s8N)us8N)ts8N*!rrN<'qYpNp!<<'##lsf"rrE*$rr3:/!4c'Vn-Jag$i'c%!;uls
+!<3#u!;uls!<<'1#lk&0!W`9$!WVt@*rl9CHi!dB!!)lprsA`,s8VEc%KGYm.f',E!!)oqrsT26
+!s8T*!!!'"rr<&ts8N*!rrN<'qYpNp!<<'.#lk&0!W`9$!WW0"!;l`prrE&urrE#trrE*!!X&N#
+rr;uuq>^Hpr;ZcsrVults8NK6!!<<)!<<*#s8N'!rVultrVultq>^HprVults8N-,!;ZTn"TSW(
+rr<&ns8N)ts8N)us8N)ts8N)us8N*!rrN?(r;?Qr#lsf"rriB(rre;\p=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!fr09rr3&uLl;*/s+pXRs+p^T!JuX1rrn48s8Rn2rVunRrr<"SrVm)s
+[?-3#Mq[1jrrDusrrE&u#A*sLjSo,Y!<3#u!<)rt!<<'(!<E-!s8Duurr;uus8N?+!!<<)!<<*#
+qZ$Qqs8O/B!!<<)!<<*#rrE-!s8W&u!<<(2!,1HmrVururrE,rrs$jN)un(]C&%]7('*b:hVJh2
+!#GP5rrE&urrE#trrE*!$ipA-s8W&u!<<'$!<2ut!r`0%rr39?!:CQXh@T&S(ARq0!;uls!<3#u
+!;uls!<<'1!WW<)!W`9$!WVUs&c_n9YPS;!!"T#.s8E!!s8UIH)un(]C&.f/!!*#trsSr/!s8T*
+!!!'"rr<&ts8N*!rtb\9rr<#t!!*'!!WW<)!W`9$!WW0"!<2rsrrE&urrE#trrE*!#6=i(s8W&u
+!;ZZp!;uls!<)rt!<<'-!WW<)!W`9$!WW0"!<)rt!<)rt!;ZZp!<)rt!<<'#!s&?"rs&H&"98B$
+!;HNn!<)rt!<3#u!<)rt!<3#u!<<'"!<E#s!WrH%rr33%!!E6%M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJj7Q!<)os!pTb$q>^HprVults8N*#!<)p%p]([$rr<&urrW0"!<3#u
+!<)p%cV4ZF!#OSQs8N)ss8N)urs((TP3r;F!!*#urrE#trrE*!!<E3"rrW#s!<3#u!<<')!<<3(
+!W`9$"8`&t!<<',!<<3(!W`9$"9/B%rr3Q+!!*'!/-(k#s7lWps8N*"qYpbH!+c+>!6"[4#n$b.
+$LiF0ZN+5.s8N)us8N)ts8N*!rrE-#rr33!!!*'!!<E)u!r)a&rr394!;HojHpY.>>PS6u!;uls
+!<3#u!;uls!<<'1!<<3(!W`9$"96\A#QOi@i;3KR!<3!+q>^^!s*F`Vs'l&Iq>^HprVm9,!!<<)
+!<<*%s8N'!rVults8N*#!<3!1q>^NqrrE*%!s/K'!!E9$!!)rsrrE&urrE#trrE*!!<E3"rrW#s
+!;ZZp!;uls!<)rt!<<'-!<<3(!W`9$"98B$!<)rt!<)rt!;ZZp!<)rt!<<'"!<E)u#5A0*s8N'!
+p](6nrr3'!!!*#urrE#trrE&urrE*!!<E2trrE-#rVm)s!"/`,K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJj99!:0Xa!rW*$q>^HprVults8N-V!7:`F%/Kr.s8NH,o)Jaf!!*#u
+rrDoq"5eV/#3,[_!;uls!<3!'+TU9ss7lWprr;uurVults8N<O!8IPRqZ$Wqs8N*!rrOqUeF`e@
+!<<'#1'#i#rtZm\h>dNQ!!*'!+TU9ss7lWps8O_Pde`tIAcRCb!2TDi$,Q[3"7c@)N;t=(s8N)u
+s8N)ts8N*!rsU7Tg].<N!!*'!1B>f$rrW#s#6+W/_>m%-nbs5^!%.L@rrDusrrE&urrDusrrE*!
+!\sc*p\t?QJ,ffMs8N'&g].<N!!WB%"_IacXoP9ns8N)trrOqUeG9.E!<)rt!<<'--NMp$s8)cr
+s8OhSeG9.E!;uls!<3#u!<)rt!<<'(,lld$s82isq>^Hpr;ZcsrVults8N-U!7^iErrE#trrE#t
+rrDlprrE#trrE*!!]'i'rr33!!!`K'!!)cn#7CP&s8Vus!<3#u!<)rt!<3#u!<<'#0*'GurrOtV
+d/O%Lq>^a"-]J*!g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!hG/Grr3&uLl;*/s+pXRs+p^T!fi*5rr3E'LlVN8M2;02s8.V.rr<"S
+qYpZ^[>9k&s8N)ss8N)urs&f0p](9a!!*#urrE#trrE*!#7:J*s8Vcm!<3#u!<<'#$iotms8N*!
+rrNT/p%n\(#ls`"s7ZKns8N?)p](9a!!*'!$ioqrrrjGDejTT'q#:Y,!3QM'qurhq?N'p(!<3#u
+!<)rt!<<'-$39i#s7QEms8NN.o`"jloDf@"rs<!3Xp+b$"eu'(q#C?or;Zcsrr;uur;Zcss8N-/
+!;6*d"4(BU%Jp,)!!W,ss7ZL#rr3-C!7jR=l1tAZ!<)p!$iotrs8N)ts8N*!rsT57p](9e!!*'!
+$iotrs8N)ss8N)us8N)ts8N*!rs&i1p](9f!!)iprrDusrrE#trrE*!!Xo)%q>^HprVultrVult
+q>^HprVults8N-0!;-9j#4qm)s8N'!p\tI#!;ulspAb3ms8N)ts8N)us8N*!rrNT/o_e^j%06&"
+rs&)q%K?cls7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj7^!<)os!pTb&q>^HprVults8N-)!;c]p%+"u2s8N-#rr<#T!!*#u
+rrDrr"TH.m!&`d9rrDusrrE&u#6Y&)s8U(=!<3#u!<)rt!<<'("T\H"s4RGQrr;uus8N-)!;lEg
+rrE*!!X8Z%qYq<7!;ulsg].?Srr`?"s8U(=!<<''!;cQl"UtJ"*<>d-rs:"PV%s"""$ck'rVult
+rr;uurVults8NK2!;lfrg&M-QrrrK"rr3&H!&X]T#poYK(&m_*5QJ[rs8N)ss8N)us8N)ss8N*!
+rrNB)qtU0orkC8i2>[@Q!!W9"s4[N$rr3-2!:Cj-p%eXf!<)p!"p"Prs8N)ts8N*!rsT&2qu?]M
+!!*'!"p"Prs8N)ss8N)us8N)ts8N*!rs&]-r;ZfP!!)iprrDusrrE#trrE*!!X8Z%q>^HprVult
+rVultq>^HprVults8N-)!;c]p#1*?,s8N'!p\tI"!<3#uh>dQTs8N)ts8N)us8N*!rrNB)qY^?p
+"p"N!rs$gM2#d`2s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj:.!-J5?!p]h"q>^HprVults8N/%!)`aq%,V%,s8PssV>pSZ!!*#u
+rrDlp"9&9$ro=%Y!;uls!<3!'&HLnls4mYTrr;uurVults8N=i!,V]8l2Uh`s8N*!rrT\17J-W[
+!<<'#\,\tort^duEW?(*!!*'!&HLnls4mYTs8T,";#:1pjT$&A%JTl/lMq8(s8S#_!+Z!-rrE&u
+rrE#trrE*!%$gm0s8V?a!<<)#!)`aq!oEu"rr3;j!"'><s,70_A,-'*#ls_us8N)urrNK,p\k-l
+!<<'#\,\tkrr`6#!WMurrr<4=s8VBb(&n49jT$&A%J]u'!<)p!\,\tns8N)ts8N*!rsY1nD#aP#
+!!*'!\,\tns8N)ss8N)us8N)ts8N*!rs+_fEW?(*!!)ip!XSl$rVultrVults8N/1!(H_`rrE#t
+rrE#trrDlprrE#trrE*!!iuB!rr35\!$D7@#ls_prs)F%V>pSZ!!*#urrE#trrE&urrE*!!il;t
+r;Qi"!)`aq#2]D&s-AWDp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!oJgurr3&aLn4AAs+pXRs+p^T!iq.2rr3D\Lo^RUObi]1s5f&mrr<"S
+q>UNpLl(-krrDusrrE&u#6Y&&s8T"t!<3#u!<)rt!<<'(0`]Q"s31NDrr;uus8N.+!1<EYrrE*!
+!aPenqYq<a!7UuJd/X1Hrr`>ts8T"t!<<'j!3H%s"MOjl#or^>$.&Yl-NF)m&cg;Ws8N)us8N)t
+s8N*!rsUU^ci=$i!!*'!9)u3qrrTD)9`G%uci>%4s8ODY!7:N@!WrH$rVultrr3$%!<)lrrrE*!
+!aPenpAY3k!!<#srr<5Ks8U@E1&h1U^&Tqq*;KR6!<)p!>l^8fs8N)ts8N*!rsUU^ci=$i!!*'!
+>l^8fs8N)ss8N)us8N)ts8N*!rs(1We,THq!!)ip!WrH$rVultrVults8N.+!1<T^rrE#trrE#t
+rrDlprrE#trrE*!!_WNtrr35-!)3Fm!s&;prs'5<lMpn)!!*#urrE#trrE&urrE*!!_EBnr;Qgk
+!3lJ&#-\)$s"TB1p=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj8R!:0Xa!d"F"q>^HprVults8N-B!9!kV$rI#,s8NE+p&G&)!!*#u
+rrDlp!poslirB#Yr;Zcsrr33)!<)rt8cSkjs8N)ts8N*!rs'8=li7!"!!*#urrE*!![Riro`+pk
+s8N-H!7^lF()-c8s8R!;!<<'#!<)rt8cSkkruM0sqYp\.!/C\mp\tP0!"Y(hrt,J9li$k`!<3#u
+!<)rt!<<'-'`dS"s(VN6s8O/@i;W`X;#m`trs<08%upVh&I/=%q#:?q!;uls!<3!!!<E&trrE*!
+![RirpAY3]!!`<"rr<5gs8Qm8Qi@!f@fV8eC\[r0!<)p!,llHjs8N)ts8N*!rsTVBli7!"!!*'!
+,llHjs8N)ss8N)us8N)ts8N*!rs'5<m/R*(!!)ip!<E2us8N)ts8N*!rrOJHeG9.E!<)rt!<)rt
+!;ZZp!<)rt!<<'#*rt6urru=#XoJD%!;HKu$39c!s(;<3rr;uurVultrr;uus8N-A!8dYR!ZqF#
+rr31"!3Q89K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/O>o$F0Kb63EtXs8N)ts8N*!rt>)V"f(nF.gEfhs31NelfVUT!<3#u
+!<)p%/#_n6\H!E)s8N)ss8N)urs+_f5P*`"!!*#urrE#trrE*!#OVg,cgkfN!<3#u!<<')r)*T5
+g\gQQ>PeC"!<<'Er)*T5g\gQQ>Q='o&(0uf!!*'!P5mi=hF%>Ds8VjD"IA`HJc5TN9E5&]p\tQt
+#66^_s3q#Li;N]U!<3#u!<)rt!<<'3mKX6JnnJ.)s8VjD"f(nF.gEfgrsAT.!&srXe,TO-q#:G0
+!/CIOs8N)urrZp7LAh,OrrE*!&H#E-D;5!X]3G:cW:'So!#GG2rr<4Ycgk3>NrAt[9E5&]q#C?o
+rVm<(;?C^ir:%=&s8N'!rVults8Nl&#7f)NC&e86s85arD;5!X]3G=8!!)rsrrE&urrE#trrE*!
+#OM[*dIV;W!;ZWsBE3ecrr;uurVults8NN*;?C^ir:%=&s8N'!rVultrVultq>^HprVults8NT(
+.KuUCf..'@s8Qa4LAgrJ#L*5llfVUT!<3#u!<)rt!<3#u!<<'5paQE4p$72/paQHBq:@,$_#Nh]
+s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh5E#GmUHro]H&n+m"`M#IARM#[JfpPt6nrSrltp](93Lp-^AZA=>9s8RoR
+rs#O^qYSQoT]6"O!;uls!<3!'490p.a@Q@3rr;uurVults8N>S![6^f:B1Cos8N*!rs8?I"HM[D
+kc7#Gs8N*!s!7=e"HM[Dkc7#LdK1`Xk>_K^s8P1]JGR>Y!!*'!mL0E0qV>QYrri<7!!&kirsAH%
+!0I6\NrT7VrVultrr;uurVults8N_^![6^f:B1Cps6U4&_Y_1X%IX5q$2=Q%OT5?A!!;rjrrO/?
+_YsN7!<3!"*!!kSs8N*!rt+oQ"HM[Dkc7#L9"aikQN/l=s8N'&;!-m`!nI;M"TB&7!2]JjrrE#t%
+/2.QNp$B)X$Qdc!!)utrrE*!(=`I0k2fA=!<<)n-j5RnrTL:Js8N'!r;Zcsrr;uurVults8N>P!
+[[$m<<*$prrO/?_YsN7!<)rt!<<'-pF$0)kPaVF63$rb!<)rt!<)rt!;ZZp!<)rt!<<'.m0jB>q
+n`^Mmf3;,!5eO2#CukSp=*4F!<3#u!<)rt!<3#u!<<'5mL0E0qV>QZm0jB>qn`^Mmf1gos7Y.LR
+K34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJjLM)+*3WYmM<;q>^HprVults8N_H"Y87$UBN4Ds8P%YNr-DQ!!*#u
+rrE#t#%l*UmpQ3IirB#Yr;Zcsrr33@!3Z0sMuWkWs8N)ts8N*!rs+Pb=n9jo!!*#urrE*!#i#t$
+VssT?QmV\0rrE*!,hrq@VssT?QmVij!F><EMuWkXrttg>qP]>Q!<<)5"s_@hbW5\&"SrE)!8I8J
+$/bgaeGoP-!!iH#s8N)us8N)ts8N*!rt:=m=n9jo!!*'!^BH.?q4e*Eq#::"huNi-s8P"X#Q4As
+!Y#.crVultrr3$/!8[VRrrE*!&DRg,VssT?QmViFbkgd:!.k"Hrr<4=o$7dNmf*4hq?[-%g\CgK
+!<)p+g^jsnnGD(0-NF)G!<)rt!<<'7NWE;RcA2H#s8Ujc%]AgnhO#Yirr<&ss8N)us8N)ts8N*!
+rs+D^?1ZI&!!)ip!Y#.crVultrVults8NM_&.YW-qqd\es8N'!rVultrVultq>^HprVults8NPC
+"Y87$UBN4Ds8NN.h>%!T2uo!9\s36qrr;uurVultrr;uus8NeI"s_@hbW5^<"Y87$UBN4Ds,M^2
+p=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nId/O=KRP5!U5IL:drrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)t
+rs%.g*!-dQh;\J7!;uls!<3!'qJ6`J6/MYBrr;uurVultrr32S2$>GQ!!*#urrE&u#QCD^&-<S?
+Wqubq!<3!:rh2Rg!YnD/s8US*">%dt!WW2rC_6k;hZ*ZUrrr%3)?M%;rVluO!!:pKrs*NDOoPIQ
+!"Jl+rrE&urrE#trrE&u#1k^8/'@nmrr32rFWgo"9#pl0#B9a+s8VZj%JTl.mnsf"!<<'!!<3!(
+mnsf"!<<'!!<3!/rh2Rg!YnD/s4M!(!Y\PhqZ$Qq"Sl7,(5;\d"4mMSg\CgK!;uj)rh2Rg!YnD/
+s8N'!rVultrr32S2$>GQ!!*#u$iZhb&-<S?WrN)!!;uls!<3#u!<)rt!<3!&e2.:Zbl@e?rs8'k
+'*/+5rr<&ts8N)ursSh"5S*u39WJ-m!!)utrrE#trrDlprrE#trrE&u#530_"V=;Hrr3,i;A0'2
+qYpg"N>Md^irB)Ys8N)ts8N)us8N)ursn[<)?M%;s8Ve8+U&ELa8Z)>N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5E#5uE*MNFt,q#CAMrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eOs8N)ss8N)urs/0m#n'o2!!*#urrE#trrE&u#-/sN5O\XQrr;uurr36#M)5VD*aZb\
+s8N)uru1ck1^jL.?GlgCV]l70n,NOis7B+o$X*6)!<3!%jAulp0;ndK".0&kp\+Ul*!#+#s5a5#
+r;Zcsrr;uurVultrr32',6L1"!!*#u#3T5,!u>2,r;R!A!9O7\jT$:prs74?$ipA.rr<&urs74?
+$ipA.rr<&urt#!`1^jL.?GlfX;A'$MC%qK(rr<2k4p*%1r;Qkd!!N&ks8N)srsS^\1^jL.?GlgC
+!!)utrrE&u#-/sN5O\XQrr3B'M)5VD*aZbarr<&ss8N)us8N)ts8N)urs#AF"@;MW!r;j%f00TD
+!<<'!!<)rt!<3!+qh[-<"<Lmes8N'!rVultrVultq>^HprVultrr32c>S[DW?0V@g"P5gG!<Dur
+#Q8?H#Zpg%!<3#u!<)rt!<3#u!<3!.jAulp0;njMk?Jc)(1$2(rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/O=;@i,:dBCP]rrrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)t
+rs#;c$j7r1r8RbV!;uls!<3!'eN*jJGl.OArr;uurVultrr31V('e+?!!*#urrE&u#OZX^#mVks
+h"q'N!<3!:mW0f`#:ONGs8RWb#[d3(#ljqT3X$4Bqu?`rrrp8,$3ri>rVls\!"f)%rs&u5oDeiQ
+!-.r:rrE&urrE#trrE&u#)*ft>kn@"rr32A8e;.MG4tk6#7U\)s8S2]EVKJ=W\=YY!<<'!!<3!(
+W\=YY!<<'!!<3!/mW0f`#:ONGs.r!i"=Jj"qZ$Qq"Ni1s2:qd+"$-Dnr:p<l!;uj)mW0f`#:ONG
+s8N'!rVultrr31V('e+?!!*#u$gr'b#mVksh#IBS!;uls!<3#u!<)rt!<3!&JJAGtoDf0mrs5VY
+#6=i)rr<&ts8N)ursS79.1$5-DqtBm!!)utrrE#trrDlprrE#trrE&u#/s1G"X8-`rr3,$0F%UY
+qYpfn9aD;Squ?`rs8N)ts8N)us8N)ursln5$3ri>s8U&1&-X8$pAY'mK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIJcDGD!r;m%lMgq=!#gFgp&>*H!#hs=!r;m%JcGQG!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKU&P2c!"S;o!hTHWJcGEC!hTHWXT&@n!"OS[q>UJPs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcDGD!mL^*lMgoJ!2G,Fp&>(U!2HXq!mL^*JcGQG!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcDGD!oa1ulMgq)!.KM!p&>*4!.M$L!oa1uJcGQG!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKU&P2'!']]J!b;;]JcGEC!b;;]XT&@2!'Yu6q>UJPs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcDGD!`]5tlMgo6!:>@;p&>(A!:?lf!`]5tJcGQG!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcDSH"usj)fero(li.%Y9celcp&>*c9cgM<"usj)fero(JcGQG!K@'P
+g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKV>ga,h#5/$"Q8VG!pL@kJcGEC!pL@kYQ"f6h#5/$"Q4k2q>UJPs7Y.L
+RK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcDSH#(Z"8W<Wq(li.%;$'Tr?p&>*E$'VRm#(Z"8W<Wq(JcGQG!J:@F
+eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcDSH"jKLE"YZM6rrW6'1ua)dpAY3p"#T#@rrpY:$O&2UJcGNF!K@'P
+g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKV>g_"1^47N_X%4(!!Z-lJcGHD!rrO!poj]$X#("e5Ji!Oq#:AOs7Y.L
+RK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcDSH"cOc1&5qZVrrW60D#AkapAY3p$uGjFrrn?.!t\AmJcGNF!J:@F
+eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI_#OE7QN-sb])Vd1huE]V_uK`:l2Ub`rr;uui;WrXKdI!(qu?ZraoDA@
+JcGQG!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDgZ5s+m!@rrBY1rrCsVrrBt:rrD<`rrE&urrD!W"SldO!s&5urrC1@rr@WM
+q>UJPs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KC_#OE7QN-sb])Vd1huE]V_uK`:l2Ub`rr;uui;Wr?<"o?5qu?ZraoDA@
+JcGQG!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJs%C!!2lprrBP.rrD'YrrC@ErrDNfrrCsVrrC4ArrDusrrD<`rrE&u
+rrDcmrrDHd"/>j%p%n^g!6P9@!7:cG!3H2$N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8FqM5-.q#CAM\,ZI.irB#YcN!nEn,NCfhuE]Vb5_JAr;Zcsl2Ub`rr;uu
+pAb-mmJd8]!202bs8N)@s8N)Gs8N)#rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJs%C!"&H#rrBP.rrD'YrrC@ErrDNfrrCsVrrC4ArrDusrrD<`rrE&u
+rrDcmrrDHd"!.H\rqcZp!6P9@!7:cG!3H2$K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIbl7b&!#,/-rrBP.rrD'YrrC@ErrDNfrrAqrrrDusrrD<`rrDThrrDHd
+!Z_:/^]4<6d/X+GXT&<[s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh)A!o&O$q#CAM\,ZI.irB#YcN!nEn,NCfVZ6Yrr;Zcsl2Ub`nc/UhmJd4m
+!;jP2rrCFGrrB/#!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCbl7`;!0$^QrrBP.rrD'YrrC@ErrDNfrrAqrrrDusrrD<`rrDThrrDHd
+!X&N&^]4<6d/X+GXT&<Qs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIbl7a#!)E=hrrBP.rrD'YrrC@ErrDNfrrAqrrrDusrrD<`rrDThrrDHd
+rrBe5rrCFGrrB/#!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh)A!h5#$q#CAM\,ZI.irB#YcN!nEn,NCfVZ6Yrr;Zcsl2Ub`nc/UhmJm1d
+^An35d/X+GXT&<Xs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCbl7_W!9*_QrrBP.rrD'YrrC@ErrDNfrrAqrrrDusrrD<`rrDThrrDHd
+rrBe5rrCFGrrB/#!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIc2RnB#6N`Vs8N'&rHo4a:%\Gb#536c"qjVPrr;uurVultrr;uu$MI*p
+s8.Br"pm,PirB#YrVult$iPGg%qkq>Eu,0]q>UEo!!N+)#T/Bss8N)urs&C\0F8.P\c2X/!"8aQ
+((Y'Xqf<P\;Yg=l#5jH7#n0&/rr;uu#Q9#_#u1'ls8)fmrsA@<*X!O>s8N'!rr33#NA(YI5Ipdn
+#4mWf!uktLrr;uu"oWf]#u1'ks8N)us8N'&rHo4a:%\Gb#1YR7/C"4qq>^HprVultrr;uu"SlC1
+(l8%gqZ-Zrrr<6$HkH`[o`"jpr/EB:$pV;us8N)us8N*!rs/FQ-jBu7QN-g^qYpipG9[;)9ZmD8
+qZ-NnrrE&u#1YR7/C"4qrr;uu"oWf]#u1'krs&1@,6ecSb5VG@!"8Kn"98E!NA(YI5Ipdn#2(m<
+/Bn.pq>Uj#NA(YI5Ipge!!VrmrsS]1!nI>KNA(YI5Ipdnrr<<&HkH`[o`+sg!!iQ$Jg^g01mYWN
+!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh,B"8[k2qtU3kL^!^^N/tOKrr32q[$-?1[.aM!s+pXRs+p[Ss+h$ST8<OE
+\X&)4Vq^52rrE#trr<H&?4Rm.s7KM+&9.XJs8N'%nNm@)Y5\J$!<3!&pN7\b&Q%<_s8N',q-FRK
+L]@$M&.ig[rr32sFX%)&:u2-Nrr<<">6tgSrVuop!;c^%j]W?$/Z/RJ!!*#u#5<6b"qa\frr32c
+B+>(kKDtlMrr<5u>6tgSrVlis!<3#u!!W1&#nLbKrr32$,6U@(!!)iprrE#trrE&urr<2l63JU;
+qZ$Ems8W*!"o2@/%r)"Ars&4?,6e`Vh>.*N!<3#u!<<'(p1PHK%77B#qZ-Km#jGY4!uPD2s8Vrr
+qu?Zrrr32$,6U@(!!*#urr<5u>6tgSrVlg$l!>2/(glV.s8N',kV3,<s7^X\"qa\frr32*,QpI(
+!!)ip$hncg"qa\fs6'Fir;Q^(o`>6gs7^X\"qa\frr;uu#PhR1%r)"Bs8)d$s7U+H!t@T&\,QJc
+s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCc2Rmm!=eu%s8N'&k!B4hNW/qW#09IN"seHfrr;uurVultrr;uu$G.>[
+s4^Kf!YeY_irB#YrVult$Kjha+gD!u5RAEqrVult"O&D$2qe31rrE&u#2`](";tkCrr;uu$Kjha
++gD!u5RAEqrVm)Z>o<b_BCc'%rr<;d63S6drr<#q!;c^%`((7A5Kj*,!!*#u#2`](";tkCrr3/P
+9F(nZUAb,l!!VLO"W<=!rr;uurr;uu"m/,T)3+Xprs"&j$"3Q/!;ZZp!<)rt!<3#u!!LLs"uk63
+s8)frs8N'&k!B4hNW/qW#2`](";tkCq>^Hprr;uus8N>Y<##HK<RUpE!;c^$a@m3N,^B(`s8)fn
+s8N)urs"&j$"3Q/!<3#u!!VLO"W<=!rr32D9G.OTGk_4;rr<G=*Wc<@hd%*&)/&O>rs"8r$"3Q/
+!;ZX&hd%*&)/&O?U&ZS?rr3AS!=er+hd%*&)/&O>s8N'(k!B4hNW/tXqZ$m$gJemh'NNSjrrI`O
+p=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIc2Rk"!#>8.rr<b"]D7?b3<0$R/d8!EegUg@s8N'!rVultrr;uu$@p=Z
+s+(/OkPX"RirB#YrVult$^eF"P5o3.\,)9g5lUf`!',n\nPoUQs8N'!s8Vse"Hi?>8-H="rr<%d
+\,)9gAn\[MP5mlJs8,=iOn@g-"LS4/!!&@tq2554rr;uuq#;E1.Kl%.l@K!8!!*'!qa^jPo]JaJ
+[/]n:WVQ%A!&X]Trr<4h]D7?b3<&sX!<3#u!"YF.q2554s8VHj&('lb!!)iprrE#trrE&urr<4Z
+c1+d7P5>4Y!;uls!"bL/q2554s8Vse"Hi?>8-H<rs8N)us8N*!rsF;W=6KM7ErZ.>!;QR&pau`E
+pspku_uK`:!;QTo!<<'(m04*JnnnF-rr;uu.[RdCMZ>a:s7e2MUA3:g#/gK@!!%PmirAmH"Hi?>
+8-H="mg'BInRhh%qYq!$8-G(Ik=>`_s)S0Mrr3bg!#bh68-G(Ik=>`_s8N'!Qb3'O!''uXrrE#t
+#(ZbUkPX"R\,QJfs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh,B!nE+!p](8L'XR-%Y)($rs7hY7ir.krO8/bTLku$0s+p[Ss+h#]o&B\B
+Ls#Mjk-*eErrE#trr<F1de6fD\NA75=TFH\s8N'Z:ZURY!n[JP!!*'!p)OCCq:->gkl:Y_!*[hE
+=TGuode6fDNW9%P*=&kFeJSYVs8N'!?.JRE!.k.LrrDio*psFC[.rEas8N'!s8Vd5#I4*T)$oI+
+n0l<Sk$\74rr;uu"^T[N;#l1Hs8N)us8N'0?.JRE!.k1MdK1WTk#;<\q>^HprVultrr;uu"]+4?
+*s1'js8N)ss8N'1?.JRE!.k1Mp)OCCq:->gkkb>Z!<3#u!<<'+1B<F(q8u\:rr<&ors\?+$c2_U
+$4cS*rr<&os8N*!rs-sR,3J#e!!*#urr=NSeau]=JcGc=%L^,M^^:S@s8N'!7cV;ap)OCCq:->g
+kl969+6;KW!!)lq%/(\HZ2)of#jD:2!6>*=(8Lpls7RH<Z2)of#jD<g!!$<ToMGU>rr;uurVm'X
+!0-LDb#GkM!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCc2Ri3!1*BZrr<aBkNF#gcN!p]"tS="TER"Ds8N'!rVultrr;uu$>&^U
+rtPO;p@YpNirB#YrVult$XMl\,66Lrjm42le,KCI!'+fabmasIs8N'!s8Ua\*m4Ak$R#0Crr<%)
+jm42lgem2",663ms4If%b58aX+SPj8!!$KkkTBlNrr;uuq#;DL"sV7fb;oV&!!*'!faJqEqmm.X
+pA_irgAKPS!6"m:rr<43kNF#gcMmkD!<3#u!"WQ%kTBlNs8RrW>4U$u!!)iprrE#trrE&urr<4;
+n]_LKn,!(a!;uls!"`W&kTBlNs8Ua\*m4Ak$R#0>s8N)us8N*!rsBJ@YP.Y!1B7@S!;QR&_?MOB
+pRh[Cq#C?o!;QTo!<<'(M?-oOd#.l(rr;uu.UqT)+99^es2"sjfCtpA0DPSI!!$U"IfJ(0*m4Ak
+$R#0COo\VRc%l?"qYpuW$m*Rg\dKYSrso+nrr3a$!1s5D$m*Rg\dKYSs8N'!@cuqt!7(TDrrE#t
+"r.-Ap@YpN\,QJ\s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIc2Rik!*/dnrr<C?s8V`l$NL..!)`aq#2T>&s8N'!rVultrr;uu!,;H4
+!XSk+hZ*TUrVult$YKG=p&G8.s8Vcm$NC)*!"NfEs69S"s8N'!s8T_37K3<'lMqn(rr<%2s8Vcm
+"_Rf7p&GI"s1A>#rr3Dm!#tt<!!$a5s7H@!rr;uuq#:Dq!)NLlrrE*!!k\M%rr3&c!#th8!rW*'
+rr;uu"_n#:o`,?us8N)us8N'0C&e5+!"/c+PQ5Y%s6BXbq>^HprVultrr;uu"`+/<l2VUrs8N)s
+s8N'+C&e5+!"/c+]DtD"rrVKd)uBU7!<3#u!<<'##lpt%s8N)orrT;&;?$S"h>e\urr<&os8N*!
+rs+bgDu]k'!!*#urr<C?s8V`l$NL..!)`aq#MoG's8N'!C&\,6]DtD"rsS,m)ul6)C]FG!!!)lq
+!k\M%rr32g!#tss!#PY7#'9ics1A>#rr3Dm!#tt<!!$a5s7H@!rr;uurVlp*!3*=)!K@'Pg]X2K
+qc-XH~>
+s&FUMJH16$JH1B(rDh,B!ge`$p](8L$KhBgon\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<rr3%V
+M!*XprrE#trr<GHs8VBb$c`5Hl2VV!s8N'/cN!ph!&FTS!!*'!@fW/#rtj#^5l^ia!65'=lMq=4
+s8V?a(B=DE!2'8j%+"u>s8N'!aoDD*!#5G4rrDio!_<<lqu?Zrs8N.1!2'8j!mgp4qu6`n!"Jr-
+rr<5Es8V<`'`S.4!<3#u!"[3Os60Lts8O_PdJs6n!!)iprrE#trrE&urr<5Js8U=D1A_%N!;uls
+!"-jJs60Lts8QR/TDnilci??-s8N)us8N*!rrN9&bPV>>!;QQq9E;<rrs#S*:B1=o!;QTo!<<'(
+0*'E"s3L`Grr;uu$H`>Jkl;Fts%EEsrr35*!)ERo!!(7BrrQ[1TDniuci??21'#W"s2tBBqYpV,
+!2'8j#1*?8s0D\_rr30E!7:aU!2'8j%+"u>s8N'!aoDD*!#5G4rrE#t!WrGGZi:&_s7Y.LRK34b
+<Ib~>
+s*'"oJH16$JH1B(s*+KCc2RhU!9EnSrr<Djs8Sho;ZHb=!9!kV##>6%s8N'!rVultrr;uu!:'R`
+!W`;^hZ*TUrVult$g@WjW;mRps8T"t>5nR%!"S;os(_V%s8N'!s8OGHg&D!fEr_s7rr<&_s8T%u
+''TAqVuU$$s!Ig"rr3CJ!2BMn!!)9`s.]Qlrr;uuq#:C:!8dVQrrE*!![e!$rr3%@!2BAj!os>>
+rr;uu"mQ'eUB"3ks8N)us8N'0l2UdY!)ijs'`dV#s)%f:q>^HprVultrr;uu"mZ-fCB0aus8N)s
+s8N'+l2UdY!)ijs-NMj!rrR6AUAFoi!<3#u!<<'#!<D3Xs8N)orrO8Bi;W`\:B7Qtrr<&os8N*!
+rs'8=m/R*'!!*#urr<Djs8Sho;ZHb=!9!kV#>Y?&s8N'!lMgeb-NMj!rsNlJUAku/lMplu!!)lq
+![e!$rr31D!2BKk!13]b"qCY!s!Ig"rr3CJ!2BMn!!)9`s.]Qlrr;uurVlp"!9CKd!J:@FeHD!7
+qGgOG~>
+s!WEuJH16$JH1B(s![nIcMn"B!s7QXs8N'+hZ*WT!!<3#1]Yo%rs&<"#64]'!<)rt!<3#u!!(XM
+rrm3=!ATbniW&oXrVult$f:p`rVurTs8W&u!ri6"!"Rc`s8)d"s8N'!s8P:`^Ae-Kr;[$$rr<&U
+s8W&u!8dbUrW!$"s$$Ltrr3E*!!WE&!!(mUs8E!"rr;uuq#:CJ!7LcErrE*!!^?\!rr36%!!WE&
+V)f+c!!!'!s8N'&hZ*WT!!<0"rrE&urr<Sds8W&u!rr9I!8RVSqu?`ms8N)ts8N)us8N'&g].<N
+!!W6!rrDusrr<D_s8W&u!rr9b!5AI4!rW*&qZ$Qqrr;uus8N7=!!+g;h>[HS!;QQq1]Yo%rs&<"
+#64]'!;QTo!<<'(-32j$s82isrr;uu$Jtg_rW!$"s"j`&rr36"!!`K'!!(XMrrPCb^Ae-?r;[$$
+-NMp$s8)crqYpU]!5AI4&H)S4s8=)Bdf9(D#Q"Hb!5AI4%/g/0s8N'!hZ*WT!!<0"rrE#t"`+/>
+0p:A$rrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh/C"8I\0r:g6kL^O%Zs8Ih2s8S+8qYpL!qM:13s+lL0s8RoSs8RlTqu6U!
+R>?["deMf$rrE#trr<H$s8Vus!;HNnqu?m!s8N'/p](9e!"/c+!!*'!%fl+urtkM3$ig5,!;HNn
+qu?`ks8Vus"TSK4!:^!f%/Kr3s8N'!p](9k!!E6#rrDio!Xf##qu?Zrs8N-2!:^!f#PnE.s8@a*
+$2so)!WN-!!!W,ss82j!rr;uurr;uu&,6,(qu?j!rs8]"s8Vfn!;ZZp!<)rt!<3#u!!W,ss7QF"
+qZ$Qqr;Zcs$MXT#qu?j!rso,!rr3&r!"8Z'rrE&urrE*!"XF'K9V1bQs8N)orrNW0o`"jpoDf@#
+rr<&os8N*!rs&i1p](9f!!*#urr<E#s8Vus"98B1!;-9j#P8!*s8N'!pAY'n%fl+ursSZ'$i^P6
+p](9e!!)lq!Y5;#rr3Q+!"8i'#Qsc"mK!gsrso,!rr3E'!"8i,!!)cns82j!rr;uurVm$H!!,cb
+n@&>tM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCcMn!a!>>A*s8N'+r;Zff!"Ao-"p"N!rs$dL2#mRU!<)rt!<3#u!!)oq
+rrir6!G&>.iW&oXrVult$iL&)nc/[fs8VWi&H;_0!"So+s4RH$s8N'!s8N<(q#::0kl<76rr<&s
+s8VWi!;ulsnc07$rs&Q!rr3Dk!%\*L!!)rss7--urr;uuq#:C"!;cTmrrE*!!XA`#rr35f!%\*D
+E$GSd!!!-#s8N'&r;Zff!"Al,rrE&urr<T-s8VWi%0->2!;ulsgAh6Ls8N)ts8N)us8N'&qu?]M
+!%@^DrrDusrr<E(s8VWi%0->4!;QQn!pK\8qZ$Qqrr;uus8N66!!-W4q>UEo!;QQq"p"N!rs$dL
+2#mRU!;QTo!<<'("T\K#s4[MRrr;uu$N0r(nc0*urrrK"rr35L!&X`U!!)oqrrNE*q#::$kl<76
+"T\H"s4RGQqYpU%!;QQn&Es0Fs6Bdpqu=/,49,<c!;QQn%-[aBs8N'!r;Zff!"Al,rrE#t"V:Y7
+A?G[9rrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIcMmss!#YG0rrE#trrE*!!XSl&rVm$$!rr9#!<)rt!<3#u!!)oqrs&:E
+*rl9CHfG)*!<)rt!<)rt!<)rt!<3#u!!)lprtGG6s8N'!s8NB*!s8T*!!!'"rr<&ts8N)ts8N*!
+rsT26!s8T*!!!'"rr<&ts8N)us8N)orrN?(r;6No!<<'2#lk&0!W`9$!WTS.0A$.%!!*#urrE#t
+rrE&urrE&urrE#trrE*!!X&N#rr;uuq>^HprVultrr;uu!;c]p!<</ss8N)ss8N)ts8N*!rs/o2
+!s8T*!!!&rs8N)us8N*!rsJRI*rl9CHiO*G!;QQq#lsf"rriB(s8N'!q#C?os8N-'!;lcqrrE&u
+rrE#trrE*!!XSl&rVm'%!rr9#!;lcq$jcn9!s/K'!!3*&!;c]prrDoq+:/#M!s/K'!!3-"])Y+r
+d/Yj"rs8Z-!s/K'!!3-"!!)utrrE&urrE#t#5NNd!!!+J\,QJfs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh/C!mZUrpAb/KrVunRs8N+VM#@8VLl)03Lku$0s+p[Ss+pXR#5GTfLkpuC
+irB#YrVultrVultrVultrr;uu)#jR8rW!!!rr<'!rrN0&!s/K'!!3-"!!)utrrE#trrE*!$j$D2
+!s/K'!!3-"!!)utrrE&urrDio!<E2ss8N*!rt,;4!s8T*!!!'"AcQN*rr)ltrr;uurVultrr;uu
+rr;uurVults8N<)!<3#urVuros8N)ts8N)us8N'&rr<#t!!2rrrrDusrrE#trrE*!#Qau.!s/K'
+!!2rrrrE&urrE*!$L_C9!!!5,s8N'!q#:Bt!<2ut#6"T)s8N'!q#C?os8N<)!<3#urVurts8N)t
+s8N*!rrN9&rr2p&rW!'#rr<&urr3Q3!!<<)!<<*#rrE-!s8W&u!;c^<!WW<)!W`9$!WW1+!1j.E
+!-nPD!WW<)!W`9$!WW0"!<)rt!<3#u!<)p%mpQh/!!]X9rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCcMmr-!2&ubrrE#trrE*!!<E3!rs&5u$NL,+!<3!"rVurts8N)trs$eD
+#QOi@i8Xe:!<)rt!<)rt!<)rt!<3#u!<3!5q>^^!rr<'!rrE*%!s/K'!!E9$!!)utrrE#trrE*!
+$ip>1!s/K'!!E9$!!)utrrE&urrDio!<E2ss8N*!rt,83!s8T*!!!-$/-(k#s7lWprr;uurVult
+rr;uurr;uurVults8N*#!<3!"q>^Nks8N)urrW0"!<3#u!<3!"q>^]qs8N)ss8N)ts8N*!rs/W*
+!s8T*!!!,ts8N)us8N*!rsI(H#QOi@i;`fW!;QQp!<E)u#5A0*s8N'!q#C?os8N*#!<3!"q>^Np
+s8N)ts8N*!rrE-#rVm)s!"/c+!!)ut$NU50!s/K'!!E6%!<3!"q>^Nlru_=B!s8T*!!!-$s!7Zu
+s"j`!s8N*"!s8T*!!!-$rr<&ts8N)us8N)trs$eD#QOi@i4&^eK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIcMmr]!+#<urrE#trrE*!!]'i'rr3E'!!`K'$NTbts82isrr;uuqYpZT
+J,ff5s8N)ts8N)ts8N)ts8N)us8N'/g].<N!!WE&!!*'!1'#i"s8N)ts8N)ts8N*!rrOqUeG9.E
+!<)rt!<3#u!;QQq0*'Gts8N*!rrOqUeGB1M+TU9ss7lWprr;uurVultrr;uurr;uurVults8N<M
+!8[\Tqu?`mrs&o3o)Jaf!!*#urr<5Ws8Vrr"oA9!!;uls!<)rt!<<'#1'#hrs8N)us8N)srs.G3
+!!`K'!!)fo!]'i'rr33!!!`K'!!)forrE*!#:0B+s8Vus!<3#u!<)rt!<<'#1B>f$rs&<"#64]'
+!<)p!1'#i#rs'nOg].<N!!)lq!\sc*q>Uiq!"Am-!Or+/1'#i"s8N)ts8N)us8N)qrr_//!!]q4
+!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh/C!gST%pAb/KrVunRs8N.\M#.,N%/Pd?s8Rq3rr<#qLku'1s+pOO"6m4L
+NoL*=!<)rt!<)rt!<)rt!<3#u!"Sc's7ZL#s8N'!s8NK-p%eXf!<)rt!<)rt!<<'#$iotrs8N)t
+s8N)us8N)orrNT/o_\[g!<<'#$iotsrs&f0p](9a!!*#urrE#trrE&urrE&urrE#trrE*!#71D)
+s8Vfn!;ZX"!s&9!s7ZKnrr;uu"o&&spAbQss8N)ss8N)ts8N*!rrNT/p%8:a!<3#u!;uj%cX?e_
+s8N'!q#:C)!;-9j#4qm)s8N'!q#C?os8N<1!;HNnpAb3ms8N)ts8N*!rrNW0o`"jpoDf@#rr<&t
+rrNT/p%n[n$39i#s7QEmqYpU*!;60f$g.L.rtPS&s8NK-p%eXf!<)rt!<3#u!;c]tcX?e_\,QJc
+s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCcMmqT!9a(UrrE#trrE*!!X8Z$rr3DR!&X`U!W`6"s5!_Urr;uuqu6fu
+^GGpJirB#YrVultrVultrVultrr;uu%f?;+gAiW$rr<'!rrrK#q>^HprVultrVults8N-)!;lTl
+rrE#trrE&urrDio!X8Z$qu?Zrs8N-)!;lWm#6Y&)s8U(=!<3#u!<)rt!<3#u!<3#u!<)rt!<<'(
+"T\K#s4dSSq>U[$!<3#uh>dQTs8N'&qu?]N!%7XCrrDusrrE#trrE*!!X8Z%o`+pkrr;uurVm0&
+^GGpJs8N'!q#:C"!;c]p#1*?,s8N'!q#C?os8N<-!;ulsg].?Rs8N)ts8N*!rrNB)qYpL!ci>p&
+rr<&trrNB)qtg<t"T\H"s4RGQqYpU$!;lTl$_[Q3rsAl's8N9'qt^9l!<)rt!<3#u!;ld!rkC8i
+27NSdK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIci4+A!<_Z]s8N)ts8N*!rrT8%;?$S(hZ+bus&&ins8V9_!<3#u!;ZWs
+rVuuuj8],ZrVultrVultrVultrr;uu%W)1FlMq\"rr<'!s0r%tq>^HprVultrVults8N/1!(H_`
+rrE#trrE&u!XSl$q>UMs!)WRmrrE*!!k85!qYpd4!9F1[h#IHSs8N)ts8N)us8N)us8N)ts8N*!
+rs+_fEW?(*!!)ip#>tPus8V9_!<3#u!!R3=s6BY"qYpU'!;HHlrrE#trrE*!!k85!o`+pkrr;uu
+qu6p#!!3*!#ls_qrrT8%;?$S"hZ+burr<&os8N*!rs+_fEW?(*!!*#urrE#trrE*!!iuB!rr32[
+!$D7@!!)ut!k85!qYped!,V]8l2Uh\rrT\17JQlcEWD@)&cVe3\,\tns8N)ts8N)urrNK,p\Oml
+rVuuu\GlSgs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh2D"8@V0rV$9kM#IARM#[JVX,,L/rs[V;X8i3^M"UfJjbS`ls8RoNrrW.T
+M;nR8!<)rt!<)rt!<)rt!<3#u!"R?Ts3:U!s8N'!s8Q@)R/-d^!<)rt!<)rt!<<'#>l^8fs8N)t
+s8N)urrN9&rV?Hp8H>jhs8N*!rrQI+R/6gf"9A8ts/5ntrr;uurVultrr;uurr;uurVults8N<W
+!7UuJd/X1Brs'5<lMpn)!!*#urr<5Ks8U@E1&CnO!s&;us8N)ts8N*!rrQI+R.UFY!<3#u!;ld$
+qZ$]trrW9"q>ULh!3lJ&#-\)$s8N'!q#C?os8N<W!7UuJd/X1Gs8N)ts8N*!rrPgnYl=Y,YQ.As
+rr<&trrQI+R/6gf0`]Q"s31NDqYpV&!1<Q]"<[]j!%7dG!aPenq>^HprVultrr3$%!<)co!rDs!
+\,QJcs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCci4*T!?(k0s8N)ts8N*!rrO8Bi;W`b;#m`ursAc!s8Q^3!<3#u!;ZWr
+m/R@Ms8N)ts8N)ts8N)ts8N)us8N'/li7!$!13`c!!*'!,llHjs8N)ts8N)ts8N*!rrOJHeG9.E
+!<)rt!<3!!!<Dop!Zh?uqu?Zrs8N-H!7^lF#6Fo(s8P[k!<3#u!<)rt!<3#u!<3#u!<)rt!<<'(
+'EIM"s).l;q>U[,!;6BlB)hr2s8N'&li7!$!13Q^!<E2us8N)ts8N*!rrOJHeF`e@!<3#u!;ld#
+m/R@jrrE,prrO8Bi;W`\;#m`urr<&os8N*!rs'5<m/R*(!!*#urrE#trrE*!!ZqF#rr31"!3Q;$
+!!)ut![RirqYpd8!:0[bC&e81rrOJHeG0%H%KMLhJc>ZN,llHjs8N)ts8N)urrE-#q>UN`!!]q4
+!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIci4'o!#tV2rrE#trrE*!')3p[U\WLl#/L9=blApQk?e2hrr;uurVm'P
+W:'So!#FSorrE#trrE#trrE#trrE&urr<mlcgk3>NrT+Z!<<)s;?C^ir:%=&s8N'!rVultrVult
+s8NN*;?C^ir:%=&s8N'!rVultrr3(6!/CIKruUqb"IA`HJcG`M!<<)s;?C^ir:%=&s-!FIoA2k8
+!<3#u!<)rt!<3#u!<3#u!<)rt!<<'(m0+$Jo5F[0q>U]E!$U[k?N:**s8N'&LsPWp!KR$V")%[h
+rVlis!<)rt!<<')r)*T5g\gQQ>PeC"!<3#u!<<'-/#_n6\H!EFs(DCerVHO&paQHBq:@,$_#OE7
+!;QTo!<<'(m0+$Jo5F[0rr;uurVults8NN&.KuUCf..'@s8N'!rVmK-;?C^ir:%=&s6^+%cgkfN
+!;c^$r)*T5g\gQQ>Q4X*huF&`=8r4.r)*T5g\gQQ>Q=^'!<)rt!<3!,BE3ecs8OUJmejTq(:X;E
+N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh2D!lp+op&G&JrVunRs8N`+NfE)tj,K)ns8U#nYP[XkLku'1s+pXR#-6\Y
+qp("jirB#YrVultrVultrVultrr;uu(f9AW+Tg3orr<'!s7[oENp$B)X$Qdc!!)utrrE#trrE*!%
+/2.QNp$B)X$Qdc!!)utrrE&u!ZV3Wq>VN($jj?<h-g9_!!*'!pF$0)kPaVF62s%IJGR>Y!!*#ur
+rE#trrE&urrE&urrE#trrE*!#LWZ"kN>hF!;ZX"JH/[Ce6)bOrr;uu"]4@D+Tg3jrrO/?_YsN7!
+<)rt!<<')pF$0)kPaVF62LW]!<3#u!<<',9"aikQN/lBru;$Uq>Ulj$k'rL_@$h@s8N'!q#C?os
+8N>P![[$m<<*$us8N)ts8N*!rs\9'$c;eX$OuP(rr<&trt4uR"HM[Dkc7#LeH-oVj\GjVqYpiq-
+j5RnrTL:Jrr3,+!#P^Irr3E$-j5RnrTL:Js8N'!rVultrr3$>!5ea8#"lQ$pQkk:\,QJcs7Y.LR
+K34b<Ib~>
+s*'"oJH16$JH1B(s*+KCci4&'!2oMirrE#trrE*!'#+T#f_M9G/GT8F2uo!9\s36qrr;uurVm(6
+bkgd:!.j/0rrE#trrE#trrE#trrE&urr<mPo$7dNmf3:e!<<)S&.YW-qqd\es8N'!rVultrVult
+s8NM_&.YW-qqd\es8N'!rVultrr3$/!8[JN*khh'bkoUEs8N'!s8Ujc%]AgnhO#Yi)$$i9W/L]V
+rr;uurVultrr;uurr;uurVults8N=]!F><EMuWkRrs(L`Nr-DQ!!*#urr<4=o$7dNmeZqb%055_
+s8N)ts8N*!rs7Bk%]AgnhO#Yds8N)us8N*!rsNG_qX7hmJcG`Z!8[JN%)2rrf_M9G/GT8F!!)fo
+rrE*!#DrOfo?iKs!<3#u!<)rt!<<'-^BH.?q4e*Eq#C?o!<)p0g^jsnnGD(0-NB),=n9jo!!)lq
+#i#t$VssT?QmVh4"Ao.*!9=(Y%,;C(VssT?QmVk5!!)utrrE&u!Y#.crr317bkgd:!.hWZ!J:@F
+eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIci4&N!+tp(rrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)trs%.g
+*!-dQh;\J7!<)rt!<)rt!<)rt!<3#u!!N+%#8W$ms8N)ursSh"5S*u39WJ-m!!)utrrE#trrE&u
+$iZhb&-<S?WrN)!!<)rt!<3!$mnsf"!;c^%oPGKJ+Gg't!!*#u&H8@g&-<S?WrMp3&I(PY!!*#u
+rrE#trrE&urrE&urrE#trrE&u#1PI4/Bn.qq>U^!N>Md^irB)Ys8N'%q-+(>L&(`Smnsf"!<<'!
+!<)rt!<3!'rh2Rg!YnD/qZ$Qqrr;uus8NP]AfLjc<8ITSmnsf"!;c^"p2qM^&5("Bs8N)os8N)u
+rs$t0">%dt!WN-!!<)rt!<3!&p2qM^&5("Bs8N)srt,1'5S*u39WJ-mf/3[]b5_P<rs/Os5S*u3
+9WJ*l"T9GC"RZ0f$iZhb&-<S?WrN)!!<)rt!<3!,mnsf"!<:_a*!-dQh7*CbN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh2D!g8B&p&G&JrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>XiNA9!
+Q+?eOs8N)ts8N)ts8N)ts8N)us8N'%n3-q!X8`/!!<3!+qh[-<"<Lmes8N'!rVultrVultrr3B'
+M)5VD*aZbarr<&ts8N)urrgq;$ipA)rs@af&-FS`s8N'!rr3Q,M)5VD*aZbaoM>i%=nhssrr;uu
+rVultrr;uurr;uurVultrr32#+p:4$!!;ur#Q8?H#Zpg%!<3#u!!MdT"!alBrs74?$ipA.rr<&t
+s8N)urs/FX1^jL.?GlX>rrE&urrE*!%DPdR!ZPkJs8U\7$ipA)rs%Xk('>=Xl2L__!;QTo!<3!&
+V]l70n,NOhs8N)ts8N)urs%Xk('>=Xl2L__!;uj.qh[-<"<Lmes8T,E"$c8T!;ZX"qh[-<"<Lme
+rr3,t#QP/-rVm9&M)5VD*aZbarr<&ts8N)urs[LC$ipA.^JY[G)eo&UrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCci4%S!:'7WrrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)trs#;c
+$j7r1r8RbV!<)rt!<)rt!<)rt!<3#u!!LFo"?"g1s8N)ursS79.1$5-DqtBm!!)utrrE#trrE&u
+$gr'b#mVksh#IBS!<)rt!<3!$W\=YY!;c^%_F"Y85g03-!!*#u&FOTg#mVksh#Gnc"Vc4Z!!*#u
+rrE#trrE&urrE&urrE#trrE&u#([Kp?h==(q>U]m9aD;Squ?`rs8N'%asmNOfD5FPW\=YY!<<'!
+!<)rt!<3!'mW0f`#:ONGqZ$Qqrr;uus8NP)5n!lDKDbcLW\=YY!;c^"`C^[F,'N\Zs8N)os8N)u
+rs"#h#[d3(#lal(!<)rt!<3!&`C^[F,'N\Zs8N)srt+U>.1$5-DqtBmKbanuq#CEjrs.t5.1$5-
+Dqt?l"R6*i+oVB>$gr'b#mVksh#IBS!<)rt!<3!,W\=YY!<8l]$j7r1r3u\,K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMq#:El!!hrlrrADc!r;m%JcEjl!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGNF!qQC%mf3:eQi@-Y!"OS[ao;Bus7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMq#:E?!'0KIrrADc!mL^*JcEjl!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMq#:ET!#k;*rrADc!oa1uJcEjl!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGNF!k/.nmf3:eQi@,r!'Yu6ao;Bus7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMq#:Cq!2f2arrADc!`]5tJcEjl!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMr;Qs\bl$-P!h\o\rrAPg"usj)fero(JcEjl!K@'Pg]X2K
+qc-XH~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGZJ#%-0a`!uq.mf3:eS,W\"h#5/$"Q4k2ao;Bus7Y.LRK34b
+<Ib~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMr;QtOlM@Ib%eB&frrAPg#(Z"8W<Wq(JcEjl!J:@FeHD!7
+qGgOG~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMr;QrF7LKAQTC)[Y!1Wulbsi'E0;!gqaSu:"s7Y4NScJXf
+<Ib~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGZJ"fjHa#sZ;os8N(grroG["pmN2JcEgk!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMr;QqZ-3FfWk3`3K!1WulN$\W<;W`Q1aSu9ms7XtGOT>5X
+<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI_#OE7Y5eM%hZ*TU\c2];'(5f"!:Kme!3ZA%!8dbU!<3#u!7h,L!8dbU
+!<3#u!8RVS!:Kme!87AQN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDgZ5s+miXrrCpUrrBV0!Ga4Rs8N)es8N)%s8N)Us8N)us8N)Ls8N)Us8N)u
+s8N)Ss8N)es8N)PrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KC_#OE7Y5eM%hZ*TU\c2[_Hg^q6!:Kme!3ZA%!8dbU!<3#u!7h,L!8dbU
+!<3#u!8RVS!:Kme!87AQK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/O<b:DX-A0o#K'rrBP.q>gQqrrCpUrrBY1!q?G:mf3:emf3:eh#IBS
+ec5XLhZ*TUrr;uuec5XLhZ*TUrr;uuh#IBSmf3:eh#IBS!rn5Zp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh5E#1TK1M3"L^q#CAM\,Z:)s8W*!hZ*TU])Mif!RL36rrDKerrCjSrrCUL
+rrCpUrrE&urrCULrrCpUrrE&urrCjSrrDKerrCjSrr<-#M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCd/O<*1(+4$:;6N'rrBP.q>gQqrrCpUrrBY1!gs)Tmf3:emf3:eh#IBS
+ec5XLhZ*TUrr;uuec5XLhZ*TUrr;uuh#IBSmf3:eh#IBS!rmlPp=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJjKd!$KM_l$!+hq>^Hp\,ZI.N;is.#Q39TrrCjSrrCULrrCpUrrE&u
+rrCULrrCpUrrE&urrC+>rrCjSrr<-#N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#eu1sn,DdVLqiccs+n/arrA#X!A+i7s8N)Ss8N)Ls8N)Us8N)us8N)L
+s8N)Us8N)us8N)>s8N)Ss8N'#s,$dLg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjJ6!.!l,b9$_uq>^Hp\,ZI.N;inl5M6#9!8RVS!7h,L!8dbU!<3#u
+!7h,L!8dbU!<3#u!6>->!8RVS!!<1Ps7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj7i!7UrI!r;m"q>^Hp\,ZI.NW0(P!%-@urrCjSrrCULrrCpUrrE&u
+rrD$X!M!6cs8N)Us8N)us8N)>s8N)Ss8N'#s,@!Og]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!fVs3rr3&rLlD00s+n/arrA&Y!p0Jif`1sOh#IBSec5XLhZ*TUrr;uu
+ir9)ZDNjhprrCpUrrE&urrC+>rrCjSrr<-#M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJj7N!;lcq!n%&kq>^Hp\,ZI.NW0'L!5[=frrCjSrrCULrrCpUrrE&u
+rrD'Y!r>4+p](6nhZ*TUrr;uua8c/>h#IBS!rmlPp=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJj8+!7UrI!rDs&q>^Hp"oWf]#u1'krs&1@,6ecSb5VG@!<)rt!<3#u
+!"/Em"987M-jBu7QK%rE!;c`q!<<')UAtYls8Gdo/c,MI!"8aQ((Y'Xqf<P\;Yg=lrrE*!&Gq&-
+"pm,Ps8N'!rHo4a:%\Gb#536c"qjVPrr;uu$iPGg%qkq>Eu,0]q>UBur/EB:$pV<%s8N'#p.GMb
+rrU4@?2X^170&t[s+M$as7H?trr;uurr;uu"oWf]#u1'krs%.7"Y@mu!<3!&p3._c&kpIIrsM6q
+TE"qF&HDe'!!r;uqZ$`m"U!T[rsS`3!n@5M!;Tt-(l81k#5jH7#n0&/p&G$l"oWf]#u1'krs&(N
+(]t^kq#:<n!!W=K&d_;)rr32U2?bYV!!*#urrE&u#5jH7#n0&/rr;uu!qo7ho`#$]!s*iFs8N'&
+rHo4a:%\Gb#4mWf!uktLrr;uu"oWf]#u1'krs%.7"Y@mu!<3#u!<3!&r/EB:$pV;qrsM6qTE"qF
+&HDe'!!rT(rrE&urr<6$HkH`[o`"jpfes!bbl@bCrs&1@,6ecSb5VDK70&t[s+M$as7H?tpAb'k
+!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!fi*5rr3&rLl_B3s+gjVZAajTrr2p%osBp>PI1&_s8RoRs8RoSs8Rl^
+oUgs>qmi#LNi1Xks8N)qs8N*!rs3-8(]==2(BA"Bs8N',q-FRKL]@$M&.ig[rr;uus8NZ(BH70a
+6F-Xk!!)h!#nLbKrr32e?5Nb]?gI^krr<H&?4Rm.s7KM+&9.XJrs&4?,6e`Vh>[HS!!;@=!W2lu
+CB2]YrsKD=kl:Z-,6.],!"o51rrE&urr<5u>6tgSrVlg$Xs=-:nGiRgrs%^o(]tU^li-nl&HM%p
+s!&`fs6'FppAb!i"7-$mp\t1#pB(Njrr<&h63JU;rr32sFX%)&:u1gErr<5u>6tgSrVlg$k@Y8.
+-%l3rs8N'&q-+.9C&S&2#-K3S6Lb$Urr;uurr32sFX%)&:u2-Nrr<,a0`gqH"4dJS\+p"'!!W1&
+#nLbKrr32cB+>(kKDtlMrr<5u>6tgSrVlg$Xs=-:nGiRgs8N)urs&4?,6e`Vh=^dU&HM%ps!&`f
+s6'Fprr;uurr;uu"o2@/%r)"Ars#VO"@DVY!<3!&l!>2/(glV.rsKD=kl:Z-,6.],!"nr)r;ZkT
+s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj7P!;lcq!n%'-q>^Hp"m/,T)3+Xprs$P<&dBV+p\t3m!<)rt!<3#u
+!"-=Z!WUnR'`o(Ldc1<,!;c`q!<<')/HATGs7-KsU\b#j!".mX#pHPQf0BW^Q2Ua_!<<'1gJemh
+'NNT]rr<&]63S6drr2p%a@m3N,^B(_s8N'+k=#\#YlE<?#oo6/rs%@d)$Cgio)A[h!!9bR!W2lu
+.KJc3rsK)4p&G%'KE(tD!(HnerrE&urr<5b63S6drr2p%L_pG+q#CEors$P<&dBV+p\t1##QXPt
+rt'h_s.99[pAb!i"0_eDr;Q^(gB%f\rr<&C/-\&drr32[>o<b_BCb`qrr<5b63S6drr2p$eP$5S
+18=aIrr<5b63S6drr2p%L_pG+q#CEos8N)urs%@d)$Cgio)A[h!!9bR!VHBoL]I_?q#C?o"m/,T
+)3+XprrpqH#RE2[rVult"m/,T)3+Xprs"8r$"3Q/!<3#u!<3!&hd%*&)/&O5rsK)4p&G%'KE(tD
+!(HnerrE&urr<5b63S6drr2p%L_pG+q#CEors$P<&dBV+p\t1##QXPtrt'h_s.99[pAb'k!J:@F
+eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJjL1&g5Ktl?EAVq>^Hp'UQH-MZ>a:s7e2MUA3:g#/gK@!!)utrrE&u
+rr<CVbMrPQ!*A@]flH*PrrDoqrrE*!#l\W?4TEP('_M8%rr<Fo\,)9gAn\[MP5mlIs8N*!s#ko5
+=6KM7ErZ.>!11=nMZ>a:s7e2MUA3:g#/gK@!!&CqqNCnkBXdi%!'pSaqa^jPo]JaJ[/^.+!.`8P
+qu6_8!42V'$b-1%s8<E8jT"!8+9)<?!<3#u!%=2Gq2554s8VNn%F+EU!!*'!pau`Epspku_uKbH
+!'pS_%L_@tg]/Ghs8N)trrSVh49#6qirBqrrr<%Uc1+d7P5kDM"Hi?>8-H<ns8N'0Qb3'O!'(#Y
+p_Kk)n;@9'rr;uu&!sp(MZ>a:s6g4&c1,EH!<3#u!<<'0qa^jPo]JaJ[/^.+!.`8PoD\p0!!Aqj
+s8N'0Qb3'O!'(#Yp_Kk)n;@9'rr;uu&!sp(MZ>a:s6g4&c1,EH!<3#u!<<')qa^jPo]JaJ[.aM-
+\,\eor=04rs4dSrrr;uurr;uu.$qRAMZ>a:s6g4&c1,EH!<<)o/d8!EegUg@s8TS/5l^cm$fq?C
+!$Cn6rr<-#N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#hb*:nG_pYMV@n+s+hAqlh[c?`;fl4O,`/tif0#os8Rn2rVunRrr<"S
+$E<UUs.G1jq#'9XirB#YqZ$Qqs8NB'0`Zn,KE*e+qZ$Qq$X2!P=TGuode6fDNW/tX!<<'^1B<F(
+q8u\:rr<%)eau]=JcGc=%L^,M^^:S@s8N'!>13+I!4b2>p/qBTs8Vd5#I4*T)$oI+rr<$gj1tQl
+!ZM.,r;R-u!3#qo"pOi&V>s<hs8N)us8N'I?.JRE!.k1Mf)d&Tj@oUSs8VNt$c2_U$4cS*s%EEk
+s7up'q>[;l9_JGc!<)p!56-`Crt`3H3<0!Y!)M\:*s1'op)OCCq:->gkk>&V!"WAcoMGU>s8VR:
+`r+t-!-S;@rr<R8eau]=JcGc%![$La9`P1ms8N*!rt"fD#I4*T)$oI+rr<$gj1t9d",6d[f(o@G
+!"WAcoMGU>s8VR:`r+t-!-S;@rr<R8eau]=JcGc%![$La9`P1ms8N*!rs8<=#I4*T)$oI"rsML#
+W;l\u"o81q!)3ClrrE&urr=HQeau]=JcGc%![$La9`P1ns6gF*_>D"T%e0Mu9E;$kq?@-!s/#ci
+p&G$l!rn,Wp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJjJu!da21bT@JUq>^Hp'Op7h+99^es2"sjfCtpA0DPSI!!)utrrE&u
+rr<C;n:(BP!3c+h\2*(DrrDoqrrE*!#kSf2b5XO'D#X;2rr<F4jm42lgem2",663ls8N*!s#h(s
+YP.Y!1B7@S!+P-T+99^es2"sjfCtpA0DPSI!!$<dlluMc;<@-h!7UuJfaJqEqmm.XpAb-m!+kYK
+qu6^,!;HEk$QfB)s6'k#r;St]\GlO.!<3#u!%;=>kTBlNs8S5_<q4Fj!!*'!_?MOBpRh[Cq#C@9
+!8[\=$k<.756/4ds8N)trrO)=eGfI`;?33drr<%6n]_LKn,M&L*m4Ak$R#0:s8N'0@cuqt!7(WE
+^.-iSf.@!@rr;uu%q=_c+99^es,mC`n]cji!<3#u!<<'0faJqEqmm.XpAb-m!+kYKoD\nb!#P,"
+s8N'0@cuqt!7(WE^.-iSf.@!@rr;uu%q=_c+99^es,mC`n]cji!<3#u!<<')faJqEqmm.Xp@eLo
+*rt-skR7pus$$Lnrr;uurr;uu-t;B'+99^es,mC`n]cji!<<)9"tS="TER"Ds8O/@h>c[I%K-5j
+!4__%rr<-#K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nId/O.42?!RV$_I.nrr<C?s8V`l$NL..!)`aq#2T>&s8N'!rVultrr;uu
+!,;H4!XSk+hZ*HQrr;uurr33!3s)W!#grJJrr<F=s8Vcm"_Rf7p&GI!s8N*!rrNK,WVc_q!"*H?
+s7H@!s8T2$;?$S3h>e\urr<%2s8Vcm"_Rf7p&GI"s1A>#rr35h!#tt<!!$a/rrO5AlMUYijo?;!
+lje8Ms/5otrr;uurr;uu'P[UIo`,@!s-E_$s8V<`!<<)$!)`aq&DdC0s8V3])?9%5G[pcP!*/^l
+rrE#t(@hG1o`+r^!,;K5!!$g7s69S"s1A>#rr3&c!#tY3rr<4:s8V`l$Msc(r;['$s8N'0C&e5+
+!"/c+QN1h$s60L`rr;uus8N/5!(Hne#O;@/s8N'!C&.f&!!!6!s8N'&C&e5+!"/T&!rW*'rr;uu%
+r)(Do`,@!s-E_$s8V<`!<3#u!<<'#]DtD"rrVKd)ts:>jo?;!lje8Ms/5otrr;uurr;uu'P[UIo
+`,@!s-E_$s8V<`!<<)$!)`aq&DdC0s8V3])?9%5G[pcP!*/^lrr<-#N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5E!ToXGL]Nb'q#CAM$KhBgon\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<
+rr3%VM!*XpqZ-WqrrE&u#4rK2f`_u[q>^Hp$c`5HlMq=4s8V?a(B4@6!<<'#!s$OAs8N'+aoDD*
+!#5J59E;<rrthd;:B1=o!65'=lMq=4s8V?a(B=DE!2'8j#LEH9s8N'!bk_8?#6=VursQ^E3WIPK
+*R=[D!5ng9rrE&urr<bTs8V<`'`\1g!7(WEb5_PBs%EEsrr3P3!)ERo_Z2^sdiBISs#0qqp&G$l
+rVmYk!"Su-s"sf"s8N'!cN!ph!&FRa!2'8j!mgp4pAb-m"j-fEkl;ForrVur%K?D-!"[3Os60Lt
+s8OhScN!pf!!*#urrE*!!b25&rr35M!'pSa!!(7=s7QEm%Jg&(!!ULEs60LtqYpWm!"Jr-rr<SO
+s8V<`'`\1g!7(WEb5_PAs8N*!rrQ[1TDnilci??)rsQ^E3WIPK*R=[D!5ng9rrE&urr<bTs8V<`
+'`\1g!7(WEb5_PBs%EEsrr3P3!)ERo_Z2^sdiBISs#0qqp&G$l!rn,Wp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/O-<$iU,,2=(&;rr<Djs8Sho;ZHb=!9!kV##>6%s8N'!rVultrr;uu
+!:'R`!W`;^hZ*HQrr;uurr32M#SO<B48SdQrr<Gjs8T%u''TAqVuU$#s8N*!rrN3$jSSuW!".uj
+s.]Qls8O/@i;W`m:B7Qtrr<&_s8T%u''TAqVuU$$s!Ig"rr34E!2BMn!!)<[rrN<'rVZ['<<0'!
+C3^<Srtkaurr;uurr;uu'^>YtUB"3lrtYV"s8Qd5!<<'@!9!kV&5N;/s8Q(!WrHgZ%dO'2!9WtS
+rrE#t(7"q\rr<!7!:'Ua!!)<as(_V%s!Ig"rr3%@!2B2err<5es8Sho;YpCpj8_+;s8N'0l2UdY
+!)ijs('*Y"s(MH5rr;uus8N-J!87AO#BKm>s8N'!lM:JR!!"bLs8N'&l2UdY!)i[n!os>>rr;uu
+&*a,oUB"3lrtYV"s8Qd5!<3#u!<<'#-NMj!rrR6AUA"Tp<<0'!C3^<Srtkaurr;uurr;uu'^>Yt
+UB"3lrtYV"s8Qd5!<<'@!9!kV&5N;/s8Q(!WrHgZ%dO'2!9WtSrr<-#K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjL8&eVkSj&lJ@q>^Hp$Jtg_rW!$"s"j`&rr33!!!`K'!!)utrrE&u
+rr<&Nrr3.<!!+g;h;SD6!;c`q!<)p#n.Pm+UA4cg!"7Z`s8DuuhZ*WT!!<0"rrE*!"`+/>0p:Al
+s8N'+hZ*WT!!<3#1]Yo%rtkM3#64]'!8dbUrVurTs8W&u!rr9b!5AI4#Q4W+s8N'!fD5FJ!s&8s
+rsSZ)#QMUobTd'D!RLcFrrE&urr<bis8W&u!rr9J!8IPRqZ$Wrs"j`&rr3Q+!!`K'q>pp%_(a(W
+s"jc&p&G$lr;RL_!*T@#'aFC3rr<&Rs8Vrr"ogde^Ae-6r;[#ps8N'&hZ*WT!!<0"!i7pfrVup!
+rr;uu&)R?drW!$"s!Ig$s8Vrr!<3#u!<<'#56/Fsrs/K&"onT&!8%&Hp&G'sq>^Hp"lB:ZrW!$!
+rrT#X%fQG.!WN-!!"[rds8E!"s8OGHg].<N!!*#urrE*!!^?\!rr3&u!!W)r$i0o0s1pD5,6'J#
+ci3tE!<3#u!#4;is8E!"s8OGHg].<N!!*'!1]Yo%rt,#,#64`"!XJbA0[(a@1]bqqs8N'#s,@!O
+g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F#igf4li-4?MW=O4s+h$Zs8W(SM?!U9M#.,N#5X.9s8Rn2rVunRrr<"S
+!;lcq"dt1&X4$e%s8N)qs8N)trrh!Y"pN]Ts8N',p](9k!!)cns82j"rr;uus8N6J!!,cbnG`If
+!"/K#s82j!s8NN.o`"k,oDf@#rr<&ns8Vus!;HNnqu?m"rso,!rr36"!"8i,!!)`grrE-#qu7&r
+!=o-9H?rNi%0?,#s8N)us8N'5p](9k!!E9$$39i#s7QEms8NN.o`"k%oDf@#s7?=%s'C"t;u[:-
+o_&7a!;uj3/-*-Yq?7<+s8N'!p](9e!"/`:!:^!f!r;m)pAb-m$hs]$qu?j!s8@a*$2so)!WN-!
+!"\i(s82j!s8NE+p](9e!!*#urrE*!!Y5;#rr36"!"8i,!!)`gs7QEm%Jg&(!"8Q$s82j!s8W%R
+/IDCV!!3*!rr<T(s8Vus"98B.!;HNnp&G*ls8N*!rrN]2nG`Fhq>^osrsSH"%f]j]H;jhQ!VHBk
+rrE&urr<c-s8Vus"98B.!;HNnp&G*mrs\u#rr3Q%!"Ju.oDoI%?@$orrs]#$p&G$l!rn,Wp=]Y<
+!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJjK/!a=X\]b(q@q>^Hp$N0r(nc0*urrrK"rr32K!&X`U!!)utrrE&u
+rr<&rrr3-5!!-W4q;MAR!;c`q!<)p#U&tK2nG*%`!"8`)s7--ir;Zff!"f/0rrE*!"V:Y7A?G\,
+s8N'+r;Zff!"Ao-"p"N!rtiu]2#mRU!;ulsnc/[fs8VWi&HDb8!;QQn#O)4=s8N'!qt^6m!<E#s
+$dSi5s!GuD]Di':qYpNp!<3#u!#5A2s7--us8N6&qu?]M!!*'!"p"N!rt*KV2#mU%!BC*+bqH^/
+"p4Yos8N)srrs,:irA<H0`M+P!"&Q&s4RH$rs&Q!rr3&a!%[dCrr<H)s8VWi%0-A%E$GSd!!!-#
+s8N'0r;Zff!"Ao-"T\H"s4RGQrr;uus8N-*!;QQn#O)4=s8N'!qt^9c!!"bLs8N',r;Zff!"Ao-
+pM_>]rVup#rr;uu&,cJ-nc0*urriE"s8UdQ!<3#u!<<'##6=PurrVEb/,&uNcN-$*-I"3UrrrQ$
+rr;uurr;uu'`A"2nc0*urriE"s8UdQ!<<''!;c]p&C1>5s8UCG3<(>M0>%5g!rDTirr<-#K)bPp
+"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJj8K!2BJm!qcO#q>^HprVults8N-,!;ZTn"TSW(rr<&ts8N)us8N'!
+qu6U"q0=%^!!@T-s8N)qs8N)srrRiR)u'C4!<)rt!<)rt!<3#u!<<'+q0=%^!!@TJrr<&ts8N*!
+rrNK,q>L<s!!<3#!!)utrrE#trrE*!%1*":!s/K'!!3-"!!)olrrO5Al21Je>6)35I..F9!"8c*
+rrE&urrE#trrE*!!X&N"rr;uus8N-,!;ZTn!<<3#rs;m0\Q!tG#kn<,o`+pkr;Quf!"Jtm!%S!J
+rr<&qrr3?+!WNH+!s8T*!!!&ns8N)ts8N*!rs,t40A$.%!!*#urrE#trrE*!!X&N"rr;uurr;uu
+s8NN7!!<<)!<<*#s8N'!qsj[g_>j\3q>^HprVults8N>4!&)t%rr<&us8N)ts8N*!rrN<'qYpNp
+!<3#u!<<')#lk&0!W`9$!VQI!>6)35I..F9!"8c*rrE&urrE#trrE*!!X&N"rr;uus8N-,!;ZTn
+!<<3#rs;m0\Q!tG#kn<,o`+pk!rn5Zp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!g8B3rr3&lLm%T6s+pXRs+p^T!JuX1rrn48s8Rn2rVunRrr<"SrVm)s
+[?-3#Mq[1jrrDoqrrDus!\FC=p](6nrVultrVultrr;uus8NGp@1iP?#-\(,!!)utrrE*!!WrH%
+rr33%!!E9$!!)utrrE#trrE*!%0?M3!s/K'!!3-"!!*#orrNH+qYU:!('*b:hVJh2!#GP5rrE&u
+rrE#trrE*!$ipA-s8W&u!<<'$!<2ut!r`0%rr39?!:CQXh@T&S(A.Y,!;uj$d/Y-cb5c8Us8N'0
+rr<#t!!3*$!!<<)!<<*#pAb-mrVults8N=9!,1HmrVurts8N)ts8N*!rs&Q)rr<#t!!*#urrE*!%
+0?M3!s/K'!!3-"!!*#grr\#V#1iVMrrE#trrE*!#A*sLjSo,Y!<3#u!<)rt!<<'(!<E-!s8Duur
+r;uus8N?+!!<<)!<<*#p&>=6!:CQXh@T&S(B+:5!<3#u!<)rt!<<'-!<E-!s8Duus8N0$rr2p!r
+W!'"rs9G@mM+O7&FBH5o`+pk!rn,Wp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hfTqq>^HprVults8N*#!<)p%p]([$rr<&urrW0"!<3#u
+!<)p%cV4ZF!#OSQs8N)qs8N)srrNl7U%eTe!<)rt!<)rt!<3#u!<<'+cV4ZF!#OSnrr<&ts8N*!
+rrE-#rVm)s!"/c+!!)utrrE#trrE*!$ip>1!s/K'!!E9$!!)fo!X&N%qu6s1!;HojHpY.>>Q+U%
+!<3#u!<)rt!<<'"!<E-!#5S<"s8N*"rVlro!"/`*#n$b.$LiF0ZN+5%s8N)srs!fMAH-->`;]f:
+!<3!,q>^^!!<<3(!W`9$"8;cp!<)rt!<<'(/-(k#s7lWprr;uurVults8N*#!<3!"q>^Nps8N*!
+rsSo.!s8T*!!!-$rr<&grrYjn([q2"rrE#trrE*!#:ok<mJlt^!<3#u!<)rt!<<'"!<E-!!r;ls
+rr;uus8N?*!!<<)!<<*%p&>=+!;HojHpY.>>Q+U%!<3#u!<)rt!<<'"!<E-!#5S<"s8N*"rVlro
+!"/`*#n$b.$LiF0ZN+5%s8N'#s+::EeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj7V!;?El!r`0$q>^HprVults8N-V!7:`F%/Kr.s8NH,o)Jaf!!*#u
+rrDoq"5eV/#3,[_!;c`q!<)p#eGp6`G52+;!<)rt!<)rt!<3#u!;uj%hgb\2s8N'!rVults8N-V
+!7:`F#5S<(s8N'!rVultrVults8N-U!7^iErrDio!cS.Dqu6u>!(I(\rY1=l-N3uE!<3#u!<)rt
+!<<'--NMp$s8)crs8OkTd/O%Hq>^a!rs?OB7K`2['TE)>o`+pkqu6h3!.h9QV#LDo!"%E[s8)d"
+s"XT(nGiLgrVults8N<I!8IPRq#CEos8N)ts8N*!rs'nOg].<N!!*#urrE*!!\sc*q>^Hpnc&^Z
+!s*fEs8N)ts8N*!rs'\Ig].<L!!*#urrE#trrE*!#:BN+s8Vrr!<3#u!<<'#1'#hmrs?OB7K`2[
+'TE)>rVultrr;uurVults8NKT!8IPRqZ$Wrs"aZ%rr3&r!!`H&$,Q[3"7c@)N;t<ts8N'#s,@!O
+g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!f;a4rr3'!Ll(s-s+pXRs+p^T!fi*5rr3E'LlVN8M2;02s8.V.rr<"S
+qYpZ^[>9k&s8N)qs8N)trrehl.KR!Qs8N)ts8N)ts8N)us8N)srs-kY!"Ju.!!)utrrE*!!Y#/%
+rr32p!"Ju.!!)utrrE#trrE*!!Xo)%q>^Hpq#:C7!:9U_$!mV7"oS9%UB"X!s8N)us8N)ts8N*!
+rsT57p](9e!!*'!%06&"rrVfm%K?A6?3%,3r;6_n!+,<trrDrr"WdZp70)TOs8N'*p](9f!"/`7
+!;5j]rrE#trrE*!#7(>(s8VWi!<3#u!<)rt!<<'($39i#s7QEmrr;uus8N-/!;60frrDTh"4dJS
+[eTn&!<)rt!<<'(#QXW!s7--irr;uurVults8N<2!;HNnp&G*ls8N*!rrNT/p$_ne?3%,3r;6_n
+!+,X(rrE&urrE#trrE*!$jm"/s8Vcm!<<'.!;-9j!qZI%rr3:2!3QM'qurhq?M+9t!!<1Ws7Y.L
+RK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj4K!<)p!o`,Ers8N)ts8N*!rrNB)qYpL'ci>p&rrN3"s8UpU!<3#u
+!;ld!rkC8i2<+Z9!;c`q!<)p#=9&j5j7rZS!<)rt!<)rt!<3#u!<)p'rkC8i2?3[V!<)rt!<<'#
+"p"N!rs$gM2#mRU!<)rt!<)rt!<<'#"p"Prs8N)orrNW0p\Xss-30kWrp^(U!5e^7rrE&urrE#t
+rrE*!$j?Y.s8UdQ!<<''!;c]p!mgp(rr39O!2UG0nH2#V_Y!m.!;ld"%05f:!;6?krr<B&s8UgR
+-iXANqsaXc!<)rt!<<'("9AB"s2G$=rr;uurVults8N<-!;lfrg&M-Ps8N*!rrNB)qt^9l!:g'k
+L]I_>q#C?orVults8N<,!;uls`W-#<s8N)ts8N*!rs&]-qu?]M!!*#urrE*!!X8Z%n,E\@!2UG0
+nH2#V_YsN7!<3#u!<)rt!<<'-"T\H"s4RGQs8N9'qYpKrci>p%rs:"PV%s"""$ck'o`+pk!rmlP
+p=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJj8H!2KPn!qZI"q>^HprVults8N/%!)`aq%,V%,s8PssV>pSZ!!*#u
+rrDlp"9&9$ro=%Y!;c`q!<3!&ne)2g,Qt[Rs8N)ts8N)ts8N)us8N)rrs&H&!WN*!!<)rt!<<'#
+X8l,srs%?\+92?@!<)rt!<)rt!<<'#\,\tns8N)orrU7A>PnF,lMq8(s8S#_!+Z!-rrE&urrE#t
+rrE*!%$gm0s8V?a!<<)#!)`aq!oEu"rr3;j!"'><s,70_A+]d&#ls_trrhE`(*j@fs8N'*D#aP$
+!#>OD!(HDWrrE#trrE*!#8$sss8UmT!<3#u!<)rt!<<'(Q2kb$s69Rarr;uus8N/1!(H_`rrDQg
+!Lm-as8N)ts8N*!rs',9jT#89!!*#urrE#trrE*!#F5@+s8V?a!<3#u!<<'#\,\tdrs@uk$5*=<
+N!B>mrVultrr;uurVults8NLn!,V]8l2Uhas/Z2trr3&W!$D4?$0qQu&c_li#689+rr`W.pPf.G
+g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!g/<3rr3&kLlqN5s+pXRs+p^T!iq.2rr3D\Lo^RUObi]1s5f&mrr<"S
+q>UNpLl(-krrDoqrrE&u#2fXpmg09bq>^HprVultrVultrr;uuqu6lt!!<3#!!)utrrE*!!_WNt
+rr32,!)3Fm!!)utrrE#trrE*!!aPenq>^Hpq#:D3!6tE@$.&Yl-NF)m&cg;Ws8N)us8N)ts8N*!
+rsUU^ci=$i!!*'!9)u3qrrTD)9`G%uci>%4s8ODY!7:B<!WrH$r;Qo6!&Fp$rVult$.&YOc2]U!
+>l^8]s8N)ts8N*!rs&Z,q>^Jn!!*#urrE#trrE*!#;H5)s8U=D!<3#u!<<'#>l^8fs8N)hrrW1;
+P5#"V!<)rt!<<'("9A8ts/5ntrr;uurVults8N<Y!71]Fbl@bCs8N*!rrQI+R.(%]ci>%4s8ODY
+!7:]ErrE&urrE#trrE*!$o%b.s8U=D!<<'l!3lJ&!jDYurr3;O!$!?cs!A?Yd.I>@!s&:Vs7Y.L
+RK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hTHlq>^HprVults8N-B!9!kV$rI#,s8NE+p&G&)!!*#u
+rrDlp!poslirB#YqZ$Qqrr32$!]eX2+SPX2rrE#trrE#trrE&urrDrr#42Bps8N'!rVults8N-B
+!9!kV##PB&s8N'!rVultrVults8N-H!7^iErrDio!\499qu6t4!"Y(hrt,J9li$k`!<3#u!<)rt
+!<<'-'`dS"s(VN6s8O/@i;W`X;#m`trs<08%upVh&I/=%o`"pm!;ld!@fV8eC]4;5!"%uks(h\%
+s!7ZpnGiLgrVults8N<*!<)rt8cSkjs8N)ts8N*!rs'8=li7!"!!*#urrE*!![Rirq>^Hpnc&[e
+6-K$&rrE#trrE*!#6Fo(s8P[k!<3#u!<)rt!<<'('`dS"s(VN6rr;uus8N-H!7^K;$"ErGNW9"j
+#6=)gs8N)us8N)ts8N*!rsTVBli7!"!!*'!*rt6urrQ$tXoA>,@fR%!s8NZ9!:0:W"9AN&K)bPp
+"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjL/!YW<Gj&lCsq>^HprVults8N`,.KuUCf..'@s8U=D+m\;u!!*#u
+rrE#t"tQY?r4)eCirB#YqZ$Qqs8NB':&n`&fDlEKqZ$QqrVultrVultrr;uus8NEVW:'So!#GV7
+!!)utrrE*!%/;:UU\WLl#/L9=!!)utrrE#trrE*!%/a!)D;5!X]3G=8!!)fo!qZI=qu7!##66^_
+s3q#Li;N]U!<3#u!<)rt!<<'3mKX6JnnJ.)s8VjD"f(nF.gEfgrsAT.!&srXe,TO-o`##,!/CIM
+rrYpp!(Hkdrr<Rccgk3>NrT#T!c?]in@Mous8N)ts8N*!rs+_f5P*`"!!*#urrE#trrE*!#OVg,
+cgkfN!<3#u!<<'-r)*T5g\gQQ>Q=^'!9F1[!<)rt!<<'(P5mi=hF%>Drr;uurVults8N>l#7f)N
+C&e85s8N*!rs8O#!c?]in@MotrsAT.!&srXe,TO-rVultrr;uurVults8N`"#7f)NC&e86s7e&I
+U\WLl#/L6<$2b#.2uip-!!2$Mrrd!8L5c0+g]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F#hOm'li-4>LtMP's+pXRs+p^T').EGj8J"tNq`SR`/(Vol`u>&rr<"S
+rVm)&i;3>rLnNc-rrDoqrrE*!#l5G>ZN$Ep,5_6:rrE#trrE#trrE&urrE*!$;.u(pQkk:s8N'!
+rVults8NMp$k'rL_@$h@s8N'!rVultrVults8NN%-j5RnrTL:Js8N'!q#:EY!*f@#$2=Q%OT5?A
+!!;ros8N)us8N)ts8N*!rt<i`+m.l^!!*'!m0jB>qn`^Mmf*4mp]:GWs8S,[!r2Ef!ZV3Wr;Qp!
+'*&$/rVult%oDEN+Tg3opF$0)kPaVF62(?Y!<)rt!<<'(490p.a@Q@3rr;uurVults8N>S![6^f
+:B1Cos8N*!rs\WM"HM[Dkc7#Lrr<&[s8N)ts8N*!rs(XdJGR>Y!!*#urrE#trrE*!#Lrl!k2fA=
+!<3#u!<<')pF$0)kPaVF61t6ap]:GWs8S,[!r2`orrE&urrE#trrE*!'%I%,k2fA=!<<)d$k'rL
+_@$h@rr3<"!W\>^s,R-]q"4Rh*!!j4s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJjJc!FFmb]b(>'q>^HprVults8N_H"Y87$UBN4Ds8P%YNr-DQ!!*#u
+rrE#t#%l*UmpQ3IirB#YqZ$Qqs8NAg$NT/c:&nJsqZ$QqrVultrVultrr;uus8NF<bkgd:!.k1M
+!!)utrrE*!%)2rrf_M9G/GT8F!!)utrrE#trrE*!%,;C(VssT?QmVk5!!)fo!hB>+qu6u\!<CXL
+s#0o_r;HZq!<3#u!<)rt!<<'3NWE;RcA2H#s8Th;/(jZm"YBHJrs@Ta!7_&K2ZO*\o`"t%!8[SQ
+"SrE)!8IJPrr<RGo$7dNmf2&R%]AgnhO#Y`s8N)ts8N*!rs'DAY55)U!!*#urrE#trrE*!#EAgf
+o$3$k!<3#u!<<'-g^jsnnGD(0-NF)G!9F1[!<)rt!<<'()$$i9W/L]Vrr;uurVults8N=a!Eo!=
+L]@GSs8N*!rs7Bk%]AgnhO#Y_rs@Ta!7_&K2ZO*\rVultrr;uurVults8N^l!Eo!=L]@GTs1\^f
+f_M9G/GT5E$/bgaeGoP-!!iGorr`c2h1G\#eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nId/O=%<YtoH2OF4=rrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)t
+rs%.g*!-dQh;\J7!;c`q!<<')SH'9$s8QI,./NuD!<)rt!<)rt!<3#u!<<'+fk)3*'3*ffrr<&t
+s8N)urs&1>+U&ELa8Z,=!<)rt!<)rt!<3!+rh2Rg!YnD/s8N'!p\t;F#Q+Du#B9a+s8VZj%K-8+
+!<3#u!<)rt!<3!&f/3[]b5_PArs&1>+U&ELa8GrBE<).$s764"oD\s^;A0'2rVluO!!:pRs8N'%
+q-+(>L&V)Wrh2Rg!YnD/pAb-mrVults8N?#C_6k;hZ*ZUs8N)ts8N)urs%(4"=qXq!<3#u!<3!+
+rh2Rg!YnD/s8N'!jT#5[rVults8N?#C_6k;hZ*ZUs8N)ts8N)urs%(4"=qXq!<3#u!<3!'rh2Rg
+!YnD/o`#/9!0R<]o)K6ts8N)us8N)ts8N)urs%(4"=qXq!<3!&p2qM^&5("@rs*NDOoPIQ!"JQ"
+"Rf5%N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5E#2Q5=Ll\Ljq#CAMrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eOs8N)qs8N*!rs2a-.0'>H+95aEs8N)ts8N)ts8N)us8N*!rsHM=&cs"dp](6n!<)rt
+!<3!&k?Jc)(1$2(s8N)ts8N)ts8N)ursS^\1^jL.?GlgC!!)cn!\Ou^qu6m@!9O7\jT$:us8N)u
+s8N)ts8N)urs#MK"$c8T!<3!&k?Jc)(1$2&rs'MDjo>AB!$(V1"P5gG!<E)u".0&kp\k-l!!MdT
+"!alGrs/FX1^jL.?GlL:rrE#trrE*!#P:h!$X*6)!<3#u!<)rt!<3!&X!7^2n,NIfs8N)ursS^\
+1^jL.?GlgC!!)*[rrE#trrE*!#P:h!$X*6)!<3#u!<)rt!<3!&X!7^2n,NIfs8N)urs/FX1^jL.
+?GlF8#93a*s8V0\*;oj:!<3#u!<)rt!<3!&X!7^2n,NIfrs%Xk('>=Xl2:Pd*!#+#s5a5#oD\sF
+4q*;Jp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/O<:2@BU(<nR3IrrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)t
+rs#;c$j7r1r8RbV!;c`q!<<'),QMc_s8!3*T_e]g!<)rt!<)rt!<3#u!<<'+V*PLm-\M?srr<&t
+s8N)urs$G7&-X8$pAY*l!<)rt!<)rt!<3!+mW0f`#:ONGs8N'!p\t7.48Ss^%06#"s,d;$r;Zcs
+rr;uurVultrr31V('e+?!!*#u#/s1G"X8-`r;R!2!;$6jOT9Cmrrf>U#6=i'rrY:^&H)M,rr<2E
+.KhW\rr35kF"%D#-u[o7s8N)ts8N*!rs.(8"Vc4Z!!*#urrE#trrE&u#)*ft>kn@"rr;uurr3Ao
+F"%D#-u[o@rr<&[s8N)ts8N*!rs.(8"Vc4Z!!*#urrE#trrE&u#)*ft>kn@"rr;uurr35kF"%D#
+-u[o5rs&u5oDeiQ!-.r:rrE&urrE#trrE&u#)*ft>kn@"rr32A8e;.MG4tk6#7U\)s8S2]EV'25
+W\=[0s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$rVlrh"`gUB!ndPlr;ZcsJcC<$rr3"Xs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcG]K!o<t&WW*$l!'gD]rr@WMJcG`L!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$rVlqf!U?Za!^$IXr;ZcsJcC<$rr3"Ns7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$r;Qf)&ukm4`;kAbs8N(Ms+14LrrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDeFKJcGZJ!Ga0arrQ^2eboII!.k0$s8N$!M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCJcC<$r;QdMH`@#H-iiZ4s8N(Ms+14LrrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$U]1Df9cj33rr@WMJcG`L!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcDMF!pL@kqu?ZrJcC<$rr3"Us7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$U]1DH$'Y8drr@WMJcG`L!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$[f?+&q#:Er"#T$7s8N)hs7cSFs7$'`!5JR/!;uitN;rV,"J,Vj
+<E4P~>
+s&FUMJH16$JH1B(rDeFKJcE1Yp]1*h!rrO!q"t*k!:g*a!.k1>s7cT/s7cTlrrIuVp=]Y<!;fbr
+J,~>
+s*'"oJH16$JH1B(s*+KCJcC<$[f?+&q#:Er$uGk=s8N)hs7cSFs7$'`!5JR/!;uitK)bPp"H`]\
+<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI_#OE7S,`Kg_>ac<KdI!(rr<&.s8N(Qs8N).s8N)<s8N)frs/IU-3aJM
+!!*#urrDrr!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDgZ5s+m0ErrBn8#Pi*R!s&?$!4W".!/:IQ!4W".!6,!<!:Tpmq.^iN!<3$!
+rr;uuqu6\Rs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KC_#OE7S,`Kg_>ac#<"o?5rr<&.s8N(Qs8N).s8N)<s8N)frs.R`'EJ46
+!!*#urrDrr!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nId/O<b:DX-A0o#K'rrBP.rrDusrrDKerrD]krrCFG#GV9)p&G$l!:Tsf
+!6bEB!<<''hfUFS#VLh4s8N'"#4qio"8`Q.!:Kme!<3!$ka4mC!;?Hm!6kKC!;-<k!:Bgd!!*;q
+rr3)t%KHM#s8N)frs,;!?1n6t!!*#urrDrr!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5E#1TK1M3"L^q#CAM\,ZI.r;Zcsmf3:eo`+pkd/O>D!202grr<&fs8N)B
+s8N*!rs$MR+9N'7T</(m!!*K*rr3)n"98Gis8N)urrgu12ZWpPs8N)Cs8N)ks8N)ds8N'"$iL#(
+"8)cs!;$6j!:Tpm9)tX]s8N'!rr;uuqu6\Rs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/O<*1(+4$:;6N'rrBP.rrDusrrDKerrD]krrCFG#9El`rr;uu!:Tsf
+!6bEB!<<''YYl5='M?*@s8N'"0)kkM"4dMR!:Kme!<3!$aET'5!;?Hm!6kKC!;-<k!:Bgd!!+_O
+rr3)O!WW5ls8N)frs'SF`;]f:!!*#urrDrr!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJjKd!$KM_l$!+hq>^Hp\,ZI.r;Zcsmf3:eo`+pkd/O.f!:K.PrrC+>
+#:#;_qri8)4K\Y_!!$=(rrC[M!:Kme!<3!$(iI4k!;?Hm!6kKC!;-<k!:Bgc!!$=(rrC[M!;$6j
+!:Tph*<>O's8N)rrrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F#eu1sn,DdVLqiccs+n/arrDusrrDKerrD]krrCFG!XA`&lMpkaa8ZB,
+U?2@.:&oL?s8Duu^]+65RJm3Ss8N)urrag$eGoUCs8N)Cs8N)ks8N)ds8Duu^]+65RJm3Xs8N)f
+rrNE*qt^9l!;lcsM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJjJ6!.!l,b9$_uq>^Hp\,ZI.r;Zcsmf3:eo`+pkd/O.M!<29`rrC+>
+#?8%tqoU#]^TIP8!!)-[rr>:_!:Kme!<3!$4-AY*!;?Hm!6kKC!;-<k!:Bgc!!)-[rr>:_!;$6j
+!:Tph"9AGss8N)rrrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJj7i!7UrI!r;m"q>^Hp\,ZI.r;Zcsmf3:eo`+pkd/X+Gl2Ub`_Z']7
+!!KG(rr<'U&cVe4=p=s,mf3:equ?ZrpAb-mbl@\Co`+pkmJm1d!Ab>errZF/!!)WjrrDNfrrDio
+rrDrr!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!fVs3rr3&rLlD00s+n/arrDusrrDKerrD]krrCFGrrD<`rrBq9!qcO!
+XoJD$!=^FUrrX#G!!)HerrDrrrrDcmrrC:CrrD]krrDHdrr<'/-iX,J((C6DoDegjn,NCfq#C?o
+qu6\Rs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj7N!;lcq!n%&kq>^Hp\,ZI.r;Zcsmf3:eo`+pkd/X+Gl2Ub`_Z'\f
+!$89Brr<'(J,]HM$8___mf3:equ?ZrpAb-mbl@\Co`+pkmJm1d!="&QrrWTb!!)WjrrDNfrrDio
+rrDrr!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj8+!7UrI!rDs&q>^Hp"oWf]#u1'krs&1@,6ecSb5VG@!<)rt!<3#u
+!"/Em"987M-jBu7QK%rE!;uls!<)rt!!N+)#T/Bsrs%.7"Y@mu!<3!(o8"4c)eo*Is8)frrs&C\
+0F8.P\bZ78ol2#U*f'dqp3._c&kpIIs8N'(rHo4a:%\JcqZ$]t!!*#u#1YR7/C"4qqZ$Ems8N;s
+G9[;)9Zm22rrE#trrE*!&,Ur,"pm,Ps8W"V0F8.P\bZ:*!;c]sqZ$j!s8N',rHo@kBE.jM(CF(9
+rr33#NA(YI5Ipdnrr<6$HkH`[o`"mj!<)rt!;ZX!p3._c&kpIIs8N'&rHo4a:%\8]rr<>A!NZ7k
+!%7gIrVm)qG9[;)9ZmA7#2(m</Bn.pqu?ZrpAb-mqZ$Qq"SlC1(l7harrE#trrE&urr<2t?O.L)
+rr32U2?bYV!!*#u#kNih!uktLs8Vrrs8N<$NA(YI5IpUirr<>A!NZ7k!%7gIrVm)nL_p45C&%]-
+rrE*!%dk2;V>pSnNA(YI5IpgoqZ$]t!!*#urrE&u"T465N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F!fi*5rr3&rLl_B3s+gjVZAajTrr2p%osBp>PI1&_s8RoRs8RoSs8Rl^
+oUgs>qmi#LNi1Xks8N)ss8N)ts8N'%nNm@)Y5\G*Xs=-:nGiRgrs7e#%L"/2rr<#q!<<''pN7\b
+&Q%<Zrsn-o'Eg"bs8V=i(]tU^li-qa!!i=(#nLbKs8Vrr!ri6#rr32$,6U@(!!)lqqZ-Zr#3fG2
+!uPD2q>^HprVults8NW'BH70a6F-XkpN7\b&Q%<Zs8N)qrrVlo$iU,*!"8U/%iC*%oiVh;E;ok:
+#5<6b"qa\frr;uu"o2@/%r)"As8N)ts8N)prs%^o(]tU^li-qa!!W1&#nLbKq>^Hp#\3u%s53lg
+!!)ut#3fG2!uPD2rr32*,QpI(!!)orrrDcmrrDoqrr<2l63JU;o`+pkrVultrr;uu"S"e]-*I7I
+#-K3S6Lb$Urr38eB+>(kKDtoNqZ-Zr#5<6b"qa\fq>^Hp#\3u%s53lg!!)ut#3TV/"XSg#rr;uu
+s8NSX"prl\s7^X\"qa\fs8Vrr!ri6#rr;uurr3,qFX)bCp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj7P!;lcq!n%'-q>^Hp"m/,T)3+Xprs$P<&dBV+p\t3m!<)rt!<3#u
+!"-=Z!WUnR'`o(Ldc1<,!;uls!<)rt!!LLs"uk67rs"8r$"3Q/!<3!%eP$5S18=dJqZ-Zr#2`](
+";tkCq>UrC7h#\fbQ%U`9G.OTGk_4;rr<;d63S6drr<#q!!<0#!<3!&JeeZ#q#CEks8)frrs$P<
+&dBV+p\Fjh!<)rt!<<'0gJemh'NNT]s5.*"";tkCq>^HpqYpWL!&"6Mrr<Dh70t-As49LB*0pL&
+#2`](";tkCrr;uu"m/,T)3+Xps8N)ts8N)prs$P<&dBV+p\t3m!!VLO"W<=!q>^Hp#Uf`Is,I)r
+!!)ut#09IN"seHfrr31Y(^XUG!!)orrrDcmrrDoqrr<2G/-\&do`+pkrVultrr;uu"O&D$2qe31
+#)F*&@/0d&rr3/P9F(nZUAk2i!<<''hd%*&)/&O9s8N')-is&ANW?or!<)p$eP$5S18=aIrrE*!%
+\NnKn,NFF>o<b_BCc*&qZ$]t!!*#urrE&u"Q*K&K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjL1&g5Ktl?EAVq>^Hp'UQH-MZ>a:s7e2MUA3:g#/gK@!!)utrrE&u
+rr<CVbMrPQ!*A@]flH*PrrDusrrE#trr<mmc1+d7P5jtV%F+EU!!*'!p_Kk)n;@9'rr;uurVm0#
+8-G(Ik=>`_qu7T0.Kl%.l@K!1/d8!EegUg@s8N'!Qb3'O!''uXrrE#trrE*!#OM^+d.2&S!;ZZp
+!<)p'pau`Epspku_tsE5!<)rt!<<'1JH/d7r7Q,jqa^jPo]JaJ[/0h&!;lcul[]+YrVult+IKY7
+P5o3.\,)9g5l^l]8-G(Ik=>`_s8N'!Qb3'O!''uXrrE#trrDoq')4'_UA3:g#/gK@!!&@tq2554
+q>^Hp#kJ$Es0D]k!!*#u&bms^UA3:g#/gK0#S#&KB)hr/s8N)ms8N)qs8N'&M9YQj!L!-UrrE#t
+rrE&urr<mmc1+d7P5jtV%F+EU!!*'!p_Kk)n;@9'rr;uurVm0#8-G(Ik=>`_qZ$Qq#kJ$Es0D]k
+!!*#u#P](6q=':B2#dOT!#,D(.0QIHs8,=iOn@g-"LS4/!!)utrrE&urrE*!"oCgnOc9>6g]X2K
+qc-XH~>
+s&FUMJH16$JH1B(rDh8F#hb*:nG_pYMV@n+s+hAqlh[c?`;fl4O,`/tif0#os8Rn2rVunRrr<"S
+$E<UUs.G1jq#'9XirB#Yr;ZcsrVult(f05R*s1'of)d&Tj@oUSs8VR:`r+t-!-S;@rrE#t#kf8D
+Z2)of#jD0c)X\"?[.rEas6gF*_>D"T%e0Mu!!$<ToMGU>rr;uurVults8N>P![?dh;ucpos8N)t
+rs8''$c2_U$4cS%s8N)ts8N*!rt$sdNUZbd<<)Y4#I4*T)$oI&s8N)rrr_1["K24urr=0Fde6fD
+\NA75=TFH]s7RH<Z2)of#jD<g!!$<ToMGU>rr;uurVultqYq2s%L^,M^^:S@s8N'!?.JRE!.jtG
+rr<>d!+c+-!9F1\rr3T!%L^,M^^:S@s47;ojQ'#8!;lfr!;?Hm!;c`q!!Q0Zj<"HTp&G$lrVult
+rr;uu(f05R*s1'of)d&Tj@oUSs8VR:`r+t-!-S;@rrE#t#kf8DZ2)of#jD-brr<>d!+c+-!9F1\
+rr35m.)u2I@/tHLs8N'4s5F@keGoRB*=&kFeJSYVs8N'!rVultrr;uus8N8r*=&j+s7Y.LRK34b
+<Ib~>
+s*'"oJH16$JH1B(s*+KCdJjJu!da21bT@JUq>^Hp'Op7h+99^es2"sjfCtpA0DPSI!!)utrrE&u
+rr<C;n:(BP!3c+h\2*(DrrDusrrE#trr<mNn]_LKn,JOO<q4Fj!!*'!^.-iSf.@!@rr;uurVm/V
+$m*Rg\dKYSqu7SK"sV7fb;oU>"tS="TER"Ds8N'!@cuqt!7(TDrrE#trrE*!#DrOco$E9p!;ZZp
+!<)p'_?MOBpRh[Cq"k$j!<)rt!<<'1'`bH2oscdWfaJqEqmm.XpA4gh!;uj"rQlf"g\q0P!$GS/
+lluMc;<@-h!7UuJfaJqEqmm.XpAb-m!+P-T+99^ds8N)ts8N)qrt<0Q/(aNg"Y]ZNrr<%.kNF#g
+cM@M?!!nkj^],GWo)Jdirt3*P/(aNg"Y]ZNOo\VRc%l?"qu?ZrpAb-mqZ$Qq"`!SP%1)Fqs8N)t
+s8N)us8N'9C@TOX#k.eV!ESa8L]@GTs1UtVr7<M#`;]f:!<)p'faJqEqmm.XpA4gh!!nkj^],GW
+o)Jdirs-8-gAKPS!6"m:rr<`4ZNVQ@s8Ua\*m4Ak$R#0Crr<&ts8N)us8N*!rrq'a*m0*7p=0;.
+!;]\qJ,~>
+s!WEuJH16$JH1B(s![nId/O.42?!RV$_I.nrr<C?s8V`l$NL..!)`aq#2T>&s8N'!rVultrr;uu
+!,;H4!XSk+hZ*TUr;ZcsrVult%Vu+El2VV"QN1h$s60L`qYpWq!!`H&rrE#t!k\M%rr3&c!#th8
+!ic5rr;Qi#!)`aq%,Lt,s8N'!C&e5+!"/`*rrE#trrE*!#F#4,s8VBb!;ZZp!<)p!XT25trrV$W
++Su-<!<)rt!<<'##lpt&rrTh57K3;glMqn#s8N)ts8E!!#a"uarr<UBs8Vcm"_Rf7p&GI"s1A>#
+rr3Dm!#tt<!!$a5s7H@!rr;uurVultqYpW!!)`aq%,Lt,s8N'!C&e5+!"/Q%rr<?);Zu>($NC)+
+rr3&%!)`aq$f1k+s-E_$s8V<`!;lfr!;lfh!<<*!!!R0<s69S"p&G$lrVultrr;uu%Vu+El2VV"
+QN1h$s60L`qYpWq!!`H&rrE#t!k\M%rr3&c!#te7rr<?);Zu>($NC)+q>UNp!!`H&rr</r3<Z)U
+rrTh57K3;klMqn(rr<&ts8N)us8N*!rrp%87K8>Hp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh5E!ToXGL]Nb'q#CAM$KhBgon\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<
+rr3%VM!*XprrDusrrE#trr<PSs8U=D1B0*0cN!pf!!)lq!r2g*rr;uurVlq/!2'8j!mgp4qu6^g
+!3?%t!_`Turr3D/!)ERo!!(.@s60Ltrr;uurVults8N<W!7CiHci=(As8N)trrPjoYl=Y(XT2,m
+s8N)ts8N*!rrN9&bP_AA@fW/#rrUOI5l1N\!<)rs!!*bHr;Zcs&B=bMlMq=4s8V?a(B=DE!2'8j%
++"u>s8N'!aoDD*!#5G4rrE#trrDoq!_`Turr3D/!)ERo!!(.@s60Ltq>^Hp#lbSFo`l32!!*#u!
+_`Turr3A.!)EPL!7(WEb5_P>s8N)rs7HBls8N'&cN!ph!&F6IrrE#trrE&urr<PSs8U=D1B0*0c
+N!pf!!)lq!r2g*rr;uurVlq/!2'8j!mgp4qZ$Qq#lbSFo`l32!!)ip!r2g*rr;uu"76^,e,K@K@
+fW/#rs$gM5l^ia!<)rt!<3#u!<<'&@fW/$M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCd/O-<$iU,,2=(&;rr<Djs8Sho;ZHb=!9!kV##>6%s8N'!rVultrr;uu
+!:'R`!W`;^hZ*TUr;ZcsrVult%dO)oCB0b%('*Y"s(MH5qYpWX!&jiVrrE#t![e!$rr3%@!2BAj
+!Zh?ur;Qg?!9!kV$r6l+s8N'!l2UdY!)igrrrE#trrE*!#8I7*s8Qs:!;ZZp!<)p!*rt6urrPsr
+Y581u!<)rt!<<'#!<D3YrrOPJg&D!QEr_s2s8N)ts8E!!/*6^/rr<Vos8T%u''TAqVuU$$s!Ig"
+rr3CJ!2BMn!!)9`s.]Qlrr;uurVultqYpU=!9!kV$r6l+s8N'!l2UdY!)iXmrr<?)$7+^8<;upu
+rr3$A!9!kV$Vpc*rtYV"s8Qd5!;lfr!;lfh!<<*!!!VZfs(_V%p&G$lrVultrr;uu%dO)oCB0b%
+('*Y"s(MH5qYpWX!&jiVrrE#t![e!$rr3%@!2B>irr<?)$7+^8<;upuq>UNW!&jiVrr</>#U&R7
+rrOPJg&D!UEr_s7rr<&ts8N)us8N*!rrjbMg&H[(p=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJjL8&eVkSj&lJ@q>^Hp$Jtg_rW!$"s"j`&rr33!!!`K'!!)utrrE&u
+rr<&Nrr3.<!!+g;h;SD6!;uls!<)rt!"Rc`s8)d"s!Ig$s8Vrr!<3!"V)f+c!!!'!s8N)trrPCb
+^Ae-6r;[#urrOeQdes+H1]Yo%rs\`(#64]'!8dbUrW!$!s8N)ts8N*!rs'kNh#IEP!!)iprrE#t
+!]0o(rr3&r!!`<"rrE#trrE*!$>]\C0p:Ams$$Ltrr3&u!!W6!rrDrr"5m>aH2[dC!"e#es8Duu
+hZ*WT!!<3#56/Fsrs\i+"onT&!8dbUrW!$!s8N)ts8N)qrrP"Wd/O%Rq>^a"rr<&Us8W&u!r;lr
+!!rVP!&Xa5rr<&urrP"Wd/O%Qq>^a"-NMp$s8)crqu?Zrqu?<hs8W*!"l'(WqZ$fms8N)ts8N)u
+s8N'/g].<N!!WBM!8IPRqZ$WqrrT#X%fQG.!WN-!!<)p!56/FsrrW-!"oA9!!!rVP!&Xa5rr<&t
+rrT#X%fQG.!WN-!!!5aqT`+ll56/Fsrs&E%"onT&!<)rt!<3#u!<<'&56/FtN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#igf4li-4?MW=O4s+h$Zs8W(SM?!U9M#.,N#5X.9s8Rn2rVunRrr<"S
+!;lcq"dt1&X4$e%s8N)ss8N)ts8N'5p](9e!"/`5!;HNnp&G*ms8@a*$2so)!WN-!!<)p!%fl+u
+rrW#s$iBr*$NThsrrNW0o`"k!oDf@#rr<&ns8Vus"9/?#!<)rt!<<'(#ls`"s7ZKnq>^HprVlp.
+!;-9j!qZI%qZ$QqrVults8NEO!!,cbnGiM!!:^!f!r;m)qZ$Qqr;Qoud45=*rVult&GQ5)qu?`k
+s8Vus"TSK4!:^!f%/Kr3s8N'!p](9k!!E6#rrE#trrDoq!Y#/%rr3E!!"Ju.!!)cns82j!q>^Hp
+#lfVZC]K7j!!*#u!Y#/%rr3Au!"Jr8!;HNnp&G*is8N)rs7HBls8N'&p](9e!"/E!rrE#trrE&u
+rr<c-s8Vcm$NCG5p](9e!!*'!rJ3$3rVup!rr;uurVlp0!:^!f!r;m)qZ$Qq#lfVZC]K7j!!*#u
+"9"$-$2so)!WN-!!!4,GdJa(H%fl+urs&<"$ig5,!<)rt!<3#u!<<'&%fl,!M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJjK/!a=X\]b(q@q>^Hp$N0r(nc0*urrrK"rr32K!&X`U!!)utrrE&u
+rr<&rrr3-5!!-W4q;MAR!;uls!<)rt!#5>1s4RH$rriE"s8UdQ!<<)nE$GSd!!!-#s8N)trrNE*
+q#:9pkl<72rrNB)qY^?p"p"N!rs[3R2#mRU!;ulsnc0*ts8N)ts8N*!rs&]-r;ZfO!!)iprrE#t
+!X8Z$rr3&G!&XQPrrE#trrE*!$4m1<A?G\-rs&Q!rr3&a!%[pGrrDus"T#_C%-%6crr<W.s8VWi
+!;ulsnc07$rs&Q!rr3Dk!%\*L!!)rss7--urr;uurVultqYpU$!;c]p%*no1s8N'!r;Zff!"A]'
+rr<?)1]T<3dJj1Hrr3$(!;c]p$dSf0rriE"s8UdQ!;lfr!;lfh!<<*!!!W9"s4RH$p&G$lrVult
+rr;uu'`7q1g&NQ$"T\H"s4RGQs8Vh4,6n,I!!E6#rrE#t!XA`#rr3&a!%[pGrr<?)1]T<3dJj1H
+rr3)pE$GSd!!!-#s8N'#$m+g7rrNE*q#:9tkl<76rr<&ts8N)us8N*!rriW-q#>sGp=0;.!;]\q
+J,~>
+s!WEuJH16$JH1B(s![nIdJj8K!2BJm!qcO#q>^HprVults8N-,!;ZTn"TSW(rr<&ts8N)us8N'!
+qu6U"q0=%^!!@T-rrN<'qu-Nq!!3&urr<&qrr3-%!WN9&qYpNp!<<'([K%u4r;Q`srr;uurVm-0
+!!<<)!<<*#qu6^$!;ucp!XSl&rVm$$!rr9#!<)rt!<3#u!<)rt!<<'#"9A>us8N)ps8N)trrNK,
+q>L<o!!<#srrE#trrE*!&G^Sn!!!+Jrs8Z-!s/K'!!2rrrrDoq!qcO!rVultrVultrVults8NK6
+!!<<)!<<*#s8N'!rVultrr;uurVultqYpU'!;ZTn"TSW(rr<&ts8N)ps8N')s7cWq!P8:2!<3!"
+#lsf"rriB(rr`>urr;uuqu?ZrpAb-mqZ$Qq!;c]p!<</ns8N)ts8N)us8N'!qYpKu!!3*&!;c]p
+rrE*!#IXUcfDPXK!<3#u!<)p'#lk&0!W`9$!W)ir!!rW"!WW84rr<&urs,t40A$.%!!*#urr<*8
+!fHsV$jcn9!s/K'!!3-"!!)utrrE&urrE*!"UP/2"-!9Rg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh8F!g8B3rr3&lLm%T6s+pXRs+p^T!JuX1rrn48s8Rn2rVunRrr<"SrVm)s
+[?-3#Mq[1j!W`<#rr3'!!!3&urr<o8s8W&u!WN0#rr<#t!!*'!AcQN*rr)ltrr;uurVm-)!!<<)
+!<<*#qu6Zt!;lct!s&?"rs&H&"98B$!<)rt!<3#u!<)rt!<<'(!<E-!s8Duuq>^HprVlp$!<2ut
+!r`0%qZ$QqrVults8NZ!@1iP?#-\%.!!<<)!<<*#qZ$QqqYpW]!##81rrE#trrE#trrE*!$j$D2
+!s/K'!!3-"!!)utrrE&urrE#trrDoq!WrH%rr33%!!E9$!!)utrrDlprr<?)mf<Chn,E@frr3$%
+!<2ut$iU,.rrE-!s8W&u!;lfr!;?Hm!;c`q!!WB%s8E!!p&G$lrVultrr;uu)#jR8rW!!!!<E-!
+s8Duus8Q[2B]T0l!!*#urrE#t#Qau.!s/K'!!2rrrr<?)mf<Chn,E@frr348!,1HmrVurts8N'#
+"U)L:rsSr/!s8T*!!!'"rr<&ts8N)us8N*!rriH(!s=D[p=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hfTqq>^HprVults8N*#!<)p%p]([$rr<&urrW0"!<3#u
+!<)p%cV4ZF!#OSQrrE-#rVlrr!!N9#rrE&u"o83&rrE-!rs\`(!<<'M!0ZaLq#CEos8N)trs/W*
+!s8T*!!!,urrE-#qu6Zt!<)p%p]([$rr<&ts8N)us8N)ts8N*!rrE-#rr3&r!!)iprrE#t!<E3!
+rrVrq$Msf&!<3!5rVurus3FCF!!!hnrrE*%!s/K'!!E)trrDoq!iH#hrVultrVultrVults8NK.
+!!<<)!<<*%s8N'!rVultrr;uurr3'!!!)lq!<E3!rs&5u$NL,+!<)rt!;ZZp!!rV9!<<2rrr<&u
+rrE-#rVm&r!"/`,!<3!"q>^Nms8N)ms8N)qs8N)urrW#s"nhoq!<3!"rVurts8N)urrr6!"oeT'
+rr3E'!!*'!/-(k#s7lWprr;uurVm-(!!<<)!<<*%qZ$Qq#lhI:!!;rq!!*#u#:ok<mJlt^!<3#u
+!!366jSf)e!<<3(!W`9$"98B$!<)rt!<3#u!<<'&!<<3(K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJj7V!;?El!r`0$q>^HprVults8N-V!7:`F%/Kr.s8NH,o)Jaf!!*#u
+rrDoq"5eV/#3,Xa.KJ-#rrW&t"o\K$!#XJjs8)d"s!Ig$s8Vrr!<<'B!8IPRq#CEos8N)trrOqU
+eFihC0*'GurrOtVd/O%Lq>^a"rr<&ts8N)us8N)ts8N*!rs'hMh>dNQ!!)iprrE#t!]'i'rr3&r
+!!`<"#7CP&s8Vus!;uj%hgb\2s"XT(o`+pkq>UHq!WE&u!<)rt!<)rt!<<'#1'#i"s8N)ts8N)u
+rs&o3o)Jaf!!)lq!]'i'rr33!!!`K'!!)utrrDlprrE*!#'U%Xs8N'!rr3$U!7:`F$i0i-s!Ig$
+s8Vrr!;lfr!;?Hm!;c`q!!V-Ws8)d"p&>7)!:p0iqu?`rs8N'9g].<N!!WBM!8IPRqZ$WrruhBs
+s8Vlp!<3#u!<)p!1'#hrs8N*!rs!ZI&-)Y0!<3!'+TU9ss7lWprr;uu"6L:!MZ3VW1'#i"s8N)t
+s8N)us8N*!rrk.XeGkL-p=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!f;a4rr3'!Ll(s-s+pXRs+p^T!fi*5rr3E'LlVN8M2;02s8.V.rr<"S
+qYpZ^[>9k&rrNN-pAY'np&GL!s8N'9p](9f!"/`5!;HNnp&G*mrs/W!s8VWi!<3#u!<)p!$iotn
+rrNT/o_e^j%06&"rs&)q%KHG.!<)rt!<3#u!<)rt!<<'(#ls`"s7ZKnq>^HprVlp.!;-9j!qZI%
+qYpd&!;ulspAb3krs-kY!"Jr:!;6!arrDoq!r`0$rVultrVultrVults8N-/!;60frrE#trrE&u
+#6Ou(s8Vfn!;c]s%06&"rs&)q%KHG.!<)rt!;ZZp!<<''+93Sbrr<&urrNW0o`"juoDf@#$39i#
+s7QEmqu?ZrpAb-mqZ$Qq"o&&spAbQnrs&W+r;Zfk!!*#urr<o1s8Vfn$NCG5p](9e!!*'!#QXW!
+s7--irr;uurVlp-!;6!arrE*!"s<mhs8N'!rr33/!;HNnnc/[hs8N'$_$'tSrr3$.!;60frrE#t
+rrE&urrE*!"UkD(s,$dLg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj4K!<)p!o`,Ers8N)ts8N*!rrNB)qYpL'ci>p&rrN3"s8UpU!<3#u
+!;ld!rkC8i2<+W;"T\H!rrUdP/,fMJ!#YV5s4[N$rriE"s8UdQ!<<'%!;uls`W-#<s8N)trrNB)
+qt9sj"p"MtrrNB)qYpL!ci>p&rr<&ts8N)us8N)ts8N*!rs&]-r;ZfP!!)iprrE#t!X8Z$rr3&H
+!&XQP#6Fo)s8UpU!<)p'rkC8i2?*j\qt0pg!;c]sp](Tus8N)ts8N)ts8N*!rrNB)qt^9l!<)rt
+!<3!'!W`6"s5!_UqYpU$!;c]p#1*?,s8N'!rVultq>^Hps8N96!-eJC!!*#u!X8Z$rr3AQ!&X]Z
+!;lfrg&M-Ms8N)ms8N)qs8N'&qu?]N!%7I>#6Fo)s8UpU!<3#u!#YV5s4[N$rriE"s8UdQ!<<'%
+!;uls`W-#<s8N)trrNB)qt0pg!<<''%fghRrr<&urs&Z,r;Zf:!!*#urr<.]!taPmrrNB)qt^9l
+!<)rt!<3#u!<<'&"p"Q#K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJj8H!2KPn!qZI"q>^HprVults8N/%!)`aq%,V%,s8PssV>pSZ!!*#u
+rrDlp"9&9$ro="[S,d@(rrVHc)#aL7!#TPPs6BY"s-<Y$s8V?a!<<'2!9F1[h#IHSrrNK,p\t0o
+\,\tjrrT5$;#L=pX8l,srs%?\+92?@!<)rt!<3#u!<)rt!<<'(P5oV&s6K^cq>UL&!;HKm!iuB!
+rr3&W!$D(;#>tPus8V9_!;ld#rVuuu\,\tis8N)qrrVcl$iU,*!<)rt!<)rt!<<'#\,\tns8N)t
+s8N)urs)F%V>pSZ!!)lq!iuB!rr32[!$D7@!!)utrrDlprrE*!#2B2Is8N'!rr3&$!)`aq$f:q+
+s-<Y$s8V?a!;lfr!;?Hm!;c`q!!R3=s6BY"p&>7p!2]_qkPtV^s8N'9D#aP$!#>O"!,V]8l2Uha
+rt,7ls8UmT!<3!"#ls`!rrT\17J-W[!<<''g]0eCrr<&urs',9jT#89!!*#urr<B*jq7`Qs8TS/
+7JZu`!<)rt!<3#u!<<'&\,\ttN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F!g/<3rr3&kLlqN5s+pXRs+p^T!iq.2rr3D\Lo^RUObi]1s5f&mrr<"S
+q>UNpLl(-k!]U2*rr3&F!''rWrr<n^s8U@E1&is.ci=$i!!*'!"9A8ts/5ntrr3$%!<)os!aPen
+p&>(b!3H+u!_WNtrr32,!)3Fm!!)utrrE&urrE#trrE*!#;6)+s8UIH!;ZWr!s&<!rrPgnYl=Y(
+YQ.Anrs'5<lMpn)!!)or#5\B%s'5Vlo`+pkqYpWW!#PV6rrE#trrE#trrE*!!aPenq>^HprVult
+rr33;!:'Ua`rH,9rrPgnYl=Y,YQ.Asrr<&ts8N)ps8N*!rs#A$VuQbs!<3!"9)u3qrsQ%29`HgI
+ci=$i!!)orrrDcmrrDoqrr<5Ks8U@E1%kPO'EIFus2P*>rr;uu(si6^c2]U!0`]Q"s31NDs8N3%
+q>^Jn!!*#u!WrH$rr3%*!1<EYrrE*!#,_I!s8N'!rr33+!;ZZpVuQhss8N'*s1ed@]`8";!1<T^
+rrE#trrE&urrE*!"^M+qs,$dLg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hTHlq>^HprVults8N-B!9!kV$rI#,s8NE+p&G&)!!*#u
+rrDlp!poslir9&s!:'R`!c%e+rVult)!h5%C]Kh%'`dS"s(VN6s8N-#rVumi!!*#u!<E3!rrOJH
+eFihC*WY'prrO8Bi;W`\;#m`urr<&ts8N)us8N)ts8N*!rs'5<m/R*(!!)ip!<E3!rrO8Bi;W`X
+;#m`prs&l2p&G&)!!)or#42Bps!7Zpo`+pkqYpVb!+,X(rrE#trrE#trrE*!![Rirq>^HprVult
+rr331!;6BlB)hr.rrO8Bi;W`\;#m`urr<&ts8N)ps8N*!rrtmlh#IBS!<3!"*rt6ursM[(XoB+9
+li7!"!!)orrrDcmrrDoqrr<5gs8Qm8QhC@`$39c!s(;<3rr;uu)!h5%C]Kh%'`dS"s(VN6s8N-#
+rVumi!!*#u!<E3!rrOJHeF`e@!<<''70)-Crr<&urs&T*rVumi!!*#urr<B*N<0[Ps8OAFeG9.E
+!<)rt!<3#u!<<'&,llHpK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjL/!YW<Gj&lCsq>^HprVults8N`,.KuUCf..'@s8U=D+m\;u!!*#u
+rrE#t"tQY?r4)eCir9;T'b%\Nj%TWPrVult(l6N/=TOQ_mKX6JnnJ.)s8S8_5P*`"!!*#u%VPis
+rVuoq;?C^ir:%=&qu7B*.Kl(1l[f*2.KuUCf..'@s8N'!rVultrr;uurVults8N>k"V9#PDu]n6
+rsi]BLAh/PpaQHBq:@,$_#"'LblApQk?e2hs8OUJmejTq(B=;1!c?]in@Mp$s8N*!rs(6`nbpp0
+!IOeFrrE#trrE#trrE*!%/a!)D;5!X]3G=8!!)utrrE&u#L*5llfVUT!;c^(paQHBq:@,$_#OE7
+!<)rt!;ZZp!;c`q!<3!1paQHBq:@,$_#Ng-%aX]\!!)orrrDcmrrDoqrr<@]cgk3>NrT+Z!;ZX"
+blApQk?e2hrr;uu(l6N/=TOQ_mKX6JnnJ.)s8S8_5P*`"!!*#u%VPisrVuoq;?C^ir:%=&qZ$Qq
+qZ$Qqrr34e!'g)36i[5ds8N*!rt4?*!fI$U;?C^ir:%=&s8N'!rVultrr;uus8N9#;?C]os7Y4N
+ScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#hOm'li-4>LtMP's+pXRs+p^T').EGj8J"tNq`SR`/(Vol`u>&rr<"S
+rVm)&i;3>rLnNc-#iGk+df%T6"l]F[rr<m4k2mfgec4/$+m.l^!!*'!490p.a@Q@3rr3$>!5ea8
+#ko_MNp$B)X$QX_'^cA9[JJ]es6U4&_Y_1X%IX8r!!)utrrE&urrE#trrE*!#LWZ"kN>hF!;ZWr
+*!!kTrs8!#$c;eX$OuP#ru-Fg<;+gE!!*'!9"aikQN/lBpF$0)kPaVF62LW]!<<'(;T/;*_B8ol
+rVultrVultrVults8NN%-j5RnrTL:Js8N'!rVultrr34S!*&[A=TAHurs\9'$c;eX$OuP(rr<&t
+s8N)ps8N)qs8N)urt4W,$c;eX$OuP(eH-oVj\GjVqu?ZrpAb-mqZ$Qq#uKdH+Tg3orr<&prs+)T
+<;+gE!!*#urr<m4k2mfgec4/$+m.l^!!*'!490p.a@Q@3rr3$>!5ea8#ko_MNp$B)X$QU^rrDoq
+rrE&u#<W!:qT)5.!<3#u!<<'2^'+YPs7[oENp$B)X$Qdc!!)utrrE&urrE*!"nsDJNf!f0g'!iE
+qc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjJc!FFmb]b(>'q>^HprVults8N_H"Y87$UBN4Ds8P%YNr-DQ!!*#u
+rrE#t#%l*UmpQ3Iir9:\"&7hQ\I95DrVult(i8ch%L;G%NWE;RcA2H#s8Nr:Y55)U!!*#u!Y#.c
+rr38Z&.YW-qqd\equ7AE"s_@hbW5^<"Y87$UBN4Ds8N'!rVultrr;uurVults8N=]!F><EMuWkR
+rrNW0h>[E[^BH.?q4e*Eq"k"/2uo!9\s36qs8Q]TqX7hmJcFL:%]AgnhO#Yds8N*!rs*JjqXgft
+#NYj`rrE#trrE#trrE*!%,;C(VssT?QmVk5!!)utrrE&u#<2^Dqmr$m!;c^(^BH.?q4e*Eq#C?o
+!<)rt!;ZZp!;c`q!<3!1^BH.?q4e*Eq#??T=n9jo!!)orrrDcmrrDoqrr<@Ao$7dNmf3:e!;ZX"
+2uo!9\s36qrr;uu(i8ch%L;G%NWE;RcA2H#s8Nr:Y55)U!!*#u!Y#.crr38Z&.YW-qqd\eqZ$Qq
+qZ$Qqrr33@!3Z0sMuWkWs8N*!rt11k&ENlH&.YW-qqd\es8N'!rVultrr;uus8N8X&.YUis7XtG
+OT>5X<Ib~>
+s!WEuJH16$JH1B(s![nId/O=%<YtoH2OF4=rrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)t
+rs%.g*!-dQh;SA<mq3XD%RIH!s8N'%q-+(>L&V)`f/3[]b5_PBs8$OD#!q,H!<3!.mnsf"!<<)u
+Tg0.j'hkY(rsn[<)?M%;s8Ve8+U&ELa8Z,=!<)rt!<3#u!<)rt!<3!&e2.:Zbl@e?rseEp'*/+5
+s7URY"V=;Hq>VB4N>Md^irB)Zs4M!(!Y\Phs8W(l5S*u39WIshrrE*!#2!H+!>%Ppr;ZcsrVult
+rVultrr3B*Tg0.j'hkY-rr<&ts8N)urs/O_(^*%_!!)ip#530_"V=;Hrr;uurVultq>^HpqZ$Qq
+rVm)qFWgo"9#pr2#1k^8/'@nmrr;coq>^HpqZ$Qq$2Id1(5;egqZ%!!rs/O_(^*%_!!*#urr<2t
+>6bptrr3P]2$>GQ!!*'!qJ6`J6/MYBrr3Js;A0'2s8W(l5S*u39WIshrrDoqrrE&u#Pr6K#!q,H
+!<3#u!<3!0j:DBMs8J]W&-<S?WrN)!!<)rt!<3#u!<3!$rh2T9s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh5E#2Q5=Ll\Ljq#CAMrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eNrs$tM'EStGeboII!!MdT"!alGrt)4U"$c8T!<<)k:^IM4p](<nrsmXE$ipA.s8.X0
+$j7VX_tsBCjAulp0;njMk?Jc)(1$2(s8N)ts8N)us8N)ts8N)urs#AF"@;MW!r;j*f00TD!<<)^
+>S[DW?0V1b)Z=@[#Zpg%!<<)6;A'$MC%qZ-qh[-<"<LmeqZ$Qqs8N;:;%`mF;9&P6rrE#trrE#t
+rrE&u$i>c;$j7VX_uK`:!<)rt!<3!'rFl`I=8;grq>UZ^>S[DW?0V@grrE#trrDlprrDoqrrE#t
+#3T5,!u>2,rr32',6L1"!!*#uq#L6jrrDoqrr<Ap4p*%1s8Vcm(A[t8rFl`I=8;grrr;uu"RnSW
+,HLhD&?@#X5O\XQs8V^f#n'o2!!*#u%bElQ!<E0"qh[-<"<LmeqZ$QqqZ$Qqrr35q:^IM4p](<n
+s8N)urt)gG"MFd3M)5VD*aZbarr<&ts8N)us8N)urri4U1l;8+g'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCd/O<:2@BU(<nR3IrrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)t
+rs#;c$j7r1r8IY[Z9\s'*G=j=s8N'%asmNOfDbd]Kbanuq#CEps4'.6'R9NU!<3!.W\=YY!<<)e
+F"%D#-u[o;rsln5$3ri>s8U&1&-X8$pAY*l!<)rt!<3#u!<)rt!<3!&JJAGtoDf0mrsbt^#6=i)
+s2@SA"X8-`q>VB+9aD;Squ?`ss.r!i"=Jj"s8VM..1$5-Dqt3hrrE*!#,=Hm"!1t6r;ZcsrVult
+rVultrr3AoF"%D#-u[o@rr<&ts8N)urs/3k#S;4X!!)ip#/s1G"X8-`rr;uurVultq>^HpqZ$Qq
+rVm)@8e;.MG4tq8#)*ft>kn@"rr;coq>^HpqZ$Qq$-F_#2:qm.g&OY=rs/3k#S;4X!!*#urr<2E
+.KhW\rr3O`('e+?!!*'!eN*jJGl.OArr3J.0F%UYs8VM..1$5-Dqt3hrrDoqrrE&u#Ltj='R9NU
+!<3#u!<3!0M?4@Ms6aqW#mVksh#IBS!<)rt!<3#u!<3!$mW0h/s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcFp5rrAho!r;m%JcDSHrrDoq!nmaRmf3:eO8f6>s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKkPtP^U]1De!"OS[V>pPqqYpVj"lA\IrrA,[!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcFp5rrAho!mL^*JcDSHrrDoq!^dXlmf3:eO8f64s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcFp5rrAho!oa1uJcDSHrrDoq!G,[+s8N([rrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDeFKkPtP^U]1D)!'Yu6V>pPqqYpR7U@&!\!0@-\M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCJcFp5rrAho!`]5tJcDSHrrDoq!=[WJs8N([rrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIJcFp5rrAts"usj)fero(JcDSHrrD-[rrA,[!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKkPtP^VuHs.h#5/$"Q4k2V>pPqjT#5[O8f6;s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcFp5rrAts#(Z"8W<Wq(JcDSHrrD-[rrA,[!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcFp5rrAts"jKLE"YZL!s.o\p!9F1[!0@-\N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDeFKkPtP^VuHq$1^47N_L_`_s8N)[s8N([rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCJcFp5rrAts"cOc1&5qYAs.o\p!9F1[!0@-\K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI_#OE7L&_/QoDegjm/R(c_>jN8oDegjm/R(cn,NCf_>jN8OT5=\YQ"W^
+s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDgZ5s+lC/rrDZjrrDEcrrBn8rrDZjrrDEcrrDNfrrBn8rrA/\rrB8&!K$jM
+g'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KC_#OE7L&_/QoDegjm/R(c_>jN8oDegjm/R(cn,NCf_>jN8OT5=\YQ"WT
+s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nId/O<b:DX-A0o#K'rrBP.rr<'(oD\alq[NT+gAh0Qs8N;\FXm\&/qs6'
+rrDEcrrD]krrCRK%e:#-rr<'!s5.rL#7)r9r;Zcsm/R(cn,NCfdf9=Io)J^iaSuJ%FXm\&/qs'"
+#4Q=H"<(k?iW&oXs8N;\FXm\&/qph8!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5E#1TK1M3"L^q#CAM\,ZI.!=Si)rr_os!!(aQrrE*!#013r!t@>ar;Zcs
+m/R(co`+pkeGg$;(]XL8!<<)>@itj_4.lHNrrDEcrrDNfrrCLIrrDWirrC.?#013r!t@>ap\tHM
+;A03YIf&+(rrE*!#013r!t@>a\GlSds7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/O<*1(+4$:;6N'rrBP.rr<'Prr2p"ecGgOgAh0Qs8N;-;AK?K9"t6'
+rrDEcrrD]krrCRK%ZF]nrr<'!s0,B:!u+AAr;Zcsm/R(cn,NCfdf9=Io)J^iaSuIK;AK?K9"t'"
+#.?f-#r8(NiW&oXs8N;-;AK?K9"qh8!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJjKd!$KM_l$!+hq>^Hp\,ZF-!+#U(!8%2Mf)Gt"O4jEoGQ9l)s8N)c
+s8N)ks8N)KrrKelqu6mGO4jEoGQ9l)s8N)cs8N)5s8N)is8N)?rs'd0g&'uX!'L)W#k8];Y5-m<
+)u\Xn#:#;_qri8)4LtImN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#eu1sn,DdVLqiccs+n/arVur5rr2tdrW(OL#<\aBrS('IGQ%RA!:9ac
+!;-<k!7_#L>`S^]#<\aBrS('IGQ%RA!:9ac!5AL5!:p0i!6G0F4JLs9gJ.`mq>U]U"r,2VaV7+u
+rs(Z\jo*q/!-c!R!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjJ6!.!l,b9$_uq>^Hp\,ZF-!9O4[!'gG_f)GtSZgR_5+991Ts8N)c
+s8N)ks8N)KrrFFpqu6n#ZgR_5+991Ts8N)cs8N)5s8N)is8N)?rs)N0meb-L!5J@0#GM;bh>+2[
+Hen],<3u#iarg]!\c2\^s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj7i!7UrI!r;m"q>^Hp\,ZI.!Ab>errZF/!!(FH!rDs#rVultm/R(c
+o`+pkeGfP$^@qR.qZ$cts8N)cs8N)5s8N)is8N):rrW&t"Sr'!M?%_srrVKd@+kP]qZ$c0rrJ)Y
+p=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!fVs3rr3&rLlD00s+n/arr<'/-iX,J((C6DdJj:@!!rQ'rrDEcrrD]k
+rrCUL!rWPspAY3e!!rQ'rrDEcrrBe5rrDWirrBt:!qcO!q>ULJ!7(TD!mUeZg&D-H!!p.8!K$jM
+g'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj7N!;lcq!n%&kq>^Hp\,ZI.!="&QrrWTb!!(FH!n@8lrVultm/R(c
+o`+pkec,^F#Pe#m!n@8lrVultm/R(c^An35o)J^i_uBeg!$:t9!YbY#rr3%?!9Di5!n@8l\c2\^
+s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj8+!7UrI!rDs&q>^Hp"oWf]#u1'krs&1@,6ecSb5VG@!<)rt!<3#u
+!"/Em"987M-jBu7QK%rE!!pFBX8h_j-ia8GrsSOE,6ecSb5_,7"nMZm$i:53ec5Q,0F8.P\bZ:*
+!;c]sqZ$j!s8N)urs&1@,6ecSb5VDOol2#U*f'dq!!*'!mMQ/(qu?Nns8N;sG9[;)9Zm53(&NS2
+"pm,Ps8N'!p.GMfs7L@Q"<N?trrMHsrr;uuqYpWo!!`E%rrE&u#536c"qjVPrr3N%E?56(L]@AS
+!<<)e)$Hf/s8N)us8N',rHo@kBE.jM(CF(9rr;uu"SlC1(l81k#536c"qjVPrr;uu"85@is8)fm
+rs%.7"Y@mu!<3#u!"8aQ((Y'Xqf<P\;Yg=l#5jH7#n0&/rr;uu"oWf]#u1'ks8N)ts8N)krrW&t
+#5S9#)$&t$rrW-!(&@k?o8"4c)eo*Is8.Br"pm,PqZ$QqqYpWo!!`E%rr<H*Hkm6*s8-jR$<$^!
+rs&C\0F8.P\c2X/!!W=K&d_;)rr;uurVultli.!Es7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F!fi*5rr3&rLl_B3s+gjVZAajTrr2p%osBp>PI1&_s8RoRs8RoSs8Rl^
+oUgs>qmi#LNi1Xks8N')A-)#rhuI<g!<)p*l!>2/(glV/kPttfrr3B!!X&,qpN7\b&Q%<Zs8N)q
+rrVlo$iU,*!<3!&l!>2/(glV.rt"3p'Eg"bs8N'!s8UOP$.f"RqZ-Zr#3fG2!uPD2qYq<(BH70a
+6F-Xk!!)4;!WW2]=qh)kVZ-Srdin_jrrDoq!qlU%rVultrr32e?5Nb]?gI^k&*6t/">-MNrr<'!
+s3h/Yf(K(C!<3#u!"8U/%iC*%oiVh;E;ok:rr<2l63JU;rr32e?5Nb]?gI^krr</b0`h=O!;c^"
+Xs=-:nGiRgs8N',q-FRKL]@$M&.ig[rr32sFX%)&:u2-Nrr<5u>6tgSrVlis!<)rt!;-9mp&GKr
+rrNB)qYpKrq>`/Drt":*%L"/2rr<#lBH70a6F-IfrrDoq!qlU%rVult$i+*>(l/.a=V)-`rr2p%
+pN7\b&Q%<_s8N'&q-+.9C&S&2rrE#trrDBb!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj7P!;lcq!n%'-q>^Hp"m/,T)3+Xprs$P<&dBV+p\t3m!<)rt!<3#u
+!"-=Z!WUnR'`o(Ldc1<,!!jtRpA^-Q_>jT7rsQnA&dBV+p]$rf-iX,F$do%bqu>PZ)$Cgio(i=c
+!;c]sfDmQ&s8N)urs$P<&dBV+p\t1'`((7A5Kj*,!!*'!TE?G-qu?Nns8N;E9G.OTGk_(7(#)\&
+!YeY_s8N'!],h"Qs27D:#=$E2rrI(brr;uuqYpWL!&"6MrrE&u#09IN"seHfrr3MI7h#\fbQ%SB
+!<<(l"!d:-s8N)us8N'+k=#\#YlE<?#oo6/s8N'%bU`rWg&D!Ua@m3N,^B(_s8N'$],h"QqZ-Km
+#)F*&@/0d&rr;uu$Kjha+gD!u5RAEqrVm)Z>o<b_BCc'%rr<5b63S6drr2rt!<)rt!;-9mfDmQ"
+rrN9&rVlful2[7JrrpqH#RE2[rr32W<##HK<RUaDrrDoq!n[K*rVult$Kjha+gD!u5RAEqrVm)Z
+>o<b_BCc'%rr<5b63S6drr2rt!<)rt!:0XcK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjL1&g5Ktl?EAVq>^Hp'UQH-MZ>a:s7e2MUA3:g#/gK@!!)utrrE&u
+rr<CVbMrPQ!*A@]flH*Prr<>r!%@lR!1!Tbrr3E%/d8!EegUg@s)S0Mrr3D]!#bh68-G(Ik=>`_
+qZ$Qqqu6caJHBoks8N*!ru(Sa"eteC.0d]ipaQE3oBLo,rr<'!o-jg<q>^HprVm/u/d8!EegUg@
+qu7C^!*A@]flI,m!!%PmirAd'"I8TDJc>ZMX%!$frrDrr"7(L>F8c.=!<<':pau`Epspku_uKK]
+"I8TDJcG`M!<;X>"Jk\irrE&urr<Fo\,)9gAn\[MP5mlIs8N';M9YQj!L!KX/d8!EegUg@s8N'!
+JBQsPrr<&ors.uu%F+EU!!*#urr=1/\,)9gAn\[MP5mlJs8,=iOn@g-"LS4/!!&@tq2554rr;uu
+rVultp&>-[JHBogrrNo8li-ncr;[*!rt+r@WVQ%A!&X`UJH/d7r7Q,es8N)rrr_S<!d">?rr=1/
+\,)9gAn\[MP5mlJs8,=iOn@g-"LS4/!!&@tq2554rr;uurVultli.!Es7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#hb*:nG_pYMV@n+s+hAqlh[c?`;fl4O,`/tif0#os8Rn2rVunRrr<"S
+$E<UUs.G1jq#'9XirB#Y#iu%ss&&jY!!*#u%.=Z6_>D"T%e0K@!6>*=%&<kbs7RH<Z2)of#jD-b
+rrDrr"5m2_Vu?Yq!<<':mg]`AqnNOKnGhnb$+0K_@/p6,!<;$c#h8\MrrE#t#k&62_>D"T%e0Aq
+'f,iLnG14+s8N'!7cV;amL0E/ptT9VrrGQdrr;uuqu6cV<Wo?!s8N*!ru(88$c2_U$4cS*mL0E/
+ptT9Wrr<'!iX,t@o`+pkrr;uu$X2!P=TGuode6fDNW/tX!#eYoj<"HTs6gF*_>D"T%e0Mu!!#LK
+_#OE7!;QR!f)d&Tj@oUSrr;uu+Bm4e=TGuode6fDNW9%P*=&kFeJSYVs8N'!?.JRE!.k.LrrE#t
+rrD`l"5m2_Vtp>o"T\DurrW#s%f62:n0l<Sk$\74s8OkTNUZbd<;QXp!;lcui)TuYrVult+Bm4e
+=TGuode6fDNW9%P*=&kFeJSYVs8N'!?.JRE!.k.LrrE#trrDBb!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjJu!da21bT@JUq>^Hp'Op7h+99^es2"sjfCtpA0DPSI!!)utrrE&u
+rr<C;n:(BP!3c+h\2*(Drr<=j!5JOW!:p0jrr3DD"tS="TER"Drso+nrr3Bo!1s5D$m*Rg\dKYS
+qZ$Qqr;Qoucm0+UrVults8NtR"tS="TER"Ds1S[]bPTICs8N'!s0DkQmeQn_!<)p'_?MOBpRh[C
+q"t(+'`bH2oscdWrr<%1n:(DO"sV7fb;oS%!?Ktps8N)srri;I,S&T-s8N*!ru&ZX/(aNg"Y]ZN
+^'5e)qo_#"rr<'!ZNVQ@o`+pkrr;uu$XMl\,66Lrjm42le,KCI!#fVBbmasIs2"sjfCtpA0DPSI
+!!$U"IfKEJ!;QR!Oo\VRc%l?"rr;uu+C4*q,66Lrjm42le,TI$$m*Rg\dKYSs8N'!@cuqt!7(TD
+rrE#trrDcm"T?[m%bpgZ!WrH$rr3&b!'9uV&ACWfr7<M#`;fiP!3c+h\2*p\rrDus"T?[m%bps^
+rr=0Ijm42lgem2",663ms4If%b58aX+SPj8!!$KkkTBlNrr;uurVultli.!;s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nId/O.42?!RV$_I.nrr<C?s8V`l$NL..!)`aq#2T>&s8N'!rVultrr;uu
+!,;H4!XSk+hZ*TU#ldg+ko1!0!!*#u!j)H"rr32Z!$M=#!#PY7#'9ics1A>#rr3&c!#te7rrE#t
+rVus)OSo.Y!<<'#XT25trs%<[+TJGA:](1l!!E!V"JY\krrE#t!j)H"rr3&V!$M1=!XSk+qu?Zr
+!,;H4!ic5rqu6`r)V4ofrrE#trVus)OSo.Y!<<'#XT25trs%<[+TJGA:](1l!!E!V"JYMfrrE&u
+rr<F=s8Vcm"_Rf7p&GI!s8N'*C]FG"!#GU:!)`aq#MoG's8N'!C&S)3!;QR!QN1h$s60L`rr;uu
+&8(tBp&G8.s8Vcm$NL.=!(Hne%-mm4s8N'!C&e5+!"/`*rrE#trrDfnrVus)OSJhWI/nBgrrVKd
+!qlQur;['%rs8\)pAb-mrVuis!=4ebs8N'1B)ho)!!R!7s7QF"s8T_37K3;qlMqn(rr<%5s8V`l
+$NC)*!<)rt!:0XcN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh5E!ToXGL]Nb'q#CAM$KhBgon\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<
+rr3%VM!*Xprr<?)'FFF;'`S.5rr3$n!3lJ&#-@l#s0D\_rr30E!7:aU!2'8j!mgp4qZ$QqrVuis
+!>E0Es8N*!rrPjoYl=Y,XT2,r8-#^fs8N'$m1K]Rq#C?orVlpm!3lJ&!j)Gtqu6^"!6b9>rr<&C
+rr3$j!3?"s!r<5rrr;uurVuis!>E0Es8N*!rrPjoYl=Y,XT2,r8-#^fs8N'$m1K]RoDegjrr;uu
+$c`5HlMq=4s8V?a(B4@6!"$sNs31O!s%EEsrr35*!)ERo!!(7As8N)ors(:ZcN!pf!!*#urr<VM
+s8VBb$c`5Hl2VV"s'l&$rr3DR!'pSa!!(.@s60Ltrr;uurVultp](3m!>E0ArrODFci3qGcN"+@
+rs/?"%KHG1!6b*9rrE#trVus4^&7p1!"d0Ms6BXm`rH)(!#GV7@fW/#rs[6S5l^ia!6P9@kl;Fs
+s8N)ts8N)brrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCd/O-<$iU,,2=(&;rr<Djs8Sho;ZHb=!9!kV##>6%s8N'!rVultrr;uu
+!:'R`!W`;^hZ*TU#lb5WjTAK^!!*#u!ZqF#rr30u!3Z?"!13]b"qCY!s!Ig"rr3%@!2B>irrE#t
+rVusLjo#/Y!<<'#*rt6urru7!Y5]OChY[?Q!!C.F+R]%)rrE#t!ZqF#rr3$q!3Z5!!W`;^qu?Zr
+!:'R`!Zh?uqu6`_%K$/)rrE#trVusLjo#/Y!<<'#*rt6urru7!Y5]OChY[?Q!!C.F+R\k$rrE&u
+rr<Gjs8T%u''TAqVuU$#s8N'*lMpm"!1<d.!9!kV#>Y?&s8N'!lM^b_!;QR!('*Y"s(MH5rr;uu
+&Es/oW;mRps8T"t>6"UM!87AO%!)ECs8N'!l2UdY!)igrrrE#trrDfnrVusLjnSiW&-2%qrrR9B
+&,#r-j8_+<rrE,\pAb-mrVuis!A!:0s8N'1kl:[^!#"Mqs/5p$s8OGHg&D![Er_s7rr<&`s8Sho
+;Z?^r!<)rt!:0XcK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJjL8&eVkSj&lJ@q>^Hp$Jtg_rW!$"s"j`&rr33!!!`K'!!)utrrE&u
+rr<&Nrr3.<!!+g;h;SD6!!rVP!&Xa5rr<&urrP"Wd/O%Vq>^a"r?26js7cX#qYrb[^Ae-6r;[#t
+s8N)rrr_1_!dXbErrE*!!]0o(rr33!!!`HU!7LcErr<*m"JGMhrrE#t!]0o(rr3&r!!`?#"`+/>
+0p:Als8N'!fDbdO/ca>srrM3rrVultqu6cV=os!Js8N*!rrP"Wd/O%Lq>^a"/ca>ss8N'#8d(gX
+s8N)us8N',hZ*WT!!(mUs8E!"rr;uu$/>L[qZ$g"1]Yo%rs/B##64]'!8%2LrrDio#:BN+s8Vrr
+!<3#u!"e#es8DuuhZ*WT!!<3#56/Fsrs\i+"onT&!8dbUrW!$!s8N)ts8N*!s8;rprr_1_!dXVA
+#jVa'Z2<BE!!;ur!i7pfrW!3)s8Qm8!ATbnq>^Hpqu6cV=os!Js8N'1hZ*WT!!(mUs8E!"s8P:`
+^Ae-@r;[$$rr<&Us8W&u!ri6"!<)rt!:0XcN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#igf4li-4?MW=O4s+h$Zs8W(SM?!U9M#.,N#5X.9s8Rn2rVunRrr<"S
+!;lcq"dt1&X4$e%s8N')s+UMi!/LRS!<3!"%06&"rt+f&%KH81"82]^!=o,/%fl+urrW#s$i9o'
+!;uj"rR!+tZi0q(!<<'#%06&"rs&)q%K?e9o_\[g!!4,GdJ*\@!<)p!%06&"rrVfm%K$//,QIj=
+T()aZrr<&mrr3$-!;-0g!PgAes8N)srri;J.g*-Vs8N*!rrNW0o`"jpoDf@#$NThrs8N'#*!js_
+s8N)us8N',p](9k!!)cns82j"rr;uu$2=K"p&GI"%06&"rs//r%KHG.!;?BkrrDio#7:J*s8Vcm
+!<3#u!"eo)s82isp](9k!!N?%%fl+urs\`($ig5,!;HNnqu?ius8N)ts8N*!s8;rqrri;J.g*-R
+rs6gM(<c["(B=R6rr`4U/IDCV#Qau*,QIj=T()RUrrDus"T?^u"1.t+rr<W)s8Vus!;HNnqu?m"
+rso,!rr3E'!"8i,!!)cns82j!rr;uurVultli.!Bs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJjK/!a=X\]b(q@q>^Hp$N0r(nc0*urrrK"rr32K!&X`U!!)utrrE&u
+rr<&rrr3-5!!-W4q;MAR!!rT]!&FW&rr<&urrNB)qYpL+cN#g%lN@Rls0r(ks8N<(q#:9pkl<71
+s8N)srri21&e*dus8N*!rrNB)qYpL!cN#g%"p"Mss8N'#$m+g1s8N)trrNB)qYpKrcN#g!rrir6
+!G&>.rr;uu!;lcq!X8Z$qu6\#P5YF\!;uj"qR[@Kir/oW!<<'#"p"N!rs$dL2#da[qYU<m!!3QM
+mIL;W!<3#u!"8`)s7--ir;Zff!"f/0rr<B&s8UdQ./sJOqYpL"cN#g%rr<&rrVultq#:R&!;lfr
+g&M-Ps8N'1r;Zff!!)rss7-.$s8N<(q#::%kl<76rr<&ss8VWi%0$;,!<)rt!<<)t!;uj"qR[@K
+iq`T[M#fs"qlp_5%/Tu+pM_>]rW!3+s8NW1!G&>.q>^Hpr;Qor]+PP3rVult&H)S.nc/[fs8VWi
+&HDb8!;QQn%-[aBs8N'!r;Zff!"Al,rrE#trrDBb!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj8K!2BJm!qcO#q>^HprVults8N-,!;ZTn"TSW(rr<&ts8N)us8N'!
+qu6U"q0=%^!!@T-s8N')s7cWq!P8:2!<3!"#lsf"rtPM8s8T\25l]430E;%Y!!<<)!<<*#qZ$Qq
+qYpWi!!rQ'rrE*!!XSl&rVm$$!riE(r;6No!!3l:MYI/N!<)p!#lsf"rrE*$qu7'"Gom"d"+1(J
+!!)oqrrN?(r;6KpPumqarrDoq!qcO!rVults8N-,!;ZTn"TSW("T\Jts8N'#'`s9`s8N)us8N)t
+s8N)ts8N)us8N'!qYpKu!!3*+!;ZTn"on`)rr<&rrVultq#:Bu!;c]prrE&urrE#trrE#trrE*!
+$jcn9!s/K'!!3-"!!)utrrE&urrE#trrE*!r;c]o!qcO!q#:TZ;\0']PlM*drt)U=0A$.%!!*'!
+q0=%^!!@TEs8N)qrrVin#lXf'!<)rt!<)rt!<<'-#lk&0!W`9$!WW0"!<)rt!<3#u!<)rt!:0Xc
+N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F!g8B3rr3&lLm%T6s+pXRs+p^T!JuX1rrn48s8Rn2rVunRrr<"SrVm)s
+[?-3#Mq[1jrr<?)mf<Chn,E@frr3$%!<2ut(B+:9s8QC*Sc=EEGlRdF!!<<)!<<*#qZ$QqqYpW]
+!##81rrE*!!WrH%rr30$!!E6%!;c`q!!3<,]_DI+!<)p!!s&?"rrW0""8i*+mpQh/!!]Y,rr<&u
+rr3!"!;c]r1;3YdrrDoq!pK[trVults8N-&!<2ut"o\K(rrE,rs8N'#"U)L/s8N)us8N)ts8N)t
+s8N)us8N'*rr<#t!!3*%!<2ut#Q=]*s8N'!rr)ls!;QR!!<E-!s8Duurr;uurVultrVults8NK/
+!!<<)!<<*#s8N'!rVultrr;uurVults8W#tqYpW]!##),#J`P3#s,?l&c2M=AcQN*rr)lts8VOr
+&c_n9YPS;!!;c]skl;@ps8N)ts8N)ts8N*!rsSr/!s8T*!!!'"rr<&ts8N)us8N)ts8N)brrIuV
+p=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hfTqq>^HprVults8N*#!<)p%p]([$rr<&urrW0"!<3#u
+!<)p%cV4ZF!#OSQs8N')s1/42!r2cq!<3!!!<E)u(AIk:s8OAFg&El/bQ%SC!!<<)!<<*%qZ$Qq
+qYpVp!(d(grrE*!!<E3!rrr/t$NC,,qZ$Qq!Ws"pp](6nrVlm!!<)p!p](ZursI(H#QOi@i;`fW
+!<)ou!<Dur!>X\os8N)qrrT(u8H&Sg!<<'"!<E)u"o&')rrE,rs8N'#!taPas8N)us8N)ts8N)t
+s8N)us8N)urrr6!"oeT'rVm)s!"/c+!!)rsrrDio!<E3"rrW#s!<3#u!<)rt!<)rt!<<'-!<<3(
+!W`9$"98B$!<)rt!<3#u!<3!$rVurus8;rorrT(u8GN2iShUHZ9Xt-mqYq*X!0ZaLq#CEps3FCF
+!!!hnqZ$QqqYpVp!(d(grrE#trrE#trrE*!$ip>1!s/K'!!E9$!!)utrrE&urrE&u!r`0"li.!;
+s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj7V!;?El!r`0$q>^HprVults8N-V!7:`F%/Kr.s8NH,o)Jaf!!*#u
+rrDoq"5eV/#3,[_!<<''G5r0Rrr<&urrOtVd/O%Vq>^a"s7H@#s&B*/s8OhSeF`e@!;ZWq!!3&u
+rrE*!!]'i'rr33!!!`HV!7LcErr</`'EX0es8N)trrOtVd/O%Hq>^`prs.G3!!`K'!!)ut!\XQ%
+r;Qiq%d<lkrrDlp!<<0!s8N*!rrOtVd/O%Lq>^a"0*'Gts8N'$jqIlSoDegjrr;uurVultrVult
+rr;uu$/>L[qZ$g"1B>f$rs&<"#64]'!;uls!;QR!-NMp$s8)crrr;uurVultrVults8N-U!7^iE
+rrE#trrE&u#7CP&s8Vus!;$3k!!2]k!pot0qYpdD!8IPRq#CEmrr_//!!`<"rrDlp!<<0!s8N)t
+s8N)ts8N*!rrOqUeG9.E!<)rt!<3!'$NTbts82isli.!Es7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F!f;a4rr3'!Ll(s-s+pXRs+p^T!fi*5rr3E'LlVN8M2;02s8.V.rr<"S
+qYpZ^[>9k&s8N*!rrsSG+ohQB!<3!"%06&"rt+f&%KHIk!#kkP!Ug!f$iotms8N)qrrW0"!r`0!
+!<<'#%06&"rs&)q%K?h:o_\[g!!C%@"MFO0rrE#t!Y#/%rr3&l!"J`'#L?fY%KHG.!<)p!$ioqt
+rrVm"qYgHo!;c]srW!#us8N*!rrNW0o`"jpoDf@#$ioqss8N'$_$'tSoDegjrr;uurVultrVult
+rr;uu$2=K"pAbR#%06&"rs&)q%KHG.!;uls!;QR!$39i#s7QEmrr;uurVultrVults8N-/!;60f
+rrE#trrE&u#6Ou(s8Vfn!;-9mrW!#krrUaO:&=kp#QXW!s7--ir;QlF@/pc5s8N)qrrW0"!r`0!
+!<)rt!<)rt!<<'#$iotrs8N)ts8N)urs&W+r;Zfk!!)?b!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj4K!<)p!o`,Ers8N)ts8N*!rrNB)qYpL'ci>p&rrN3"s8UpU!<3#u
+!;ld!rkC8i2<+Z9!<<''%fghRrr<&urrNB)qYpL+ci>p&s.KF(rsAl's8N9'qt0pg!;c]sp](Tu
+s8N*!rrNB)qYpL!ci>p&"p"Mss8N'$NWTjRq#C?orVlp'!;c]p!mgp(q>Ua"^GGpJs8N'!rVlp'
+!;cWn!nS:frVultqYpWl!!rQ'rrE*!!X8Z$rr32L!&X][!;cTmrr<.]!taPbs8N)us8N)ts8N)t
+s8N)us8N'*qu?]N!%7dN!;c]p#1*?,s8N'!r;Zcsq#:R&!;lfrg&M-Ps8N)ts8N)ts8N*!rrNB)
+qt^9l!<)rt!<3!'!W`6"s5!_Uo`#!f!!r2r!c\4IqYpd'!;uls`W-#;rri>91]TE0s8N)qrrVrq
+#lXf'!<)rt!<)rt!<<'#"p"Prs8N)ts8N)urs&T*rr<#T!!)?b!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj8H!2KPn!qZI"q>^HprVults8N/%!)`aq%,V%,s8PssV>pSZ!!*#u
+rrDlp"9&9$ro=%Y!<<''g]0eCrr<&urrT8%;?$RshZ+btrrd?BPlMEqrrT\17J-W[!;c]so)K0s
+s8N*!rrT8%;?$S"hZ+buWrPuns8N'%s5jpqMY[8R#ls`!rrT8%;?$RshZ+bmrs&H&!WN*!!<)p!
+WrPuorrLppr;ZcsqYpWg!"8c*rrE*!!iuB!rr32[!$D6A!)WRmrr<3%jq7`Qo`+pkrr;uurVult
+rVultrr;uu$#KYAlMq\"X8l,srs%?\+92?@!;uiu#ls_qrs+hiD#aP#!!*#urrE#trrE#trrE*!
+!k85!q>^HprVultrr34$!2]_qkPtVTrrVcl$hOB"NWGpOrs',9jT#89!!)or"9&9$rql`q!;c]s
+o)K0ss8N)ts8N)ts8N*!rrT\17JZu`!<)rt!<3!';?3Qns6'F_li.!Es7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F!g/<3rr3&kLlqN5s+pXRs+p^T!iq.2rr3D\Lo^RUObi]1s5f&mrr<"S
+q>UNpLl(-krrE*!#,_I!s8N'!rr3$m!3lJ&!jDYurr3*D!7(Wmrr3%*!1<EYrrDoq!oj7srVult
+s8N-n!3lJ&#-\)$s%*3lqu?Zr"TQ7@"MFR1!WrH$rr3$m!3lJ&!jDYup\tHp!!<3#!!)ut!_EBn
+r;Qes62^c_!;c]sirBnos8N*!rrPgnYl=Y,YQ.As8H>jhs8N'%s1ed@]_)7(!<3#u!<)rt!<)rt
+!<3#u!"%!Os3:U!s%<?rrr32,!)3Fm!!)rs!WrH$q>U[S!71]Fbl@bCs8N)ts8N)ts8N*!rrQI+
+R/-d^!<)rt!<3!''EIFus2P*>o`#!Q!#P8,!^6\IqYpd'!;ZZpVuQhprrW&t!rDrs!;c]sirBno
+s8N)ts8N)ts8N*!rrQI+R/-d^!<)rt!<3!''EIFus2P*>li.!Bs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hTHlq>^HprVults8N-B!9!kV$rI#,s8NE+p&G&)!!*#u
+rrDlp!poslirB#Ys8N9l!8RVS!!*#u!ZqF#rr3$s!3Q8#":bEl!.k.L![Riro`+pkqYpVb!+,X(
+rrE*!!ZqF#rr31"!3Q8B!8dVQrr<3%N<0[Pq>UHr!<)p!*rt6urrQ$tXnVi"m/R@jrr<&trrO5A
+hYdBS8#Z@crrDoq!gs$prVults8N-B!9!kV##PB&ruM0squ?Zr"TOG_&ENK`rrE&urrE#trrE#t
+rrE&urr<Aks8Qm8QiA--i;W`\;#m`urr<&srrE-#q#:R6!:0[bC&e85s8N)ts8N)ts8N*!rrOJH
+eG9.E!<)rt!<3!'$39c!s(;<3o`"u\!+,9s!Z;78qYpd%!<)rt8cSkgrrVQf#5\B"!;c]sR/gRl
+s8N)ts8N)ts8N*!rrOJHeG9.E!<)rt!<3!'$39c!s(;<3li.!;s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJjL/!YW<Gj&lCsq>^HprVults8N`,.KuUCf..'@s8U=D+m\;u!!*#u
+rrE#t"tQY?r4)eCirB#YqZ$Qqrr39!.KuUCf..'@rr3,Z!!rX,rr39%;?C^ir:%=&qZ$Qqs8N<X
+ZLRnB9*'D<s8N*!ru1Y^"f(nF.gEfhpaQE4p$72/rr<'!s5ajpMYd>_BE3ecs8VjD"f(nF.gEfd
+rsC9TmejTq(B=C7!<)p(paQE4p$72/HYiW[rrE*!#;EIRrR4C?Hi=!E!<<'?paQHBq:@,$_#O0Z
+"IA`HJcG`M!<<)\&d!sjrr<&ps8N)us8N)ts8N)ts8N)us8N'4LsPWp!KR3T.KuUCf..'@s8N'!
+r;Qk4!/CIKrs.rs%aX]\!!*#urrE#trrE#trrE*!%/a!)D;5!X]3G=8!!)utrrE&u#L*5llfVUT
+!;ZX"0XC6Idn9^grVultrr30Y^\R2R!Fts*&<d)YoA2k8!<<'LW:'So!#GG2rrE*!#;EIRrR4C?
+Hi=!E!<)rt!<)rt!<<'-r)*T5g\gQQ>Q=^'!<)rt!<3!'blApQk?e2hli.!Es7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#hOm'li-4>LtMP's+pXRs+p^T').EGj8J"tNq`SR`/(Vol`u>&rr<"S
+rVm)&i;3>rLnNc-rrDoqrrE&u#ji$._Y_1X%IX5q"L.qD!4r10#ko_MNp$B)X$QU^rrE*!#?&M6
+qSF?V]D_d0!<<';m0jB>qn`^Mmf2\`$+9Wc@/p6,!<<)5"U)L7rrO/?_Z'Q@m0jB>qn`^Mmed"k
+9"aikQN/lBrr<&trsA*%$+9Wc@/hFsr;Zcss8N=%`:j&E+9K1Rs8N*!ruUP9$c;eX$OuP(mL0E0
+qV>QZrr<'!s1SX>]`8!3!;ZZp!<3#u!<)rt!<)rt!<3#u!#&2kjrjfVs6U4&_Y_1X%IX8r!!)rs
+!ZV3Wq>U]M![6^f:B1Cos8N)ts8N)ts8N*!rs\WM"HM[Dkc7#Lrr<&ts8N)urs+)T<;+gE!!)ip
+#?&M6qSF?V]D_d0!<3!&<mgj&C&sRprt%9mJGR>Y!!*'!9"aikQN/l=s8N*!rs)H?pA2WK!k\F2
+rrE#trrE#trrE*!%/2.QNp$B)X$Qdc!!)utrrE&u#CukSp=*4F!:0XcM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJjJc!FFmb]b(>'q>^HprVults8N_H"Y87$UBN4Ds8P%YNr-DQ!!*#u
+rrE#t#%l*UmpQ3IirB#YqZ$Qqrr38="Y87$UBN4Drr3*u!!rYcrr38Z&.YW-qqd\eqZ$Qqs8N=B
+de`U:%0ttms8N*!ru/WU/(jZm"YBHK^'5h+qoh)#rr<'!s,7!jjSJlX%055`rs6@C/(jZm"YBHG
+rsEA^qX7hmJcG`M!<)p(^'5h+qoh)#&F98orrE*!#B/&eoW&E+jSf,Y!<<'?^BH.?q4e*Eq#A&4
+,L$&/3WK*Z!<<(X!YFGmrr<&ps8N)us8N)ts8N)ts8N)us8N'4D">m^#O_W,"Y87$UBN4Ds8N'!
+r;Qg-!8[JN#EAgfo$3$k!<3#u!<)rt!<)rt!<<'-g^jsnnGD(0-NF)G!<)rt!<3!'2uo!9\s36q
+q>U\<de`U:%0ttms8N)urs!W)qU%M1bPD/L)$$i9W/L]Vs8Q]TqX7hmJboEH!<<'(DpnLSWso<p
+rVultrVultrVults8NM_&.YW-qqd\es8N'!rVultrr33_!06rfPlLgMrrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nId/O=%<YtoH2OF4=rrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)t
+rs%.g*!-dQh;\J7!;c`q!<)p%p2qM^&5("Arri9C!!M]frs/Os5S*u39WIshrrE*!#2!H+!>%Pp
+r;Zcsrr32rFWgo"9#pr2$1r'Q![*=!rr<&urr_<n!fHmT%I[1.!<E0"p2qM^&5(">rsIFk*!-dQ
+h>dKT!;uj&oPGKJ+Gfdup&+ji!<<''fOPs&&4*5ls8N)urs&1>+U&ELa8Z)FoPGKJ+Gg't!!*#u
+#36<sMYdA\q>^Hprr;uurVultrVultrr;uu"Sl7,(5;bf#530_"V=;Hrr;uur;Qog;A0'2qYpcO
+2$>GQ!!*#urrE#trrE#trrE&u$iZhb&-<S?WrN)!!<)rt!<3!'rf%`t52uVCq>UZOA/kU]6)XY\
+rrE&u"jp$P%6L?[rt,$C&I(PY!!*'!fk)3*'3*fas8N*!rs%+d*!$U:Vu6Sp!<)rt!<)rt!<3!+
+rh2Rg!YnD/s8N'!rVultrr36&N>Md^irB)FrrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh5E#2Q5=Ll\Ljq#CAMrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eOs8N)qs8N)trs%Xk('>=Xl2CVbq?R',qu-O"qh[-<"<LmeqZ$Qqs8N;:;%`mF;9&P6
+rrE&u#3T5,!u>2,rr3;c<tGHeVuQbs!<3!#]EAAMqu7,W4q%Gls8V7e('>=Xl2(De^JY[G)eo'H
+rr<&srs7[e&-FS`n-f3ms8N*!rs$/6&cibF`r,l:!<3!&k?Jc)(1$2(rs@af&-FS`s8N'!rr328
+"9cC2!#GD1rrE&urrE#trrE#trrE&urr<2k4p*%1rr32c>S[DW?0V@grrDus"P5gG!<Dur#-/sN
+5O\XQrr;uurVultrVultrr3B'M)5VD*aZbarr<&ts8N)urs/L:%L?/3!!)ip#/*kH!>\PPr;Zcs
+rr3/,3X-3i_>+$AoM>i%=nhsss8Ti3&cs"dp\Opi!<<'']hoCC(/`*Ls8N)ts8N)ts8N)ursS^\
+1^jL.?GlgC!!)utrrE&u#Q8?H#Zpg%!:0XcM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCd/O<:2@BU(<nR3IrrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)t
+rs#;c$j7r1r8RbV!;c`q!<)p%`C^[F,'N\YrrhTi!$V=>rs.t5.1$5-Dqt3hrrE*!#,=Hm"!1t6
+r;Zcsrr32A8e;.MG4tq8$,T%:#=-K4rr<&urr\,[&EN`g%B;)e!<E0"`C^[F,'N\VrsGSg$j7r1
+r;Zcs!;uj&_F"Y85g-qmrqufr!<<''UHo:j*b4=0s8N)urs$G7&-X8$pAY'u_F"Y85g03-!!*#u
+#)WHnjOsT(q>^Hprr;uurVultrVultrr;uu"Ni1s2:qj-#/s1G"X8-`rr;uur;Qo"0F%UYqYpbR
+('e+?!!*#urrE#trrE#trrE&u$gr'b#mVksh#IBS!<)rt!<3!'oh>]'GPhF@q>UYo5n!i:A**Xg
+rrE&u"d:D=(gGnmrt*^A"Vc4Z!!*'!V*PLm-\M?ns8N*!rs#5a$j.P\jo#/Y!<)rt!<)rt!<3!+
+mW0f`#:ONGs8N'!rVultrr35r9aD;Squ?`_rrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$iVrr.,Kp)gg&n54s8N(Ms,d6]N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDeFKJcF^/!KL7)rrSkthW+Y9!.k03rrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$iVrp;]$(*T6PK%Ns8N(Ms,d6]K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$iVrpbL!0JsARONtrr@WMOT,??s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcF^/!>jV9rrF%4irB#YJcCi3!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$iVrodnB:h4%+sS>rr@WMOT,?5s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$M#[JTJcCi3!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcCQ+rr@WMOT,?<s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$M#[JTJcCi3!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$M#[JTJcCi3!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcCQ+rr@WMOT,?<s7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$M#[JTJcCi3!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI_#OE7QN-sbScA]i[f?@-d/X+Gj8],ZScA]iec5XLmf3:eo`"rNs7Y4N
+ScJXf<Ib~>
+s&FUMJH16$JH1B(rDgZ5s+m!@rrAVirrBM-rrCFGrrD*ZrrAVirrCULrrDKerrD]k!K$jMg'!iE
+qc-XH~>
+s*'"oJH16$JH1B(s*+KC_#OE7QN-sbScA]i[f?@-d/X+Gj8],ZScA]iec5XLmf3:eo`"rDs7XtG
+OT>5X<Ib~>
+s!WEuJH16$JH1B(s![nId/O<b:DX-A0o#K'rrBP.rrD'YrrC@ErrCLIrrC+>rrDWirrCFGrrD*Z
+rrC@ErrCLIrrCULrrDKerrD]k!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh5E#1TK1M3"L^q#CAM\,ZI.irB#YcN!nEdf9=Ia8c/>o)J^id/X+Gj8],Z
+cN!nEdf9=Iec5XLmf3:eo`"rKs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCd/O<*1(+4$:;6N'rrBP.rrD'YrrC@ErrCLIrrC+>rrDWirrCFGrrD*Z
+rrC@ErrCLIrrCULrrDKerrD]k!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJjKd!$KM_l$!+hq>^Hp\,ZI.irB#YcN!nEQN-sbTE"okcN!nEO8o4[
+o`"rNs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#eu1sn,DdVLqiccs+n/arrD'YrrC@ErrAAbrrA\krrC@ErrA,[rrD]k
+!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjJ6!.!l,b9$_uq>^Hp\,ZI.irB#YcN!nEQN-sbTE"okcN!nEO8o4[
+o`"rDs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj7i!7UrI!r;m"q>^Hp\,ZI.irB#YcN!nEQN-sbTE"okcN!nEO8o4[
+o`"rNs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F!fVs3rr3&rLlD00s+n/arrD'YrrC@ErrAAbrrA\krrC@ErrA,[rrD]k
+!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj7N!;lcq!n%&kq>^Hp\,ZI.irB#YcN!nEQN-sbTE"okcN!nEO8o4[
+o`"rDs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJj8+!7UrI!rDs&q>^Hp"oWf]#u1'krs&1@,6ecSb5VG@!<)rt!<3#u
+!"/Em"987M-jBu7QK%rE!<)rt!"8aQ((Y'Xqf<P\;Yg=lrr<2t?O.L)rr;uurr33#NA(YI5Ipdn
+rr<H*Hkm6*s8-jR$<$^!rs&C\0F8.P\c2X/!!iIM&d_;)s8VrrqZ$Qq$iPGg%qkq>Eu,0]q>UC%
+p3._c&kpIJo`,0drr33"#m/ZW!!*#urr<6$HkH`[o`"jpeMRL]c2[k?rsn^A*X!O>s8Ve:,6ecS
+b5VG@!!iIM&d_;)s8Vrrs8N;pL_p45C&%]-rrE&urr<6$HkH`[o`"jpr/EB:$pV<%s8N'+p.GMf
+qgp4##rIt@s8N)us8N',rHo@kBE.jM(CF(9rr;uu"SlC1(l81krrE&u#5jH7#n0&/rr;uu$iPGg%
+qkq>Eu,0]q>UBur/EB:$pV<%s8N'(rHo4a:%\JcqZ-Kmrr<H*Hkm6*s8-jR$<$^!rsSOE,6ecSb
+5_,7"nMZm#5\].ec,ULrr;uu"oWf]#u1'krs%"2"Y@q!!;ZX&70&t[s+M$as7H?trr;uurr;uu"
+oWf]#u1'krs%.7"Y@mu!<3!&p3._c&kpIIrrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!fi*5rr3&rLl_B3s+gjVZAajTrr2p%osBp>PI1&_s8RoRs8RoSs8Rl^
+oUgs>qmi#LNi1Xks8N)ts8N',q-FRKL]@$M&.ig[rr;uu"S"e]-*I7IrrE&u#5<6b"qa\frr;uu
+$i+*>(l/.a=V)-`rr2p%pN7\b&Q%<_s8N'(q-+.9C&S)3qZ-Kmrr<H&?4Rm.s7KM+&9.XJrsS't
+(]tU^li6/K$N0o'#5&$"p&>!lrr;uu"o2@/%r)"Ars#DH"@DYZ!;ZX)j]W?$/Z/RJl!>2/(glV.
+s8N'(q-+.9C&S)3qZ-Zr#3TV/"XSg#rr;uurr;uu"o2@/%r)"Ars&4?,6e`Vh>[HS!".pE!WVk,
+*<Qa;ZM"7t!<3#u!"8U/%iC*%oiVh;E;ok:rr<2l63JU;rr;uurr32sFX%)&:u2-Nrr<H&?4Rm.
+s7KM+&9.XJrs&4?,6e`Vh>[HS!!i=(#nLbKs8VrrqZ$Qq$i+*>(l/.a=V)-`rr2p*l!>2/(glV/
+kPttfrr32q!X&,q!!*#urr<5u>6tgSrVlg$W$;F3nc/[crsKD=kl:Z-,6.],!"o51rrE&urr<5u
+>6tgSrVlg$Xs=-:nGiRgrs%^o(]tU^li-nbM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJj7P!;lcq!n%'-q>^Hp"m/,T)3+Xprs$P<&dBV+p\t3m!<)rt!<3#u
+!"-=Z!WUnR'`o(Ldc1<,!<)rt!".mX#pHPQf0BW^Q2Ua_!!LLs"uk67s8N)urs%@d)$Cgio)A[h
+!".mX#pHPQf0BW^Q2U^ehd%*&)/&O>s8N'(k!B4hNW/tXqZ-Kmrr<Dh70t-As49LB*0pL&$cl!S
+"seHfs.TK@rr2p%dK'gSrr<&us8N'&k!B4hNW/qW#(dTs@/0d&q>UrC7h#\fbQ%U`9G.OTGk_4;
+rr<;d63S6drr<#q!<<'&eP$5S18=aIrrE&urr<5b63S6drr2p%hd%*&)/&O>s8N'+],h"QgJemh
+'NNTSs8N)us8N'+k=#\#YlE<?#oo6/s8N'%bU`rWg&D$O!<3!&hd%*&)/&O>s8N'+k=#\#YlE<?
+#oo6/rs%@d)$Cgio)A[h!!hXQ"W<=!s8VrrqZ$Qq$Kjha+gD!u5RAEqrVm8H9G.OTGk_64!%7dF
+rs$mP%K$/*!<3#u!!VLO"W<=!rr31S(("CE!!)ip$O?b*s8NX_s8S\k7K3>e!<3#u!!VLO"W<=!
+rr31Y(^XUG!!*#u#09IN"seHfrr3"Ns7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJjL1&g5Ktl?EAVq>^Hp'UQH-MZ>a:s7e2MUA3:g#/gK@!!)utrrE&u
+rr<CVbMrPQ!*A@]flH*PrrE#trr<Fo\,)9gAn\[MP5mlIs8N'ZM9YQj!L!K_!!*'!qa^jPo]JaJ
+[/^.+!1:7lP5o3.\,)9g5l^l]8-G(Ik=>`_s8N'!Qb3'O!''uXrrDfnrr<t)\,)9gAn\[MP5mlJ
+s7e2MUA3:g#/gI^!+Z$.#29+qs8N'!rr;uu&!sp(MZ>a:s6U"$d.2&S!;c^6paQE3oBLo,pau`E
+pspku_uK`:!11=nMZ>a9s8N)trs/<7WVQ%A!&X]TrrE&urr=.-]D7?b3<0$U8-G(Ik=>`_s8N'!
+JBQsPJH/d7r7Q,`s8N)us8N',R()pU!+ooRqNCnErr;uu3Jl#N<<89_rr<'!s8,=iOn@g-"LS4/
+!!&CqqNCnkBXdi%!'pSaqa^jPo]JaJ[/^.+!11=nMZ>a9s8N)ns8N';R()pU!+ooRqNCnEs8VjH
+"eteC.0d]iEr]_Lrs%3X)?9^:!<3#u!"YF.q2554s8VHj&('lb!!)ip$b-1%s8<E8jT"!8+9)<?
+!<3#u!$7K=q2554s8VNn%F+EU!!*'!pau`Epspku_uKaqs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh8F#hb*:nG_pYMV@n+s+hAqlh[c?`;fl4O,`/tif0#os8Rn2rVunRrr<"S
+$E<UUs.G1jq#'9XirB#YrVult$X2!P=TGuode6fDNW/tX!'*j9j<"HTs8N'!s8Vd5#I4*T)$oI+
+rr<%&de6fD\NA75=TFH]s7RH<Z2)of#jD<g!!$<ToMGU>rr;uup](6n)HtS_=TGuode6fDNW9%I%
+L^,M^^:S@ru_<^rr31u!'C5\!!*#urr<R8eau]=JcGbu![?dh;ucppru1;6$+0K_@/o[*$c2_U$
+4cS*rr<%)eau]=Jc>]L!<)p&n0l<Sk$\74rr;uurr;uu+'mFh;#l1Is7RH<Z2)of#jD<g!!#LK_
+#H1jNUZbd<;$:k!<3#u!"2uYp/qC+44<h*!0.!Xrr>&TjQ%BafDkjN!<<)m*=&kFeJSYVs8N'!>
+13+I!4b2>p/qBTs8Vd5#I4*T)$oI+rr<%)eau]=Jc>]L!;HNn!#f%hp/qC+44<h*!0.$Ymg]`Aq
+nNOKnGaU2a8Z)CU]<LVrr<&us8N'0?.JRE!.k1MdK1WTk#;<\q>Ugr!3#qo"pOi&V>s<hs8N)us
+8N'??.JRE!.k1Mf)d&Tj@oUSs8VNt$c2_U$4cS*s,$dLg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjJu!da21bT@JUq>^Hp'Op7h+99^es2"sjfCtpA0DPSI!!)utrrE&u
+rr<C;n:(BP!3c+h\2*(DrrE#trr<F4jm42lgem2",663ls8N'ZC@TOX#k.fn!!*'!faJqEqmm.X
+pAb-m!+"^Q,66Lrjm42le,TI$$m*Rg\dKYSs8N'!@cuqt!7(TDrrDfnrr<sCjm42lgem2",663m
+s2"sjfCtpA0DPPX!9jF^#"&B^s8N'!rr;uu%q=_c+99^es,$h\o$E9p!;c^6^'5e)qo_#"_?MOB
+pRh[Cq#C?o!+P-T+99^ds8N)trs-8-gAKPS!6"m:rrE&urr=-MkNF#gcN!pt$m*Rg\dKYSs8N'!
+Aak0K'`bH2oscdMs8N)us8N',?01Dt!8LH5lluMZrr;uu3GS*/%1)G&rr<'!s4If%b58aX+SPj8
+!!$<dlluMc;<@-h!7UuJfaJqEqmm.XpAb-m!+P-T+99^ds8N)ns8N';?01Dt!8LH5lluMZs8Tq?
+/(aNg"Y]ZN%fkhmrrtgjT)\fj!<3#u!"WQ%kTBlNs8RrW>4U$u!!)ip$QfB)s6'k#r;St]\GlO.
+!<3#u!$5V4kTBlNs8S5_<q4Fj!!*'!_?MOBpRh[Cq#CAGs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nId/O.42?!RV$_I.nrr<C?s8V`l$NL..!)`aq#2T>&s8N'!rVultrr;uu
+!,;H4!XSk+hZ*TUrVult$YKG=p&G8.s8Vcm$NC)*!"NfEs69S"s8N'!s8T_37K3<'lMqn(rr<%2
+s8Vcm"_Rf7p&GI"s1A>#rr3Dm!#tt<!!$a5s7H@!rr;uup](6n&8(tBp&G8.s8Vcm$NL..!)`aq
+#2T>&s5<qorr31E!-8,>!!*#urr<RDs8V`l$NL-j!,qo;lMpq]rrT2#:]14oXT25trs[`a+TMHA
+!,;K5o`,?us8N)orrW-!#6+Z&!<3#u!"*H?s7H@!s8T_37K3;llMqn(rr<%5rr3$+!3,MgrrE&u
+rr<F=s8Vcm"_Rf7p&GI!s8N'/C]FG"!#GV7!!*'!]DtD"rtju$)uop<!+u92p&G8.s8Vcm$NL.=
+!(Hne%-mm4s8N'!C&e5+!"/`*rrDfnrr<UBs8Vcm"_Rf7p&GI"s/c8urr32Z!$M=#!#PY7#'9ic
+s8N'!rr;uu%r)(Do`,@!s-*M%s8VBb!;ZX&jo?;!lje8Ms/5otrr;uurr;uu'P[UIo`,@!s-E_$
+s8V<`!<<)$!)`aq#2T>&s8S&Xp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh5E!ToXGL]Nb'q#CAM$KhBgon\b1s/Ut0rr32ULogXVLku$0s+p[Ss+g[<
+rr3%VM!*XprrE#trr<GHs8VBb$c`5Hl2VV!s8N'/cN!ph!&FTS!!*'!@fW/#rtj#^5l^ia!65'=
+lMq=4s8V?a(B=DE!2'8j%+"u>s8N'!aoDD*!#5G4rrDfnrr<VMs8VBb$c`5Hl2VV"s%EEsrr32)
+!)ER#!&acU"s3ils8N'!rr;uu&'=kOkl;Fts"=B"s8UFG!;c]s8-#^grrPjoYl=Y2XT2,rrr<&@
+s8V<`'`S.4!;QQqq#Cm's8N)us8N'+aoDD*!#5J5@fW/#rs-mN5l^ia!6kHB!WrGGnc/Uhrr;uu
+$c`5HlMq=4s8V?a(B4@6!"R<Ss31O!s8N'!s8QR/TDnj,ci??2rr<&=s8VBb$c`5Hl2VV"s'l&$
+rr3DR!'pSa!!(.@s60Ltrr;uup](6n&B=bMlMq=4s8V?a(B=D.!3lJ&#-@l#s0D\_rr30E!7:cG
+!!*#urr<SOs8V<`'`\1d!7CiHci=(ArsQ^E3WIPK*R=[D!5ng9rrE&urr<bTs8V<`'`\1g!7(WE
+b5_PBs%EEsrr32)!)ERoM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCd/O-<$iU,,2=(&;rr<Djs8Sho;ZHb=!9!kV##>6%s8N'!rVultrr;uu
+!:'R`!W`;^hZ*TUrVult$g@WjW;mRps8T"t>5nR%!"S;os(_V%s8N'!s8OGHg&D!fEr_s7rr<&_
+s8T%u''TAqVuU$$s!Ig"rr3CJ!2BMn!!)9`s.]Qlrr;uup](6n&Es/oW;mRps8T"t>6"UE!9!kV
+##>6%s&&i`rr304!:0[b!!*#urr<Sos8Sho;ZHb3!:9acD?'\5rrO5AhYdBT*rt6ursV['Y5eM%
+!9sO`UB"3ks8N)orrV6]2ZEaV!<3#u!".ujs.]Qls8OGHg&D!VEr_s7rr<&arr3$#!9E\MrrE&u
+rr<Gjs8T%u''TAqVuU$#s8N'/lMpm"!1<fd!!*'!-NMj!rtf_VUAt5n!9jI_W;mRps8T"t>6"UM
+!87AO%!)ECs8N'!l2UdY!)igrrrDfnrr<Vos8T%u''TAqVuU$$ruV7!rr30u!3Z?"!13]b"qCY!
+s8N'!rr;uu&*a,oUB"3lrtPP#s8Qs:!;ZX&<<0'!C3^<Srtkaurr;uurr;uu'^>YtUB"3lrtYV"
+s8Qd5!<<'@!9!kV##>6%s8R]Np=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJjL8&eVkSj&lJ@q>^Hp$Jtg_rW!$"s"j`&rr33!!!`K'!!)utrrE&u
+rr<&Nrr3.<!!+g;h;SD6!<)rt!"7Z`s8DuuhZ*WT!!<0"rr<P`s8Vrr"onT&!<<'`!5AI4(]==;
+s8N'!hZ*WT!!(mUs8E!"s8P:`^Ae-@r;[$$rr<&Us8W&u!ri6"!;HNn!"e#es8DuuhZ*WT!!<3#
+1]Yo%rt,#,#64WF!n.,D!XJT%rr<&us8N'0hZ*WT!!<3#-32j$s82isqYpUL!7LfF!]0o(rr3E'
+!!`K'!!(mUs8E!"rr;uur;Qhp3Y),h!!3*!rrE&urr<D_s8W&u!rr9b!5AI4#Q4W+s8N'!fDbdR
+C]FJjP25d1rrE&urr<G`s8W&u!8dbUrW!$!s8N'/g].<N!!WE&!!*'!56/FsrtkV6"onT&!8dbU
+rVurTs8W&u!rr9b!5AI4%/g/0s8N'!hZ*WT!!<0"rrDfnrr<Ves8W&u!8dbUrW!$"s"j`&rr3Q+
+!!`K%+Tg*lp]:]ss8N'!rr;uu&)R?drW!$"s!@a$s8Vus!;ZX&q>pp%_(a(Ws"jc&rr;uurr;uu
+']/lirW!$"s!Ig$s8Vrr!<<'U!7:`F#5S<(s8S&Xp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F#igf4li-4?MW=O4s+h$Zs8W(SM?!U9M#.,N#5X.9s8Rn2rVunRrr<"S
+!;lcq"dt1&X4$e%s8N)ts8N',p](9k!!)cns82j"rr;uu%ep#'p&GI"rr<'!rso,!rr3f2!"8i,
+!!)cns82isp](9k!!N?%%fl+urs\`($ig5,!;HNnqu?ius8N)ns8N'1p](9k!!)cns82j"s8NN.
+o`"k%oDf@#q?R2rs6]mtrr;uu!<3#u!"\i(s82j!s8NB*p](9f!!)lq!Xf##r;Qg-!;-9j%.jN/
+s8N'!p](9k!!E6#rrE#t"9"$-$2so)!WN-!!<3#u!"/K#s82j!s8NT0nG`Fmq>^p'rr<&mrr3-I
+!!,cbnFZb\!<3#u!"8Q$s82isp](9k!!N<$rr<Q's8Vcm$NL,+!<<'0!:^!f(]"+>s8N'!p](9k
+!!)cns82j"s8NT0nG`Frq>^p'rr<&ns8Vus"9/?#!;HNn!"eo)s82isp](9k!!N?%%06&"rt+f&%
+KH81"82]^!=o,/rr<&us8N'0p](9k!!E9$#ls`"s7ZKnq>Uip!=o-9H?rNi%0?,#s8N)us8N'5p
+](9k!!E9$$39i#s7QEms8NN.o`"jpoDf@#s,$dLg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJjK/!a=X\]b(q@q>^Hp$N0r(nc0*urrrK"rr32K!&X`U!!)utrrE&u
+rr<&rrr3-5!!-W4q;MAR!<)rt!"8`)s7--ir;Zff!"f/0rr<Q+s8UdQ.0';I!<<'(!;QQn([1oM
+s8N'!r;Zff!!)rss7-.$s8N<(q#::%kl<76rr<&ss8VWi%0$;,!;HNn!"f).s7--ir;Zff!"f21
+"p"N!rsR-Q2#lkE$N'k5!B^;\rrE&urr<T-s8VWi%0->2!;ulsgAh6MrrNB)qY^?p"p"N!rs[3R
+2#mRU!;ulsnc0*ts8N)trr`"7,6n,I!!E6#rrE&urr<E(s8VWi%0->4!;QQn#O)4=s8N'!qu6U!
+&-)`AXnhVhrrE&urr<H)s8VWi!;ulsnc07#s8N'/qu?]M!%@mI!!*'!#6=Purtjo"/-#VL!;uls
+nc/[fs8VWi&HDb8!;QQn%-[aBs8N'!r;Zff!"Al,rrDfnrr<W.s8VWi!;ulsnc07$rrrK"rr3AP
+!&X`A":G&+\,e\js8N)us8N'0r;Zff!"Ao-"T\K#s4[MRq>UiK!BC*+bqH^/"p4Z#s8N)us8N'5
+r;Zff!"Ao-"T\H"s4RGQs8N9'qYpL!cN#g%s+::EeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj8K!2BJm!qcO#q>^HprVults8N-,!;ZTn"TSW(rr<&ts8N)us8N'!
+qu6U"q0=%^!!@T-s8N)ts8N)ts8N)ts8N)us8N'!qYpL/!!3-"!!*'!#lk&0!W`9$!WW0"!<)rt
+!<)rt!<<'-#lk&0!W`9$!WW0"!<)rt!<3#u!;HNn!<)rt!<)rt!<<'##lsf"rsA`-s8T\25l]43
+0E2"O!<3#u!<)rt!<<'#"9A>us8N)qrrN?(r;?Qr#lsf"rriB(s8N'!rVultrr;uurVm,2!&)t%
+rr<&us8N)us8N)ts8N*!rs]87!s8T*!!!'"rr<&rrr32uGom"d"+0_@rrE&urrE#trrE#trrE&u
+rr<&qrr3Z4!WW0"!<<'*!!<<)!<<*#s8N'!rVultrVults8NK6!!<<)!<<*#s8N'!rVultrr;uu
+p](6nrVultrVults8N-,!;ZTn$31/-s187rs3Ug"rr;uurr;uurVults8N-'!;lcqrrDio$!RD?
+<.+0@pAbU"s8N)us8N)ts8N*!rrN<'qYpNp!<<'##lsf"rriB(s8S&Xp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F!g8B3rr3&lLm%T6s+pXRs+p^T!JuX1rrn48s8Rn2rVunRrr<"SrVm)s
+[?-3#Mq[1jrrE#trrE#trrE#trrE&urr<o8s8W&u!WW0"!<<'#!!<<)!<<*#s8N'!rVultrVult
+s8NK/!!<<)!<<*#s8N'!rVultrr;uup](6nrVultrVults8N-&!<2ut$iU,.s8QC*Sc=EEGlIaC
+!<3#u!<)rt!<<'(!<E-!s8DuuqYpQs!;lct!s&?"rs&H&"98B$!<)rt!<3#u!<)p&AcQN*rr)lt
+rr;uurr;uurVults8NN0!!<<)!<<*#s8N'!rr2p%mpQh/!!]Y"s8N)us8N)ts8N)ts8N)us8N'9
+rr<#t!!3-"!!*'!!WW<)!W`9$!WW0"!<)rt!<)rt!<<'-!WW<)!W`9$!WW0"!<)rt!<3#u!;HNn
+!<)rt!<)rt!<<'#!s&?"rsSf+"98C-!1j.E!-nMCrrE&urrE#trrE*!#6=i(s8W&u!;QR#('*b:
+hVJh2!#GP5rrE&urrE#trrE*!$ipA-s8W&u!<<'$!<2ut#6"T)s8RrUp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hfTqq>^HprVults8N*#!<)p%p]([$rr<&urrW0"!<3#u
+!<)p%cV4ZF!#OSQs8N)ts8N)ts8N)ts8N)us8N)urtYA1"onT&!<<'"!!<<)!<<*%s8N'!rVult
+rVults8NK.!!<<)!<<*%s8N'!rVultrr;uup](6nrVultrVults8N*#!<)p*p]([$s!7Zus"j`!
+rr;uurr;uurVults8N*#!<3!"q>^NlrrE-#qu6Zt!<)p%p]([$rr<&ts8N)us8N)trs((TP3r;F
+!!*#urrE&urrE#trrE*!$ip>1!s/K'!!E9$!!)ut#1$!L!!!hnp&G$lrr;uurVultrVultrr;uu
+rr3`0!!WE&!!*'!!<<3(!W`9$"98B$!<)rt!<)rt!<<'-!<<3(!W`9$"98B$!<)rt!<3#u!;HNn
+!<)rt!<)rt!<<'"!<E)u$hs]/s8OAFg&El/bPqPA!<3#u!<)rt!<<'"!<E-!!r;lsq#:X.!;Hoj
+HpY.>>Q+U%!<3#u!<)rt!<<'"!<E-!#5S<"s8N*"rVm)s!"/c+K)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJj7V!;?El!r`0$q>^HprVults8N-V!7:`F%/Kr.s8NH,o)Jaf!!*#u
+rrDoq"5eV/#3,[_!<)rt!<)rt!<)rt!<3#u!"Rc`s8)d"s8N'!s8OhSeG9.E!<)rt!<)rt!<<'#
+1'#i"s8N)ts8N)us8N)ns8N)ts8N)ts8N*!rrOtVd/O%Qq>^a"s7H@#s&B*/rr;uurr;uurVult
+s8N<M!8[\Tqu?`nrrOhRdes+H1B>f$rs&<"#64]'!<)rt!<3#u!<)p&+TU9ss7lWprr;uurr;uu
+rVults8N-U!7^iErrDoq"5eV/#5/#r!<3#u!<)rt!<)rt!<3#u!"Rc`s8)d"s8N'!s8OhSeG9.E
+!<)rt!<)rt!<<'#1'#i"s8N)ts8N)us8N)ns8N)ts8N)ts8N*!rrOtVd/O%Qq>^a"s7H@#s&B*/
+rr;uurr;uurVults8N<M!8[\Tqu?`lrs?OB7K`2['TE)>rVultrr;uurVults8NKT!8IPRqZ$Wr
+s"aZ%rr33!!!`K'N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F!f;a4rr3'!Ll(s-s+pXRs+p^T!fi*5rr3E'LlVN8M2;02s8.V.rr<"S
+qYpZ^[>9k&s8N)ts8N)ts8N)ts8N)us8N'/p](9f!"/c+!!*'!$iotrs8N)ts8N)ts8N*!rrNT/
+p%eXf!<)rt!<3#u!;HNn!<)rt!<)rt!<<'#%06&"rsSH!%KHIk!#kkP!UfserrE&urrE#trrE*!
+#71D)s8Vfn!;c]s$ioqtrrNW0o`"jpoDf@#rr<&ts8N)us8N)trs&f0p](9a!!*#urrE&urrE#t
+rrE*!!Xo)%q>^HpqYpZD@/pc0s8N)us8N)ts8N)ts8N)us8N'/p](9f!"/c+!!*'!$iotrs8N)t
+s8N)ts8N*!rrNT/p%eXf!<)rt!<3#u!;HNn!<)rt!<)rt!<<'#%06&"rsSH!%KHIk!#kkP!Ufse
+rrE&urrE#trrE*!#71D)s8Vfn!;QR#?3%,3r;6_n!+,X(rrE&urrE#trrE*!$jm"/s8Vcm!<<'.
+!;-9j#4qm)s8RrUp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJj4K!<)p!o`,Ers8N)ts8N*!rrNB)qYpL'ci>p&rrN3"s8UpU!<3#u
+!;ld!rkC8i2<+Z9!<)rt!<)rt!<)rt!<3#u!"So+s4[N$s8N'!s8N9'qt^9l!<)rt!<)rt!<<'#
+"p"Prs8N)ts8N)us8N)ns8N)ts8N)ts8N*!rrNB)qYpL&ci>p&s.KF(rsAl'rr;uurr;uurVult
+s8N<-!;ulsg].?NrrNB)qY^?p"p"N!rs$gM2#mRU!<)rt!<3#u!<)p&"9AB"s2G$=rr;uurr;uu
+rVults8N-)!;lTlrrDrr"TH.m!&aHLrrE&urrE#trrE#trrE&urr<Q+s8UgR-ia2H!<<''!;lTl
+rrE#trrE#trrE*!!X8Z%q>^HprVultrr;uup](6nrVultrVults8N-)!;c]p$d\l1s8SbmAcE)>
+q#:<n!<3#u!<)rt!<<'("T\K#s4dSSq#:XI!2UG0nH2#V_YsN7!<3#u!<)rt!<<'-"T\H"s4RGQ
+s8N9'qYpL!ci>p&s+::EeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIdJj8H!2KPn!qZI"q>^HprVults8N/%!)`aq%,V%,s8PssV>pSZ!!*#u
+rrDlp"9&9$ro=%Y!<)rt!<)rt!<)rt!<3#u!"NiFs6BY"s8N'!s8TS/7JZu`!<)rt!<)rt!<<'#
+\,\tns8N)ts8N)urrNK,p\=dg!<)rt!<)rt!<<'#X8l,srrV'X+9)9CEWD@)&cMb0!<3#u!<)rt
+!<<'(P5oV&s6K^cqYpVt!)WUn!iuB!rr32[!$D7@!!)utrrE&u!XSl$rr338!9F1[h#IHSs8N)u
+s8N)ts8N*!rrT\17JZu`!;ZWsrVuuupAb-mrr;uurVultrVultrr;uu%W)1FlMq\"rr<'!s0r%t
+q>^HprVultrVults8N/1!(H_`rrE#trrE&u!XSl$q#C?orVultrVults8N/%!)`aq!oEu"rr3+A
+!0mNrrVultrr;uurVults8N=f!-/&=li7%\rs@uk$5*=<N!B>mrVultrr;uurVults8NLn!,V]8
+l2Uhas/Z2trr32[!$D7@N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F!g/<3rr3&kLlqN5s+pXRs+p^T!iq.2rr3D\Lo^RUObi]1s5f&mrr<"S
+q>UNpLl(-krrE#trrE#trrE#trrE&urr<PTs8U@E1&q7R!<<()!1<T^rrE#trrE#trrE*!!aPen
+q>^HprVultrr3$%!<)]mrrE#trrE#trrE*!!_WNtrr3&(!)3Cl"<[]j!%7aFrrE&urrE#trrE*!
+#;6)+s8UIH!;c]s8H>jirrPgnYl=Y,YQ.Asrr<&ts8N)urrN9&rVlg%"9A8ts/5ntrr;uurr;uu
+rVults8N.+!1<T^rrDlp!rDs!p&G$lrr;uurVultrVultrr;uu%aY1Tc2]U!rr<'!s'5Vlq>^Hp
+rVultrVults8N.+!1<T^rrE#trrE&u!WrH$q#C?orVultrVults8N-n!3lJ&!jDYurr3*D!7(Wm
+rVultrr;uurVults8N<W!7UuJd/X1Ars@$P*%(^c-5$=*rVultrr;uurVults8NK^!71]Fbl@bD
+s%<?rrr32,!)3FmM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJj7T!;6?k!hTHlq>^HprVults8N-B!9!kV$rI#,s8NE+p&G&)!!*#u
+rrDlp!poslirB#YrVultrVultrVultrr;uu%dX/pC]Kh%rr<'!s!7Zpq>^HprVultrVults8N-H
+!7^iErrE#trrE&u!<E2ps8N)ts8N)ts8N*!rrO8Bi;W`X;#m`trr`f3NW=Y/s8N)us8N)ts8N*!
+rs'5<m/R*(!!)lq!Zh?ur;Qg?!9!kV##PB&s8N'!rVultrr3!"!<)p&!W`3!s%37krr;uurr;uu
+rVults8N-H!7^iErrDlp!poslp&G$lrr;uurVultrVultrr;uu%dX/pC]Kh%rr<'!s!7Zpq>^Hp
+rVultrVults8N-H!7^iErrE#trrE&u!<E2ps8N)ts8N)ts8N*!rrO8Bi;W`X;#m`trr`f3NW=Y/
+s8N)us8N)ts8N*!rs'5<m/R*(!!)fo$"ErGNW9"j#6=)gs8N)us8N)ts8N*!rsTVBli7!"!!*'!
+*rt6urru=#XoJEQs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJjL/!YW<Gj&lCsq>^HprVults8N`,.KuUCf..'@s8U=D+m\;u!!*#u
+rrE#t"tQY?r4)eCirB#YrVultrVultrVultrr;uu(l6N/=TOQ_rr<'!s85arD;5!X]3G=8!!)ut
+rrE#trrE*!%/a!)D;5!X]3G=8!!)utrrE&u")%[hrV?Kn!<)rt!<)rt!<<')paQHBq:@,$_#F?:
+huF&`=8i1!!<3#u!<)rt!<<'(m0+$Jo5F[0qYq9).Kl(1l[f*2.KuUCf..'@s8N'!rVultrr3F@
+!/CIPs-!FIoA2k8!<3#u!<3#u!<)rt!<<'-r)*T5g\gQQ>Q=^'!<)p)/#_n6\H!EFrr<&ps8N)u
+s8N)ts8N)ts8N)us8N'9LsPWp!KR3[!!*'!r)*T5g\gQQ>Q=^'!<)rt!<)rt!<<'-r)*T5g\gQQ
+>Q=^'!<)rt!<3!#BE3ecq>^HprVultrVults8NB".KuUCf..'@rr3,Z!!rX,rVultrr;uurVult
+s8N>k"V9#PDu]n5rsAT.!&srXe,TO-rVultrr;uurVults8Nl&#7f)NC&e86s7e&IU\WLl#/L9=
+N;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#hOm'li-4>LtMP's+pXRs+p^T').EGj8J"tNq`SR`/(Vol`u>&rr<"S
+rVm)&i;3>rLnNc-rrE#trrE#trrE#trrE&urr<m4k2mfgec5XL!<<)n-j5RnrTL:Js8N'!rVult
+rVults8NN%-j5RnrTL:Js8N'!rVultrr3$>!5eO2rrE#trrE#trrE*!#ji$._Y_1X%IX5q"L.qD
+!4r./rrE&urrE#trrE*!#LWZ"kN>hF!;c^0mL0E0qV>QZm0jB>qn`^Mmf3:e!<)rt!<3!"*!!kT
+rs(XdJGR>Y!!*#urrE&urrE#trrE*!%/2.QNp$B)X$Qdc!!)ut$;.u(pQkk:s8N'!q>^Hprr;uu
+rVultrVultrr;uu(f9AW+Tg3orr<'!s7[oENp$B)X$Qdc!!)utrrE#trrE*!%/2.QNp$B)X$Qdc
+!!)utrrE&u!ZV3Wq#C?orVultrVults8NAl$k'rL_@$h@rr3,+!#P^IrVultrr;uurVults8N>P
+![[$m<<*$orsAH%!0I6\NrT7VrVultrr;uurVults8Nkb![6^f:B1Cps6U4&_Y_1X%IX8rM?!;'
+"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJjJc!FFmb]b(>'q>^HprVults8N_H"Y87$UBN4Ds8P%YNr-DQ!!*#u
+rrE#t#%l*UmpQ3IirB#YrVultrVultrVultrr;uu(i8ch%L;G%rr<'!s4e.qVssT?QmVk5!!)ut
+rrE#trrE*!%,;C(VssT?QmVk5!!)utrrE&u!Y#.cq#C?orVultrVults8NA>"Y87$UBN4Drr3*u
+!!rYcrVultrr;uurVults8N=]!F><EMuWkSrtN0O,L$&/3WHht/(jZm"YBHKrr<&ts8N)urrNW0
+h>[EZ)$$i9W/L]Vrr;uurr;uurVults8NM_&.YW-qqd\es8N'!rVm4:bkgd:!.k1M!!)iprrE&u
+rrE#trrE#trrE&urr<mPo$7dNmf3:e!<<)S&.YW-qqd\es8N'!rVultrVults8NM_&.YW-qqd\e
+s8N'!rVultrr3$/!8[GMrrE#trrE#trrE*!#epNnf_M9G/GT5E"Ao.*!9=%XrrE&urrE#trrE*!
+#DrOfo?iKs!;QR#huNi-s8P"X#Q4Q#rrE&urrE#trrE*!(6/Duo$3$k!<<)6"Y87$UBN4Ds8R]N
+p=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nId/O=%<YtoH2OF4=rrE#trrE&u#530_"V=;Hrr36&N>Md^irB)Ys8N)t
+rs%.g*!-dQh;\J7!<)rt!<)rt!<)rt!<3#u!!N+%#8W$ms8N)ursSh"5S*u39WJ-m!!)utrrE#t
+rrE&u$iZhb&-<S?WrN)!!<)rt!<3!$mnsf"!;c`q!<)rt!<)rt!<3!&p2qM^&5("Arri9C!!M]f
+s8N)us8N)ts8N)urs$t0">%dt!Vua*oPGKJ+Gg'tp2qM^&5("Bs8N)ts8N)urseEp'*/+5qJ6`J
+6/MYBrr;uurr;uurVultrr3B*Tg0.j'hkY-rr<&trsIFk*!-dQh>d?P$Mj`%!<3#u!<)rt!<)rt
+!<3#u!!N+%#8W$ms8N)ursSh"5S*u39WJ-m!!)utrrE#trrE&u$iZhb&-<S?WrN)!!<)rt!<3!$
+mnsf"!;c`q!<)rt!<)rt!<3!&p2qM^&5("Arri9C!!M]fs8N)us8N)ts8N)urs$t0">%dt!VcU!
+E<).$s764"r;Zcsrr;uurVultrr32S2$>GQ!!*#u#530_"V=;Hrr3"Xs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh5E#2Q5=Ll\Ljq#CAMrVunRrr32pZ]^0.Zh==t#QD8pN3W;:M#RGSM#I>X
+iNA9!Q+?eOs8N)ts8N)ts8N)ts8N)us8N'%n3-q!X8`/!!<3!+qh[-<"<Lmes8N'!rVultrVult
+rr3B'M)5VD*aZbarr<&ts8N)urrgq;$ipA)s8N)ts8N)ts8N)urs%Xk('>=Xl2CVbq?R',qu-Qp
+!<3#u!<)rt!<3!&V]l70n,NOcrsn*k&-FS`s8V7e('>=Xl2L__!<)rt!<3!-f00TD!<;[f#n'o2
+!!*#urrE&urrE#trrE&u$i>c;$j7VX_uK`:!<)p)^JY[G)eo'Hp&Gm(s8N)us8N)ts8N)ts8N)u
+s8N'%n3-q!X8`/!!<3!+qh[-<"<Lmes8N'!rVultrVultrr3B'M)5VD*aZbarr<&ts8N)urrgq;
+$ipA)s8N)ts8N)ts8N)urs%Xk('>=Xl2CVbq?R',qu-Qp!<3#u!<)rt!<3!&V]l70n,NOars'MD
+jo>AB!$(q:rrE&urrE#trrE&u#-/sN5O\XQrr32c>S[DW?0V@g!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCd/O<:2@BU(<nR3IrrE#trrE&u#/s1G"X8-`rr35r9aD;Squ?`rs8N)t
+rs#;c$j7r1r8RbV!<)rt!<)rt!<)rt!<3#u!!LFo"?"g1s8N)ursS79.1$5-DqtBm!!)utrrE#t
+rrE&u$gr'b#mVksh#IBS!<)rt!<3!$W\=YY!;c`q!<)rt!<)rt!<3!&`C^[F,'N\YrrhTi!$V=>
+s8N)us8N)ts8N)urs"#h#[d3(#l4K1_F"Y85g03-`C^[F,'N\Zs8N)ts8N)ursbt^#6=i)eN*jJ
+Gl.OArr;uurr;uurVultrr3AoF"%D#-u[o@rr<&trsGSg$j7r1r;YIN8,<2b!<3#u!<)rt!<)rt
+!<3#u!!LFo"?"g1s8N)ursS79.1$5-DqtBm!!)utrrE#trrE&u$gr'b#mVksh#IBS!<)rt!<3!$
+W\=YY!;c`q!<)rt!<)rt!<3!&`C^[F,'N\YrrhTi!$V=>s8N)us8N)ts8N)urs"#h#[d3(#l"?(%
+06#"s,d;$r;Zcsrr;uurVultrr31V('e+?!!*#u#/s1G"X8-`rr3"Ns7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMs8N/s!!f;!!nmaRj8],ZJcGcM!r;m%`r?'us7Y4NScJXf
+<Ib~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGcM!qQC%U]1Ch"lA;>rr@WMs8N/l!"R$K!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMs8N/F!'-hS!^dXlj8],ZJcGcM!mL^*`r?'ks7XtGOT>5X
+<Ib~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMs8N/[!#hX4!G,Zus8N(Ms8W*#iW'n:rrJ)Yp=oeB!;fbr
+J,~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGcM!k/.nU]1?5U>l4Q!.k1MrrTY050!U'M?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMs8N.#!2cOk!=[W?s8N(Ms8W*#<</o9rrI`Op=0;.!;]\q
+J,~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@]O"usj)fero(K)biNKDu-8bl$-P!h[L4!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKh>dKTKDu-_h#5/$"Q4n3rr@]O#%-0a`!uq.`r?'rs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@]O#(Z"8W<Wq(K)biNKDu.+lM@Ib%e@X>!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@]O"jKLE"YZL!s8N(OrrpY:$O&2U`W#sts7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKh>dKTKDu+U1^47N_L_ae!/(:TX#("e5JkD>!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@]O"cOc1&5qYAs8N(Orrn?.!t\Am`W#sjs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nI[K$7,U&Y,mScA]ih#IBSrr;uu\GuR/l2Ub`o`#'lKdI!(o`+pkrr3-!
+KdI!(o`+pk^]4<6o`#'lKdI!(b5VL$s7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDg9*s+mBKrrAVirrCjSrrE&urrBS/rrD<`rrD]k"SldO!s%unrrE&u"SldO
+!s%unrrBh6rrD]k"SldO!s$LD!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KC[K$7,U&Y,mScA]ih#IBSrr;uu\GuR/l2Ub`o`#'S<"o?5o`+pkrr3,]
+<"o?5o`+pk^]4<6o`#'S<"o?5b5VKos7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIdJjF/GV0403MHBNqZ-BjrrBq9rrD'YrrC@ErrCLIrrCjSrrE&urrD<`
+rrDNfrrDHdrrDusrrD<`rrD]k#GV9)p&G$l!;HNn!<3!#UB"TmqZ$Qqr;Zcs^]4<6o`#/k!+#9t
+rr<&Ps8N)nrrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F#3NF_MNFjtr;ZYMp](8L_Z0W9irB#YcN!nEdf9=Ih#IBSrr;uul2Ub`
+n,NCfmJm1dr;Zcsl2Ub`o`#.h!202grr<&ns8N)urrYmoT_eNbrrDusrrBh6rrD]k#>5&iqZ$Qq
+!87DP!;HKoM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJjEW<>YiV>iGV\qZ-BjrrBq9rrD'YrrC@ErrCLIrrCjSrrE&urrD<`
+rrDNfrrDHdrrDusrrD<`rrD]k#9El`rr;uu!;HNn!<3!#*WX.XqZ$Qqr;Zcs^]4<6o`#.;!6"m:
+rr<&Ps8N)nrrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIdJjFO+0Y@s>6/mFs8N)js8N)9s8N)Ys8N)Es8N)"s8N)[s8N)fs8N)d
+s8N)ss8N)`s8N)krrO2@mf*7d!:p-k*<>O's8N)ss8N)6s8N)krrO2@mf*7d!87DP!;HKoN;rV,
+"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh8F#Df8<rT]r1h#79QM"CZHLr02l!94%Y!7(WE!3?/"!9F1[!:Tsf!:Bgd
+!;uls!9sO`!;-9m#6=Z#s8N)irrNE*qt^9l!;uls!5JR6!;-9m#6=Z#s8N)Ps8N)nrrIuVp=]Y<
+!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCdJjFOAD-dl&d@:ns8N)js8N)9s8N)Ys8N)Es8N)"s8N)[s8N)fs8N)d
+s8N)ss8N)`s8N)krrN<'rr2rt!:p-k"9AGss8N)ss8N)6s8N)krrN<'rr2rt!87DP!;HKoK)bPp
+"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIdJj58r;Q]tp&GHus8N)js8N)9s8N)Ys8N)Es8N)"s8N)[s8N)fs8N)d
+s8N)ss8N)`s8N)ks8N)ts8N)is8N)os8N)ss8N)6s8N)ks8N)ts8N)Ps8N)nrrJ)Yp=oeB!;fbr
+J,~>
+s&FUMJH16$JH1B(rDh8F!5AF3!qqG4rVunRoDeiH_Z0W9irB#YcN!nEX8i2"jT#5[n,NCfmJm1d
+r;Zcsl2Ub`o`+pkrVulto)J^iq#C?or;Zcs^]4<6o`+pkrVultg&M'Pp\t8Ns7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj3BrVlr&!*&psrrDZjrrBq9rrD'YrrC@ErrB,"rrD-[rrDNfrrDHd
+rrDusrrD<`rrD]krrE#trrDWirrDiorrDusrrBh6rrD]krrE#trrCaPrrDfn!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIbl7bC!!<-!rrDZjrr<6$HkH`[o`"jpp3._c&kpIIs8N)ts8N)us8N'+
+p.GMfqgp4##rIt8s8N)ts8N',rHo@kBE.jM(CF(9rr;uu"SlC1(l81krrE&u#5jH7#n0&/rr;uu
+$iPGg%qkq>Eu,0]q>UBur/EB:$pV<%s8N'(rHo4a:%\JcqZ-Kmrr<H*Hkm6*s8-jR$<$^!rsSOE
+,6ecSb5_,7"nMZm#5\].ec,ULrr;uu"oWf]#u1'krs%"2"Y@q!!;ZX$ol2#U*f'dq!!*#urrE&u
+#5jH7#n0&/rr;uu#Q9#_#u1'ls8)d$s8.Br"pm,Pqu?Nns8N;sG9[;)9Zm53qZ-Zrrr<6$HkH`[
+o`"jpr/EB:$pV;us8N)urs8O^0F8.P\c;^&!;c`q!<<)r!;ulo!<<*!!!W=K&d_;)rr3B(NA(YI
+5Ipgg"U!T[rr`0+!n@,I#4mWf!uktLrr;uu$hd3qs8W"V0F8.P\bZ:*!<3!(r/EB:$pV<&s7HBl
+s8N',rHo@kBE.jM(CF(9rr3Q'G9[;)9ZmD8qgp4##rItJqZ-Km!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh)A!r[q3rVunRoDeiH"oPZbO1G8hrs&/'PDPL1pAY*lM#IARM#RGSL^NdH
+M#[@_QALX"g[5%@!<)rt!"8U/%iC*%oiVh;E;ok:rr<2l63JU;rr;uurr32sFX%)&:u2-Nrr<H&
+?4Rm.s7KM+&9.XJrs&4?,6e`Vh>[HS!!i=(#nLbKs8VrrqZ$Qq$i+*>(l/.a=V)-`rr2p*l!>2/
+(glV/kPttfrr32q!X&,q!!*#urr<5u>6tgSrVlg$W$;F3nc/[crs@dj'Eg"bs8N'!rr;uurr32s
+FX%)&:u2-Nrr<<">6tgSrVuop!!iPtBH70a6F-LgqZ-Zr#3fG2!uPD2qZ$Ems8W*!"o2@/%r)"A
+rs&4?,6e`Vh>.*N!<3!(pN7\b&Q%<`s7HBgs8N*!s8)fos8)frs8N'&q-+.9C&S&2$hncg"qa\f
+s6Kajp\t0ppB(Njqu6l`B+>(kKDtlMrr<Gj0`h=SpN7\b&Q%<Zs8N)urs8@A,6e`Vh>dNJ!<<*!
+!"8U/%iC*%oiVh;E;ok:&F!L<!uPD2s8Ve+*<Qa;ZN'e%qYpSQs7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCbl7b2!"Jo,rrDZjrr<5b63S6drr2p%a@m3N,^B(_s8N)ts8N)us8N'+
+],h"QgJemh'NNTKs8N)ts8N'+k=#\#YlE<?#oo6/s8N'%bU`rWg&D$O!<3!&hd%*&)/&O>s8N'+
+k=#\#YlE<?#oo6/rs%@d)$Cgio)A[h!!hXQ"W<=!s8VrrqZ$Qq$Kjha+gD!u5RAEqrVm8H9G.OT
+Gk_64!%7dFrs$mP%K$/*!<3#u!!VLO"W<=!rr31S(("CE!!)ip$,f=C#=$E3rr<&us8N)urs%@d
+)$Cgio)A[h!!hXQ"W<=!s8Vrr#QNOX'`o(Ldej(A!<<''a@m3N,^B([s8)frs8N'&k!B4hNW/qW
+#2`](";tkCq>^Hprr38]>o<b_BCc*&o`4jgrrE*!qZ-QoqZ-Zrrr<5b63S6drr2p*hd%*&)/&O?
+YQ5X>rr3)T!Y"u'rrpqH#RE2[rVult$bIG\s8Ut^)$Cgio(i=c!<3!(hd%*&)/&O?s7HBls8N'+
+k=#\#YlE<?#oo6/rt*7F&dBV+p](9J<##HK<RUpE!;c]rK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIbl7b-!"&W(rr<-?"!WZts8N'5Qb3'O!'(#Ypau`Epspku_uK`:!<)rt
+!<3#u!"+8"ir=Q0=6KM7Ep`o,!<)rt!"51'qNCnkBXdi%!'pP`rr>'9c1+d7P5kO^!<<)r8-G(I
+k=>`_s8N'!R()pU!+ooRqNCnEs8Vse"Hi?>8-H="rr<%c]D7?b3<&sX!;HNn!#h66qNCnkBXdi%
+!'pSapau`Epspku_uFcXA,cK4gAi,krr<&us8N'0Qb3'O!'(#Ym04*JnnnF-qYpot.Kl%.l@K!8
+!!*#urrE*!')P3&On@g-"LS4/!!&@tq2554rr;uurVm(Q!*A@]flHrhrrE#t#l$"UUA3:g#/g<;
+rrDusrr<Us]D7?b3<0$U8-G(Ik=>`_qZ$Qqs8NN)8-G(Ik=>`_s8N'!rVultp](6nrr;uuq#C?o
+r;Zcs'UQH-MZ>a:s8,=iOn@g-"LS2t!'C2[!oj7tqu6or(9.-!MZ>U5s8N'-JBQsPqa^jPo]JaJ
+[/0h&!<<'-qa^jPo]JaJ[/^.+!<)rt!;uls!$[f>qNCnkBXdi%!'pSapau`Epspku_uG8f=6KM7
+ErZ.>!;HKoN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh)A!oo*!rVunR"-AD3g%YOHL_R2]qQ>Xms8VkTNT0orNK<l7s+lL0s8RoS
+s8Rl^WUf'KTSUbcr8t3Ms8N)ts8N',>13+I!4b2>p/qBTrr;uu3D\_s*s1'orr<'!s7RH<Z2)of
+#jD<g!!$3Np/qC+44<h*!0.$Yp)OCCq:->gkl:Y_!+".I;#l1Hs8N)ns8N';>13+I!4b2>p/qBT
+s8VNt$c2_U$4cS*+99I]rs#8!49,<\!<3#u!"WAcoMGU>s8ULK,3J#e!!)lq$LS</[.rEas8N'!
+rr;uus8N`**=&kFeJSYVs8N'!?.JRE!.k.LrrE#t"u?7=nG14+qZ$QqrVm/l%L^,M^^:S@qZ$Qq
+r;Zcs&7*iY;#l1Is7RH<Z2)of#jD-brrE*!%/(\HZ2)of#jD<g!!)utrrDfnrrE&urrDiorrDus
+rr<a=eau]=JcGcD*=&kFeJSYVs$$LDrr3&3!''lU#Oj.]r8qDfFoMF@!";?W_#O*K#I4*T)$oI&
+s8N*!rs\TA#I4*T)$oI+rr<&ts8N)ss8N'C>13+I!4b2>p/qBTs8VNt$c2_U$4cS*1B<F(q8u\:
+rr<&nrrIuVp=]Y<!;fbrJ,~>
+s*'"oJH16$JH1B(s*+KCbl7`W!)`^prr<-/#sm)8s8N'5@cuqt!7(WE_?MOBpRh[Cq#C?o!<)rt
+!<3#u!"*<,IfC,_YP.Y!1@>,A!<)rt!"3)olluMc;<@-h!7UrIrr>&on]_LKn,NCf!<<)P$m*Rg
+\dKYSs8N'!?01Dt!8LH5lluMZs8Ua\*m4Ak$R#0Crr<%.kNF#gcMmkD!;HNn!#f/)lluMc;<@-h
+!7UuJ_?MOBpRh[Cq#:j)kl1Sd6NE_Xrr<&us8N'0@cuqt!7(WEM?-oOd#.l(qYpo:"sV7fb;oV&
+!!*#urrE*!'%m[7b58aX+SPj8!!$KkkTBlNrr;uurVm':!3c+h\2*p\rrE#t#f6crfCtpA0DPDD
+rrDusrr<U>kNF#gcN!pt$m*Rg\dKYSqZ$Qqs8NM\$m*Rg\dKYSs8N'!rVultp](6nrr;uuq#C?o
+r;Zcs'Op7h+99^es4If%b58aX+SPgR!7_#J!`B#fqu6o87b[dl/HE`gs8N'-Aak0KfaJqEqmm.X
+pA4gh!<<'-faJqEqmm.XpAb-m!<)rt!;uls!$Y_1lluMc;<@-h!7UuJ_?MOBpRh[Cq#;'/YP.Y!
+1B7@S!;HKoK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIc2RnD5lk]urrtF&qpRD'Gkh==!"*H?s7H@!s8T2$;?$S"h>e\urr<&t
+s8N)us8N'!C&\,6#lpshs8N)ts8N',B)ho)!!R!7s7QF"rr;uu%Vu+El2VV"rr<'!s1A>#rr3f#
+!#tt<!!$X2s7QErB)ho)!"/c+]DtD"rs\2n)uop<!,;K5o`,?us8N)ns8N'1B)ho)!!R!7s7QF"
+s8T2$;?$S"h>e\ui;a\nrs!QFErZ.>!<3#u!"WfDs7H@!s8S;`Du]k'!!)lq!ic5rqu?Zrrr;uu
+s8N/5!(Hne%-mm4s8N'!C&e5+!"/`*rrE#t!XSk+pAb-mrVlr$!)`aq!o<o"qZ$Qqr;Zcs$>KP?
+o`,@!s1A>#rr3&c!#te7rrE*!!k\M%rr32g!#tt<!!)utrrDfnrrE&urrDiorrDusrr<C?s8V`l
+$NL.=!(Hne%-mm4s7--po`+r^!,;0,!rW*'rr;uu!,;H4!k\M%rr3&c!#te7rrE*!!k\M%rr32g
+!#tt<!!)utrrDusrr<UBs8Vcm"_Rf7p&GI"s/c8urr32Z!$M:J!3,kqrrDfn!K@'Pg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDh,B"8e19ec#LPZgI_MO,2fjs8Rl^k5YJSLlq`;X,,L/rs%/4XT/<VM#IAR
+M#RGSL]HW;rrS%5kNW$H!<)rt!"6gHs6BXm`rH)(!#GS6rr<PSs8U=D1B7@S!<<(/!2'8j(XN.I
+s8N'!`rH))!"6gHs69S"s8QR/TDnj!ci??2rr<&@s8V<`'`S.4!;HNn!"d0Ms6BXm`rH)(!#GV7
+9E;<rrs#S*:B.X#2?*U[*rs[frr<&us8N'0aoDD*!#5J50*'E"s3L`GqYpUf!3?"srrE&urrE*!
+!b25&rr3DR!'pSa!!(.@s60Ltrr;uurVlp$!6b*9rrE#t!_`Turr3&%!)ECjrrDusrr<DJs8V<`
+'`\2C!2'8j!mgp4qZ$Qqs8N.1!2'8j#1*?8s8N'!rVultp](6nrr;uuq#C?or;Zcs$H`>Jkl;Ft
+s'l&$rr3DR!'pSB!"Su-s"sf"pAY3i!"Jr-rr<&Crr3%0!2'8j!mgp4qZ$Qqs8N.1!2'8j#1*?8
+s8N'!rVultr;Zcs&B=bMlMq=4s8V?a(B=D.!3lJ&#-@l#rrW8Equ?Zrp\t8Ns7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCc2Rn##Qro]rs!o8p7hipk4nuV!".ujs.]Qls8O/@i;W`\:B7Qtrr<&t
+s8N)us8N'!lMgeb!<D3Fs8N)ts8N',kl:[^!#"Mqs/5p$rr;uu%dO)oCB0b%rr<'!s!Ig"rr3dU
+!2BMn!!)6_s/>u2kl:[]!*]F&-NMj!rsWrKUAt5n!9sO`UB"3ks8N)ns8N'1kl:[^!#"Mqs/5p$
+s8O/@i;W`\:B7Qt;?3'_rrrr5li6tb!<3#u!"\>os.]Qls8Nf6m/R*'!!)lq!Zh?uqu?Zrrr;uu
+s8N-J!87AO%!)ECs8N'!l2UdY!)igrrrE#t!W`;^pAb-mrVlp@!9!kV!`&g!qZ$Qqr;Zcs$L.Tj
+UB"3ls!Ig"rr3%@!2B>irrE*!![e!$rr31D!2BMn!!)utrrDfnrrE&urrDiorrDusrr<Djs8Sho
+;ZHbE!87AO%!)ECs-<XFrr<!7!:':X!os>>rr;uu!:'R`![e!$rr3%@!2B>irrE*!![e!$rr31D
+!2BMn!!)utrrDusrr<Vos8T%u''TAqVuU$$ruV7!rr30u!3Z>&!9F%WrrDfn!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIcMn"GEWV'lrrVEb%f$)(!".T_s8E!"s8OnUd/O%Lq>^a"rr<&ts8N)u
+s8N'!fDbdRC]FJjP25L)rrE#trr<G`s8W&u!8dbUrW!$!s8N'/g].<N!!WE&!!*'!56/FsrtkV6
+"onT&!8dbUrVurTs8W&u!rr9b!5AI4%/g/0s8N'!hZ*WT!!<0"rrDfnrr<Ves8W&u!8dbUrW!$"
+s"j`&rr3Q+!!`K%+Tg*lp]:]ss8N'!rr;uu&)R?drW!$"s!@a$s8Vus!;c]s/ca>ss8N)us8N*!
+rrPCb^Ae-@r;[$$rr<&Us8W&u!ri6"!<)p$C]FJjP25s6rrE#t!]0o(rr3&r!!`<"rrDusrr<D_
+s8W&u!rr9b!5AI4!rW*&qZ$Qqs8N-b!5AI4#5nN*s8N'!rVultp](6nrr;uuq#C?or;Zcs$Jtg_
+rW!$"s$$Ltrr3E*!!WE&JH/jQr=oP1qYpVn3Y),h!!3*!rr<&Nrr3$a!5AI4!rW*&qZ$Qqs8N-b
+!5AI4#5nN*s8N'!rVultr;Zcs&DmHerVurTs8W&u!rr9W!7:`F$2OW+s(hZ90p:Als8N)nrrJ)Y
+p=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh/C"9,'Qh"^mNjbT5ts8Rl^qu?]qLl)03NemQ2rs&=UNrT-8M#IARM#RGS
+L]I>OrrngHLo\u!m/R(crVult$hs]$qu?`ks8Vus"TJH$!"Sc's7QF"s8N'!s8NT0nG`G(q>^p'
+rr<&ns8Vus!;HNnqu?m"rso,!rr3E'!"8i,!!)cns82j!rr;uup](6n&GQ5)qu?`ks8Vus"TSK2
+!;-9j&G,r3s8!!'p&FF\%fZM.!!*#urr<T(s8Vus"98B-!;HNnpAb3irrNQ.o_\[g!<3#u!<<'#%
+fl+urs\`($ig5,!;HNnqu?ius8N)trrjYJ!DK*Sq>^HprVlp.!;-9j!qZI%qZ$Qqr;Zcs$MXT#q
+u?j!rso,!rr3&r!"8Z'rrE*!!Y5;#rr33!!"8i,!!)utrrDfnrrE&urrDiorrDusrr<E#s8Vus"
+98B3!:^!f%/Kr3s8OVM[f?1-%/p)'"9"$-$2so)!WN-!!!)`lrrN]2nG`Fhq>^p"s8N*!rrN]2n
+G`Flq>^p'rr<&ts8N)ss8N'1p](9k!!)cns82j"s8NN.o`"jsoDf@#,QIj=T()aZrrDfn!K$jMg
+'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCcMn":(D#3orrR*=F85e8!"/Z(s7--us8N9'qYpL!cN#g%rr<&ts8N)u
+s8N'!qu6U!&-)`AXnh>`rrE#trr<H)s8VWi!;ulsnc07#s8N'/qu?]M!%@mI!!*'!#6=Purtjo"
+/-#VL!;ulsnc/[fs8VWi&HDb8!;QQn%-[aBs8N'!r;Zff!"Al,rrDfnrr<W.s8VWi!;ulsnc07$
+rrrK"rr3AP!&X`A":G&+\,e\js8N)us8N'0r;Zff!"Ao-"T\K#s4[MRqYpU$!;cTmrrE&urrE*!
+!XA`#rr3Dk!%\*L!!)rss7--urr;uurVm$4!!-W4q>('j!<)p!"p"N!rrULH2#@7P!;uls!"/Z(
+s7--us8N<(q#:9pkl<71s8N*!rrNE*q#:9tkl<76rr<&ts8N)ns8N)us8N)os8N)ss8N'+r;Zff
+!"Ao-#6=PursS&k/-#V_!94%E"#0TO"8?aZ#6"T&"9/?#!!)oqrrNE*q#:9pkl<71s8N*!rrNE*
+q#:9tkl<76rr<&ts8N)ss8N'1r;Zff!!)rss7-.$s8N9'qYpL$cN#g%&-)`AXnhtrrrDfn!J:@F
+eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIcMms!!e9tE!rW*#q#C?orVults8N-,!;ZTn"TSW(rr<&ts8N)us8N'!
+qu6U"q0=%^!!@T8s8N)ts8N)ts8N)ts8N)us8N'!qYpL/!!3-"!!*'!#lk&0!W`9$!WW0"!<)rt
+!<)rt!<<'-#lk&0!W`9$!WW0"!<)rt!<3#u!;HNn!<)rt!<)rt!<<'##lsf"rsA`-s8T\25l]43
+0E2"O!<3#u!<)rt!<<'#"9A>us8N)qrrN?(r;6No!<3#u!<<'-#lk&0!W`9$!WW0"!<)rt!<3#u
+!<)p%q0=%^!!@TEs8N)trrNK,q>L<o!!<#srrDusrrE#trrE*!#RLJ5!s/K'!!2rrrrE*!$jcn9
+!s/K'!!3-"!!)utrrDfnrrE&urrDiorrDusrrE#trrE*!&IAF>!s/K'!!3-"li7Lpkl<40rs,t4
+0A$.%!!*#urr<&rrr361!!<<)!<<*#qZ$Qqs8NK6!!<<)!<<*#s8N'!rVultr;ZcsrVultrVult
+s8N-,!;ZTn%0-J0q0=%^!!@TJrr<&nrrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh/C!j.=7p\t<nLl2!-s+pXRs+p^T!JuX1rrn48s8Rn2rVunRrr<"SrVm)s
+[?-3#Mq[RurrE#trrE#trrE#trrE&urr<o8s8W&u!WW0"!<<'#!!<<)!<<*#s8N'!rVultrVult
+s8NK/!!<<)!<<*#s8N'!rVultrr;uup](6nrVultrVults8N-&!<2ut$iU,.s8QC*Sc=EEGlIaC
+!<3#u!<)rt!<<'(!<E-!s8DuuqYpQs!;c`q!<3#u!<<'-!WW<)!W`9$!WW0"!<)rt!<3#u!<)p%
+mpQh/!!]Y's8N)trrN9&rr2p!rW!&ss8N)ss8N)ts8N*!rs/Z+!s8T*!!!&rs8N*!rsSr/!s8T*
+!!!'"rr<&ts8N)ns8N)us8N)os8N)ss8N)ts8N*!rt,;4!s8T*!!!'"s3Ufcs2tCVqYpe4!,1Hm
+rVurts8N'!rr2p'!WW<)!W`9$!W)ir!<<'-!WW<)!W`9$!WW0"!<)rt!;uls!<)rt!<)rt!<<'#
+!s&?"rso#."97gu&c_n9YQ+V&!;HKoM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCci4+B+Ud6&rrVKd&GZ;*!<)rt!<<'"!<E)u#5A0*s8N'!rr3'!!!*#u
+rrE#t#1$!L!!!hnmJm1drVultrVultrVultrr;uurr3`0!!WE&!!*'!!<<3(!W`9$"98B$!<)rt
+!<)rt!<<'-!<<3(!W`9$"98B$!<)rt!<3#u!;HNn!<)rt!<)rt!<<'"!<E)u$hs]/s8OAFg&El/
+bPqPA!<3#u!<)rt!<<'"!<E-!!r;lsqYpQs!;c`q!<3#u!<<'-!<<3(!W`9$"98B$!<)rt!<3#u
+!<)p%cV4ZF!#OSis8N)trrE-#rVlro!"/T&rrDusrrE#trrE*!#QXo-!s/K'!!E)trrE*!$ip>1
+!s/K'!!E9$!!)utrrDfnrrE&urrDiorrDusrrE#trrE*!&HMk6!s/K'!!E9$HN7UV@fXIDrs((T
+P3r;F!!*#urrE#t#QXo-!s/K'!!E)trrE*!$ip>1!s/K'!!E9$!!)utrrDusrrE#trrE#trrE*!
+!<E3!rsnf($NJFH#QOi@i;`fW!;HKoK)bPp"H`]\<E4P~>
+s!WEuJH16$JH1B(s![nIci4'0!I4><!rW*$q#C?orVults8N-V!7:`F%/Kr.s8NH,o)Jaf!!*#u
+rrDoq"5eV/#4;Hj!<)rt!<)rt!<)rt!<3#u!"Rc`s8)d"s8N'!s8OhSeG9.E!<)rt!<)rt!<<'#
+1'#i"s8N)ts8N)us8N)ns8N)ts8N)ts8N*!rrOtVd/O%Qq>^a"s7H@#s&B*/rr;uurr;uurVult
+s8N<M!8[\Tqu?`nrrOhRdej(E!<3#u!<<'#1'#i"s8N)ts8N)us8N)qrr_//!!`<"rrE#t!]'i'
+rr3&r!!`<"rrDusrrE#trrE*!!\sc*o`+pks8N-U!7^iErrE#trrDfnrrE&urrDiorrDusrrE#t
+rrE*!!\sc*q#:M0!.h9QV#()r+TU9ss7lWprr;uurVlpS!7^Z@rrE*!!\sc*q>^HprVultr;Zcs
+rVultrVults8N-V!7:`F!r;m$rVm,[J,ffRrr<&nrrJ)Yopu6cqc-XH~>
+s&FUMJH16$JH1B(rDh2D!jda:pAY3mLl2!-s+pXRs+p^T!fi*5rr3E'LlVN8M2;02s8.V.rr<"S
+qYpZ^[>9k1s8N)ts8N)ts8N)ts8N)us8N'/p](9f!"/c+!!*'!$iotrs8N)ts8N)ts8N*!rrNT/
+p%eXf!<)rt!<3#u!;HNn!<)rt!<)rt!<<'#%06&"rsSH!%KHIk!#kkP!UfserrE&urrE#trrE*!
+#71D)s8Vfn!;c]s$ioqss8N)us8N*!rrNT/p%eXf!<)rt!<3#u!;c]tcX?e_qZ$QqrVlp.!;-9j
+!qZI%qZ$Qqr;ZcsrVults8N-/!;6!arrE*!!Xo)%q>^HprVultp](6nrr;uuq#C?or;ZcsrVult
+s8N-/!;6-e"WdZp70)TKrs&f0p](9a!!*#urrE#t!Xo)%o`+pks8N-/!;60frrE#trrDusrrE#t
+rrE#trrE*!!Y#/%rr3&l!"Jo,#L?fY%KHG.!;HKoM?!7;!s&3u<Ib~>
+s*'"oJH16$JH1B(s*+KCd/O4G.gOi&rrVHc'DVV-!<)rt!<<'#"p"N!rs[6S2#mRW!<3#uh>dQT
+s8N)rrri>91]TE#s8N)ts8N)ts8N)ts8N)us8N'/qu?]N!%7gH!!*'!"p"Prs8N)ts8N)ts8N*!
+rrNB)qt^9l!<)rt!<3#u!;HNn!<)rt!<)rt!<<'#"p"N!rsR0R2#mTL!+l0;"8MlqrrE&urrE#t
+rrE*!#6b,*s8UjS!;c]s"p"Mss8N)us8N*!rrNB)qt^9l!<)rt!<3#u!;ld!rkC8i2>[@Q!<)p!
+"p"N!rrUOI2#@7P!;uls!<)rt!<<'#"p"Pms8N*!rrNB)qt^9l!<)rt!;HNn!<3#u!;QTo!;uls
+!<)rt!<<'#"p"Pqrrii3mMu<#qYpd'!;uls`W-#<s8N)trrNB)qt0pg!<<'#"p"Prs8N)ts8N)s
+s8N)ts8N)ts8N*!rrNB)qYpKrci>p%rs8V=1]TE5rr<&nrrI`OooT=VqGgOG~>
+s!WEuJH16$JH1B(s![nId/O0>!GV6,!p'Cpq#C?orVults8N/%!)`aq%,V%,s8PssV>pSZ!!*#u
+rrDlp"9&9$rpKgd!<)rt!<)rt!<)rt!<3#u!"NiFs6BY"s8N'!s8TS/7JZu`!<)rt!<)rt!<<'#
+\,\tns8N)ts8N)urrNK,p\=dg!<)rt!<)rt!<<'#X8l,srrV'X+9)9CEWD@)&cMb0!<3#u!<)rt
+!<<'(P5oV&s6K^cqYpVt!)WRmrrE&urrE*!!k85!q>^HprVultrr3$+!;H?i"9&9$rql]s#ls`!
+rrT8%;?$RshZ+bprrNK,p\k-l!<)rt!<<'#\,\tis8N*!rrT\17JZu`!<)p!#ls_ps8N)us8N)o
+rrNK,p\k-l!<)rt!<<'#\,\tmrrhE`(*j@brs',9jT#89!!*#urrE#t!k85!o`+pks8N/1!(H_`
+rrE#t!XSl$rVultrVultrVults8N/%!)`aq!oEu"r;R$$!!3*!#ls_prrA#L!!<$t<Ib~>
+s&FUMJH16$JH1B(rDh5E!kF-9p&>*PLn"2>s+pXRs+p^T!iq.2rr3D\Lo^RUObi]1s5f&mrr<"S
+q>UNpLl(O!rrE#trrE#trrE#trrE&urr<PTs8U@E1&q7R!<<()!1<T^rrE#trrE#trrE*!!aPen
+q>^HprVultrr3$%!<)]mrrE#trrE#trrE*!!_WNtrr3&(!)3Cl"<[]j!%7aFrrE&urrE#trrE*!
+#;6)+s8UIH!;c]s8H>jhs8N)us8N*!rrQI+R/-d^!<)rt!<3!"!s&;rrrW&t!rDou!s&<!rrPgn
+Yl=Y(YQ.AnrrN9&rVccr!<)rt!<<'#>l^8as8N*!rrQI+R/-d^!<)p!!s&;ps8N)us8N)orrN9&
+rVccr!<)rt!<<'#>l^8errg%91C5&srs&Z,q>^Jn!!*#urrE#t!aPeno`+pks8N.+!1<T^rrE#t
+!WrH$rVultrVultrVults8N-n!3lJ&!jDYur;R$!!!<3#!s&;prr@oI!!<$t<Ib~>
+s*'"oJH16$JH1B(s*+KCd/O/("4[#D!bMFbq#C?orVults8N-B!9!kV$rI#,s8NE+p&G&)!!*#u
+rrDlp!poslmJm1drVultrVultrVultrr;uu%dX/pC]Kh%rr<'!s!7Zpq>^HprVultrVults8N-H
+!7^iErrE#trrE&u!<E2ps8N)ts8N)ts8N*!rrO8Bi;W`X;#m`trr`f3NW=Y/s8N)us8N)ts8N*!
+rs'5<m/R*(!!)lq!Zh?uqu?Zrrr;uus8N-H!7^iErrE#trrE&u!<E2rrrVQf#5\?#!<E)u!ZqF#
+rr3$s!3Q+t!<E2us8N)ts8N*!rrOJHeF`e@!<<'#,llHjs8N)trrE-#p](6nrr;uuq#:?q!;uls
+!<)rt!<<'#,llHirrcg3LBMDgrs&T*rVumi!!*#urrE#t![Riro`+pks8N-H!7^iErrE#t!<E2u
+s8N)ts8N)ts8N*!rrO8Bi;W`X;#m`rrs%ij#64](!;HKnK(AsDqGgOG~>
+s!WEuJH16$JH1B(s![nIdJj9P!*/jp#;3+Hqo'rcSG<-a!<)rt!<<'3paQHBq:@,$_#OGZ!$U[k
+?N:**s8N)trrt!PmejTq(@D/%!<)rt!<)rt!<)rt!<3#u!#UO<nlZ!Rs8N'!s8W!p!c?]in@Mp)
+rr<&ts8N)ts8N*!rs\g'!c?]in@Mp)rr<&ts8N)urrZp7LAgrJrrE#trrE#trrE*!#l#kQU\WLl
+#/L6<"Q07d!*B.!rrE&urrE#trrE*!#OM[*dIV;W!;c^&paQE4p$72/rr<&us8N*!rs\g'!c?]i
+n@Mp)rr<&ts8N)ursWQ@LAh/P/#_n6\H!EArsi]BLAh/PpaQHBq:@,$_#"'5BE3ecrr;uurVult
+s8NB&;?C^ir:%=&qZ$Qqs8NN*;?C^ir:%=&s8N'!rVlt5!/CIJs8N)us8N)orrZp7LAh,OrrE#t
+rrE*!#lIR%D;5!X]3G76"&&[p7JZrgP5mi=hF%>Drr;uurVm0$;?C^ir:%=&qZ$Qqs8NN*;?C^i
+r:%=&s8N'!rVlt5!/CIOs8N)ts8N)ts8N*!rtbAZ"f(nF.gEfh/#_n6\H!EFs(DCerV?HnN:Xsh
+qc-XH~>
+s&FUMJH16$JH1B(rDh8F!l0W7q>U]$iqiQ*NJm3!s8RoRs8RoTrt>'dNT9utNK3c5s29_sqs1PD
+M#RGSM#I>XX5NjOcA8.\s8N)ts8N)ts8N)ts8N)us8N'9;!-m`!nI>N!!*'!pF$0)kPaVF63$rb
+!<)rt!<)rt!<<'-pF$0)kPaVF63$rb!<)rt!<3!"*!!kNs8N)ts8N)ts8N*!rs8!#$c;eX$OuP'
+rrfS,(]_/Gs8N)us8N)ts8N*!rs-sR-0OGk!!)lq$LS</[JJ]es8N'!rr;uus8NN%-j5RnrTL:J
+s8N'!rVultrr3$>!5ea8#"lQ$pQkk:qYpU:!5ea8#ji$._Y_1X%IX)m!ZV3WrVultrVults8NB!
+-j5RnrTL:JqZ$Qqs8NN%-j5RnrTL:Js8N'!rVlp=!5eO2rrE&urrDio!ZV3WrVultrVults8NB!
+-j5RnrTL:Jrr3-#'*&$/q>U[^!.ape8H8bis8N)trs8?I"HM[Dkc7#Gs8N*!rs\WM"HM[Dkc7#L
+rr<&trrO/?_YsN7!<)rt!<)rt!<<'6m0jB>qn`^Mmf,nlp%OdQ2#mRq!5eO2!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJj85!6+d6#AVQ[n<!kin+cq_!<)rt!<<'3^BH.?q4e*Eq#C@R!06rf
+PlLg`s8N)trs!)ZqX7hmJaNL;!<)rt!<)rt!<)rt!<3#u!#TPCcOL3Js8N'!s8Ujc%]AgnhO#Yi
+rr<&ts8N)ts8N*!rs[Zo%]AgnhO#Yirr<&ts8N)urrNW0h>%$M!<)rt!<)rt!<<')^BH.?q4e*E
+q#:9r;#gn&j8K#X!<3#u!<)rt!<<'(M?.#Sd>S&*qYpo:"s_@hbW5_'!!*#urrE*!%,;C(VssT?
+QmVk5!!)utrrE&u!Y#.crr317bkgd:!.k"H!Y#.crr38="Y87$UBN4DqYpU+!8[VRrrE#trrE*!
+#i#t$VssT?QmV\0rrE*!%,;C(VssT?QmVk5!!)ut!Y#.cq#C?orr;uuq#:C)!8[VRrrE#trrE*!
+#i#t$VssT?QmVh4"SrE)!8I>L#8mNEqP]>Q!<3#u!<)p'g^jsnnGD(0-MmcB!<<'-g^jsnnGD(0
+-NF)G!<)p!%055_s8N)ts8N)ts8N*!rtW9P/(jZm"YBHKB$C,?@/tlYrs\taq#:>Go=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs"B$/Y^^fOPp&&P'A*s8N)ts8N)urs&1>+U&ELa8Z)Drf%`t52uVC
+rr;uurVm)TAfLjc<8HsArrE#trrE#trrE#trrE&urr<2t>6bptrr;uurr3B*Tg0.j'hkY-rr<&t
+s8N)ts8N)ursSh"5S*u39WJ-m!!)utrrE&u"Rf5%!<DurrrE#trrE#trrE&u#530_"V=;HrVm$!
++92Q3rVultrr;uurVultrr32P1^#AS!!2oq$1r'Q![*=!rr<&us8N)ursSh"5S*u39WJ-m!!)ut
+rrE&u%.@(-!<E/QAfLjc<8IEN%I[1.!<E0"p2qM^&5("=rs8'k'*/+5rr<&ts8N)urs/Os5S*u3
+9WIshrrE&u$iZhb&-<S?WrN)!!<)p#mnsf"!;c`q!<3#u!;QR"mnsf"!<<'!!<)rt!<3!'rh2Rg
+!YnD/rVluO!!:pNrs/C:&I(PY!!*#urrDus#QCD^&-<S?Wqubq!<3!+rh2Rg!YnD/s8N'!rVm/l
+;A0'2s8N'!rVultrVultrr3c-FWgo"9#pu3fk)3*'3*ffs6ii!!<Dur!0$Nf!rGttJ,~>
+s&FUMJH16$JH1B(rDh8Fq1o@Ss8V#ZOGT1,mJ$Y\M#IARM#RDYoWs^;P-ai\rs/P6O,U@ALku'1
+s+pXR#2u_HM3YXKmJm1drVultrVultrVultrr;uu"RnSW,HLhDrrE&u$i>c;$j7VX_uK`:!<)rt
+!<)rt!<3!+qh[-<"<Lmes8N'!rVultrr3,Q4q%GlqZ$QqrVultrVultrr32c>S[DW?0V=f"SrB(
+#lFT#rrE&urrE#trrE&u#,`XJ61=jUq>Uc^<tGHeVuQbs!<3#u!<3!+qh[-<"<Lmes8N'!rVult
+rr3DY4q%Gls1_GE!ZPkJqYq#V4q%Gls8V7e('>=Xl1t>bf00TD!<<'!!<)rt!<3!'qh[-<"<Lme
+qZ$Qqrr3B'M)5VD*aZbarr<&trrgq;$ipA)s8N)us8N)ors74?$ipA.rr<&ts8N)urs/FX1^jL.
+?GlaA".0&kp\FgooM>i%=nhssrr;uur;R$!M)5VD*aZb\s8N)ursS^\1^jL.?GlgC!!)ut#hM6K
+!<E0"!!)utrrE#trrE&u(?\p<!u>2,s8Ti3&cs"dp](9F4q%GlqYpPPo>1S+<E4P~>
+s*'"oJH16$JH1B(s*+KCdJs"B$2ji'UH]+h,&QiDs8N)ts8N)urs$G7&-X8$pAY'soh>]'GPhF@
+rr;uurVm(u5n!lDKDb-:rrE#trrE#trrE#trrE&urr<2E.KhW\rr;uurr3AoF"%D#-u[o@rr<&t
+s8N)ts8N)ursS79.1$5-DqtBm!!)utrrE&u"KF-\!<DurrrE#trrE#trrE&u#/s1G"X8-`rVm#c
+"99VDrVultrr;uurVultrr31R'aS1=!!rE#$,T%:#=-K4rr<&us8N)ursS79.1$5-DqtBm!!)ut
+rrE&u%&tud!<E.r5n!lDKDbTG%B;)e!<E0"`C^[F,'N\Urs5VY#6=i)rr<&ts8N)urs.t5.1$5-
+Dqt3hrrE&u$gr'b#mVksh#IBS!<)p#W\=YY!;c`q!<3#u!;QR"W\=YY!<<'!!<)rt!<3!'mW0f`
+#:ONGrVls\!"f)(rs.(8"Vc4Z!!*#urrDus#OZX^#mVksh"q'N!<3!+mW0f`#:ONGs8N'!rVm/'
+0F%UYs8N'!rVultrVultrr3bQ8e;.MG4tt9V*PLm-\M?ss/IaX!<Dur!.sgU!r>nsJ,~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMs8N/s!!e)T\GlW`!#ggr!0$Nf!rGttJ,~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGcM!qQC%JcE7[!hTHWN;im7o>1S+<E4P~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMs8N/F!',W1\GlUm!2GMQ!.sgU!r>nsJ,~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@WMs8N/[!#gFg\GlWL!.Kn,!0$Nf!rGttJ,~>
+s&FUMJH16$JH1B(rDeFKh>dKTJcGcM!k/.nJcE7[!b;;]N;im7o>1S+<E4P~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@WMs8N.#!2b>I\GlUY!:>aF!.sgU!r>nsJ,~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@]O"usj)fero(JcE:\!q]2.MuNd9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKh>dKTKDu-_h#5/$"Q4k2\c2`q'2+8`!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@]O#(Z"8W<Wq(JcE:\!nI[AMuNd/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcFR+rr@]O"jKLE"YZL!s1/.3!!>(;MuNd9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKh>dKTKDu+U1^47N_L_`trrW6*9_aPG!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcFR+rr@]O"cOc1&5qYAs1/.3!"<]AMuNd/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs.Fmf34cJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8Fr;c9cr;_EKJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs.Fmf34cJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4Hqu?Zrrr;uurr;uur;ZcsJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrDrrrrE&urrE&urrDusrr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4Hqu?Zrrr;uurr;uur;ZcsJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4Hqu?Zrrr;uurr;uur;ZcsJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrDrrrrE&urrE&urrDusrr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4Hqu?Zrrr;uurr;uur;ZcsJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs4HlMpkaJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8FrrD?arr@WMJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs4HlMpkaJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJs.Fmf34cJcC<$JcC<$i;We9o>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8Fr;c9cr;_EKJcC<$JcF[.!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJs.Fmf34cJcC<$JcC<$i;We/o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo>C_-<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nI`W,onJcC<$JcC<$eGfN-o>C_-<E4P~>
+s&FUMJH16$JH1B(rDgi:r\K-*JcC<$JcF7"!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KC`W,onJcC<$JcC<$eGfN#o=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIcMn0pIo/?e7;/Cpr\K-*JcC<$JcF7"!0$Nf!rGttJ,~>
+s&FUMJH16$JH1B(rDh2D$3%S[8NAb'Ej>ZD1P,RWs+13$s4%&KM=\Rcqc-XH~>
+s*'"oJH16$JH1B(s*+KCci4=JWGG$_3`1=As8Fg*s+13$s+14"rr@ZB]`S%1<Ib~>
+s!WEuJH16$JH1B(s![nId/O.BHhfGts8Fg*s+13$s+14"rrA#L_ufg9<Ib~>
+s&FUMJH16$JH1B(rDh5E!Uj@j1B@IS1P,RWs+13$s4%&KM=\Rcqc-XH~>
+s*'"oJH16$JH1B(s*+KCd/O-o7enh?s8Fg*s+13$s+14"rr@ZB]`S%1<Ib~>
+s!WEuJH16$JH1B(s![nIdJjUQCbmk@^@M6f]la;R1P,RWs+13$s4%&KN:Xshqc-XH~>
+s&FUMJH16$JH1B(rDh8F$i3:J1MG&,q;SVes8Fg*s+13$s+14"rr@oI_?0U7<Ib~>
+s*'"oJH16$JH1B(s*+KCdJjU=4#8[Fg%kBrU.t[e1P,RWs+13$s4%&KK(HYWqGgOG~>
+s!WEuJH16$JH1B(s![nIdJj@$1G_JrqZ$ONrr36%WF%eI9S;R.s8FeXrhi7IC[V3%#Q:o<5;brW
+h1>TWs+13$s7ZHmN:Xshqc-XH~>
+s&FUMJH16$JH1B(rDh8F"IV&%?N0g$r\OQR#Ps`d3]U3*q>UEn1Bm`75sBhrrr36$Sm+<::Q+gq
+s+13$s+14Drr@oI_?0U7<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj;R1Gb9ks8FhRrs.eA9fP:BW;Z_qr\F`OFZN![rVlg%mu1+(3`qsL
+JcC<$JcC<$pAY,Eo=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJj;q1GbTts8FhSrrN%7q_J=;hZ*WT1B=ZX1B^\Ws8@!81BBMYJcC<$
+JcC<$p\t5Po>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8F"%>"%jn\rU1]RIUpItH?"&&Cgs8FeSH2TN%L&_2K;>W-M5k'@)JcC<$
+JcGKE!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJj;11GeXus8FhSrrLt>q_J=kr;Zfr1B:;N1Bbi"s5H9?1BC_UJcC<$
+JcC<$p\t5Fo=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJj;41GeLqs8FhSrsQh&1JR!,Shi0"s8W'S&P_ZK1G_&ks2ZuPJF*6^
+1G_OPs+13$s+14ErrA#L_ufg9<Ib~>
+s&FUMJH16$JH1B(rDh8F"#_qkqt^9k1]RI_I5<[$na^fY1O]<'r\G./p:iC>56(Y41Gc!%q7SR?
+@tFZ2s+13$s7cNnM=\Rcqc-XH~>
+s*'"oJH16$JH1B(s*+KCdJj;+1Gf"*s8FhSrsM[[1S+:&9f"TFs8W'S&Yf,Y1G`G=s%tR._>3bp
+1Gc7ds+13$s+14Err@ZB]`S%1<Ib~>
+s!WEuJH16$JH1B(s![nIdJj;41GeLqs8FhSrsN6k1W]Urq(jfes8W'S#f?W?1G^lfs'GLW!&fE.
+JcC<$JcGKE!0$Nf!rGttJ,~>
+s&FUMJH16$JH1B(rDh8F"#_qkqt^9k1]RI_4u5"cs8VXG1Htj=r\FiMs84Z/2?3\>q(i"2JcC<$
+JcC<$p\t5Mo>1S+<E4P~>
+s*'"oJH16$JH1B(s*+KCdJj;+1Gf"*s8FhSrsLhC1\q(Na>5V\s8W'S#l4Mj1G^uis#Bg1!)8%E
+JcC<$JcGKE!.sgU!r>nsJ,~>
+s!WEuJH16$JH1B(s![nIdJj;q1GbTts8FhSrrYA>1]%+Ns"a^6s8W'S!rW)ur\OTS!&s[/JcC<$
+JcC<$p\t5Po>C_-<E4P~>
+s&FUMJH16$JH1B(rDh8F"%>"%jn\rU1]RI_2)@&fs8W'S1H#44r\FWTs8W'Ss8N'VpbRL$JcC<$
+JcGKE!/^<a!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCdJj;11GeXus8FhSrrP&61]ICXq(jfis8W'Ss8N)tr\OTS!&XI,JcC<$
+JcC<$p\t5Fo=Y5%<E4P~>
+s!WEuJH16$JH1B(s![nIdJj@$1G_JrqZ$ONs8NI81Gd,Ps7nH,3WK-Y1]IFR1]RIW?8FCZJcC<$
+JcC<$nc&TJo`#!nqc-XH~>
+s&FUMJH16$JH1B(rDh8F"ICo#?iKp%r\OTS$U-@&o)Ja\1G_5ps8FhRs8FhSrrYD?1\-+sJcC<$
+JcG9?!/^@J!s&3u<Ib~>
+s*'"oJH16$JH1B(s*+KCdJj;Q1Gb9ks8FhSrsLhC1\q(Na>5V\s8W'Srr;sRs8N0\1GeiXs+13$
+s+14?rr@ZCrrW8t<E4P~>
+s!WEuJH16$JH1B(s![nIdJjUQBeqP=^[qEk_0,eW1]RI_`\TDFk4tW*1Jn,Or\OQRr\OTS$-=tZ
+7EbN&iN[6Ns+13$s+14ErrJ)Yp=oeB!;fbrJ,~>
+s&FUMJH16$JH1B(rDh8F$i*1H1MP//qrP+ms8FhSrsO621N`3ZFYbh$s8W'Srr;sRs8NCW1G`Fm
+rV"p@>_2p+s+13$s7cNoM?!;'"I]>f<E4P~>
+s*'"oJH16$JH1B(s*+KCdJjU<4#8[Gg%tO#V,.-j1]RI_;):#!q<(I.1WBCor\OQRr\OTS#uWQ8
+K]W1(d@![Zs+13$s+14ErrI`Op=0;.!;]\qJ,~>
+s!WEuJH16$JH1B(s![nId/O.AGPO#ps8FhSrrN%5q_J=;h#IER1]IFR1]RIUrHe8qJcC<$JcC<$
+p\t8Qs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDh5E!UX.f1B@IS1]RIUpIY6<"%i7es8FhRs8FhSrrMptq(mU%JcC<$JcGKE
+!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCd/O-l7JS_>s8FhSrrLq=q_J=hr;Zfr1]IFR1]RIUk!Jl"JcC<$JcC<$
+p\t8Gs7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIcMn0nI8E$`6ti:or\OQR#Q:N*4>of_jo5;Z1]IFR1]IC[rk*,;2EOok
+`e"/@s+13$s7cNoN;rV,"J,Vj<E4P~>
+s&FUMJH16$JH1B(rDh2D$2qDV8NA_%Ej5TC1]ICZq3=r?3E24<rr;sRrr;sRrr39&WFS7O4^='!
+JcC<$JcC<$p\t8Ns7Y.LRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCci4=IW+naZ3Dk4?s8FhRrs.\<9/\n<V>^Dnr\OQRr\OQR#kjWi4Z,Q:
+S*,A&JcC<$JcGKE!J:@FeHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^uGs4lC6qu?t+gt\J$qc-XH~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8"H!04g04CS#?oj8RK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^u=s4,Y%qu?t(e^]c^qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2_#Hs4lD_6iI&k6eU8MScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8"c<95g=J^k!!ksDg=htqqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2_#>s4,ZJ62gii6.4<6OT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs8LdVdk:\Se,J,*ScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jUg'#eV!&)b!g'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s8LOObq8uKc2Q5rOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs8C^Sb!*uHg]X2Kqc-XH~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jTg&f>ZaSjfqRK34b<Ib~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s8CIL_`Yj8eHD!7qGgOG~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Y4NScJXf<Ib~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jMg'!iEqc-XH~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7XtGOT>5X<Ib~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^lDs7Mrc!;fbrJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!K$jLRKEQe<E4P~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^l:s7MKV!;]\qJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2^iCo)Jjh<E4P~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8!/^:I!rGttJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2^i9o)Jjg<E4P~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$Q2gCOs&FR~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcD#8nb`>dJ,~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$Q2gCNs&FR~>
+s!WEuJH16$JH1B(s![nIJW,/=JW,/=QAbh@n_F.EJ,~>
+s&FUMJH16$JH1B(rDeE*JVer7JVf\L!;l<?s&FR~>
+s*'"oJH16$JH1B(s*+KCJV&H)JV&H)Q@],5n^[Y>J,~>
+s!WEuJH16$JH1B(s![nI!0$RM!!%TMJcFF'!!%SgJ]-?^o`"plqsiJA<Ib~>
+s&FUMJH16$JH1B(rD`iSo`"mkJcC<$g&D$PJ\luTgqr^`!<E#egAb0'~>
+s*'"oJH16$JH1B(s*+KC!.skC!!%TMJcFF'!!%S`J\BjPo`"plqXN,9<Ib~>
+s!WEuJH16$JH1B(s![nI!K@'Pg]F&Is+/sVgtUTbScF>[J]-?^!<;cJ!hKDhn_F.EJ,~>
+s&FUMJH16$JH1B(rD`lTs7Y.JRK3A=g4@u4g&[WBJ\luTgqj'kp=]S:!;l<?s&FR~>
+s*'"oJH16$JH1B(s*+KC!J:@FeH1j5s+/^Oe_AUTOT9sGJ\BjP!<;cC!g*KZn^[Y>J,~>
+s!WEuJH16$JH1B(s![nI!K@'Pg]F&Is+/sVgtUTbScF>[J]-?^!<;cJ!hKDhn_F.EJ,~>
+s&FUMJH16$JH1B(rD`lTs7Y.JRK3A=g4@u4g&[WBJ\luTgqj'kp=]S:!;l<?s&FR~>
+s*'"oJH16$JH1B(s*+KC!J:@FeH1j5s+/^Oe_AUTOT9sGJ\BjP!<;cC!g*KZn^[Y>J,~>
+s!WEuJH16$JH1B(s![nI!K@'Vg]?0(rS.IG!<7W*J_]#8!M0:B`.>k^_uTi9g]:g:r7h@F!;l<A
+s&FR~>
+s&FUMJH16$JH1B(rD`lTs8:ROfqJAu!h',hJ_G\/gY)[s!.i"<_VE!.s8CXP?eG;1!h',dn_4"C
+J,~>
+s*'"oJH16$JH1B(s*+KC!J:@LeH+0lrRCt3!<7W#J^rN*!KdA5]n*lP]`A*2eH&t)r7(k2!;c69
+s&FR~>
+s!WEuJH16$JH1B(s![nI!K@'Wg]Q2pFn#Cc!hKDlJ_Yh3gY;h$!.i(>`8&92s8C^S!(YQ;g]F&I
+qsiJA<Ib~>
+s&FUMJH16$JH1B(rD`lTs8CXRes1CHrn7FB!<7W(J_Jl4!La">_L]SZ_>sW7g&_7Ddf%l$RK36T
+gAb0'~>
+s*'"oJH16$JH1B(s*+KC!J:@MeH=3_Fm]1Y!g*K_J^o>%gXQ=e!.hh7^"g:$s8CIL!(>*1eH1j5
+qXN,9<Ib~>
+s!WEuJH16$JH1B(s![nI!K@'Xg]Z,bF`m``g]F&Is+/sVgtUTbScF>[J]-?^!<<#Qrr<'RbPp8u
+ScJZXh#CB)~>
+s&FUMJH16$JH1B(rD`lTs8L^TdYi6js8L^RRK3A=g4@u4g&[WBJ\luTgqj'krS%8O!AMXpg&d]C
+qsiD?<Ib~>
+s*'"oJH16$JH1B(s*+KC!J:@NeHF-SF`m``eH1j5s+/^Oe_AUTOT9sGJ\BjP!<<#Jrr<'Q`;\9g
+OT>7Jec/X"~>
+s!WEuJH16$JH1B(s![nI!K@'Xg]3N:FTDI@g]F&Is+/sVgtUTbScF>[J]-?^!<<#QrVup^rnIRH
+!;l<As&FR~>
+s&FUMJH16$JH1B(rD`lTs8L^PP5]S(s8L^RRK3A=g4@u4g&[WBJ\luTgqj'krS%5N!'^D9!h',d
+n_4"CJ,~>
+s*'"oJH16$JH1B(s*+KC!J:@NeGt^1FTDI@eH1j5s+/^Oe_AUTOT9sGJ\BjP!<<#JrVup\rm_(4
+!;c69s&FR~>
+s!WEuJH16$JH1B(s![nI!K@'Xg]Z,hF`m``g]F&Is+/sVgtUTbScF>[J]-?^!<<#Qrr<'RbPp8u
+ScJZXh#CB)~>
+s&FUMJH16$JH1B(rD`lTs8L^TdZJZps8L^RRK3A=g4@u4g&[WBJ\luTgqj'krS%8O!AMXpg&d]C
+qsiD?<Ib~>
+s*'"oJH16$JH1B(s*+KC!J:@NeHF-YF`m``eH1j5s+/^Oe_AUTOT9sGJ\BjP!<<#Jrr<'Q`;\9g
+OT>7Jec/X"~>
+s!WEuJH16$JH1B(s![nI!K@'Wg]Q<&FoVHr!hKDlJ_Yh3gY;h$!.i(>`8&92s8C^S!(YQ;g]F&I
+qsiJA<Ib~>
+s&FUMJH16$JH1B(rD`lTs8CXRfq*?drn7FB!<7W(J_Jl4!La">_L]SZ_>sW7g&_7Ddf%l$RK36T
+gAb0'~>
+s*'"oJH16$JH1B(s*+KC!J:@MeH=<mFoVHk!g*K_J^o>%gXQ=e!.hh7^"g:$s8CIL!(>*1eH1j5
+qXN,9<Ib~>
+s!WEuJH16$JH1B(s![nI!K@'Ug]=MVrnIRH!<7W*J_]#8!M0:B`.>k^_uTi9g]:g:r7h@F!;l<A
+s&FR~>
+s&FUMJH16$JH1B(rD`lTs81LNXT/:R!h',hJ_G\/gY)[s!.i"<_VE!.s8CXP?eG;1!h',dn_4"C
+J,~>
+s*'"oJH16$JH1B(s*+KC!J:@KeH)`Nrm_(4!<7W#J^rN*!KdA5]n*lP]`A*2eH&t)r7(k2!;c69
+s&FR~>
+s!WEuJH16$JH1B(s![nI!K@'Tg]6jCg]F&Is+/sVgtUTbScF>[J]-?^!<;cJ!hKDhn_F.EJ,~>
+s&FUMJH16$JH1B(rD`lTs8(FLn,D#BRK3A=g4@u4g&[WBJ\luTgqj'kp=]S:!;l<?s&FR~>
+s*'"oJH16$JH1B(s*+KC!J:@JeH#"9eH1j5s+/^Oe_AUTOT9sGJ\BjP!<;cC!g*KZn^[Y>J,~>
+s!WEuJH16$JH1B(s![nI!K@'Pg]F&Is+/sVgtUTbScF>[J]-?^!<;cJ!hKDhn_F.EJ,~>
+s&FUMJH16$JH1B(rD`lTs7Y.JRK3A=g4@u4g&[WBJ\luTgqj'kp=]S:!;l<?s&FR~>
+s*'"oJH16$JH1B(s*+KC!J:@FeH1j5s+/^Oe_AUTOT9sGJ\BjP!<;cC!g*KZn^[Y>J,~>
+s!WEuJH16$JH1B(s![nI!K@'OScJikJY%Fag7A9EJ]*,Xgr'3mopu0aqsiJA<Ib~>
+s&FUMJH16$JH1B(rD`lTs7Mf]!<7V=JXY;]!!%SeJ\p3Z!<;_\!<E#egAb0'~>
+s*'"oJH16$JH1B(s*+KC!J:@EOT>I^JWYMGg5u@8J\?WJgq<^fooT7TqXN,9<Ib~>
+s!WEuJH16$JH1B(s![nI!/uI/JH3gmJ]*,Xgr/da!;l<As&FR~>
+s&FUMJH16$JH1B(rD`iSJH16$aoI"0J\p3Zo)Jdfn_4"CJ,~>
+s*'"oJH16$JH1B(s*+KC!.ob%JH3gmJ\?WJgqE:Z!;c69s&FR~>
+s!WEuJH16$JH1B(s![nIJbt#qJbt#qQ2C+,s&FR~>
+s&FUMJH16$JH1B(rDeFGJbt#qJbt`0n_4"CJ,~>
+s*'"oJH16$JH1B(s*+KCJbjroJbjroQ2:%$s&FR~>
+s!WEuJH16$JH1B(s![nIJH16$JH16$K`M-QJ,~>
+s&FUMJH16$JH1B(rDeCKJH16$JH1B(s&FR~>
+s*'"oJH16$JH1B(s*+KCJH16$JH16$K`M-QJ,~>
+s!WEuJH16$JH1B(s![nIJH16$JH16$K`M-QJ,~>
+s&FUMJH16$JH1B(rDeCKJH16$JH1B(s&FR~>
+s*'"oJH16$JH1B(s*+KCJH16$JH16$K`M-QJ,~>
+s!WEuJH16$JH1B(s![nIJH16$JH16$K`M-QJ,~>
+s&FUMJH16$JH1B(rDeCKJH16$JH1B(s&FR~>
+s*'"oJH16$JH1B(s*+KCJH16$JH16$K`M-QJ,~>
+s!WEuJH16$JH1B(s![nIJH16$JH16$_Z9`:m/[1dqZ-TpnGrUhpAk4nJ,~>
+s&FUMJH16$JH1B(rDeCKJH16$JH1B(s&FR~>
+s*'"oJH16$JH1B(s*+KCJH16$JH16$K`M-QJ,~>
+s!WEuJH16$JH1B(s![nIrrE*![fHI.`rQ)<r;cltf)YjNjT,>\lN$tbirK)Y!9s1W!/pjVJH4a2
+rr2u_jo>C>rr;BdrVufrrVuKiq>]XYs8N3"m'fL`!<<)d!<<)p!<<)h!<<)n!<6&L~>
+s&FUMJH16$JH1B(rDijts8TP.s8U+>rVufrs8U[Ns8V0\s8VBbs8V*Zrr2uEp&G*Qrr7NLj8f2Z
+!70d-!9=(YmK!4cr;cfrMZEcWJ,~>
+s*'"oJH16$JH1B(s*+KCrrE*![fHI.`rQ)<r;cltf)YjNjT,>\lN$tbirK)Y!)3(d!:p-hJH4a2
+rr2sljo>DPrr;BdrVufrrVqcUs&FR~>
+s!WEuJH16$JH1B(s![nIrrE*!q#LHpqZ-Zrkl:bos7-!e!Y,2"li@(cjT,>\irK,Zr;cltf)YjN
+o)Jh$s7,d_s8Vrrs8Vlp!Y,2"rW)uur;[$LSEKk6W[@WD!Y,2"p&P-mnc8^iJH4a2s8Voq!^$G^
+qZ$[,s7-$f!^$G^quHcsoDer(s6KR_s8Vrrs8VThs8V0\s8N3%)6`s6kQ(Y_q#LHpnGrUhpAk4n
+J,~>
+s&FUMJH16$JH1B(rDijts8Vlps8Vrrs8V<`!Zh="qu?d=s5E;Es8V0\s8V*Zs8W#ts8U[Ns8VZj
+!Zh="p&P-mqZ-Zrq#CI:s5EqWs8W#t#"#N_qr!_Hqu?d=s5EYOs8VWis8RWMj8f5[q>^SEs8Vrr
+!Zh="r;ZnHs8Vuss8V]k!n.+squHcsqZ-ZrMZEcWJ,~>
+s*'"oJH16$JH1B(s*+KCrrE*!q#LHpqZ-Zrkl:d#s-*?\!c.h"li@(cjT,>\irK,Zr;cltf)YjN
+o)Ji-s-*-Vs8Vrrs8Vlp!c.h"rW)uur;[%-_"IKQI0BHJ!c.h"p&P-mnc8^iJH4a2s8Voq!l+d8
+qZ$\5s-*B]!l+d8quHcsoDesYs(2*.s8Vrrs8RuWs&FR~>
+s!WEuJH16$JH1B(s![nIrrE*!q#LHpqZ-Zrkl:c_s/c+u!`K'"li@(cjT,>\irK,Zr;cltf)YjN
+o)Jhis/bVgs8Vlp!`K'"p](NPC*!IJs6TX`!`K'"p&P-mnc8^iJH4a2s8Vrr!u(J0s8)ct;ZEit
+!!<o0s8Vuss8V]k"5EkQ"T8?#s8)frs7$*hs82j"A)m9_"9&<#rr[W,rVuWms8W*!!uM!s!<)rr
+!!N_#lMT7QrW!?ngABDk!!*'!J+VPIr;cltqu@.7j7p8(!!!/$q8NC6pAk4nJ,~>
+s&FUMJH16$JH1B(rDijts8Vlps8Vrrs8V<`!j_i"qu?f(s%MbZs8V0\s8V*Zs8W#ts8U[Ns8VZj
+!j_i"mK!:eq#CK%s%N1f#/O=R#&XChqu?f(s%N+ds8VWis8RWMj8f5[qZ$^OrVuop!!9J+9`>"o
+0E(qNquHcso`,*qpAager;cltqZ-ZrMZEcWJ,~>
+s*'"oJH16$JH1B(s*+KCrrE*!q#LHpqZ-Zrkl:eCruV(<!oX)"li@(cjT,>\irK,Zr;cltf)YjN
+o)JjMruUS.s8Vlp!oX)"p](Mr71B^*s,$XR!oX)"p&P-mnc8^iJH4a2s8Vrr")\&;s8)cti;Xkt
+!!@*;s8Vuss8V`l!sJN$g\_'Os8)frs,-mW<Ib~>
+s!WEuJH16$JH1B(s![nIrrE*!"b?+6K`D,Lrr<&qrrrK's*sXu0(],G"RZ$tr;[0-mJ7Cp!&VXh
+l@T!8$tJ>kWWN5$"KD49s8W&u"CgEd]GUAC#7@$er7>lf!;c`q!";3Jqpe4;!<<(KoAD8#!!Hck
+pq.IB!<<)t!<<'$J+VPIrW!(1j7p8(rW)uu$@Cb1rr<.kq9T*@pAb@"WVOO5s8E!$@cR6r)#O@B
+"RZ$t!!Abeci="F!<)rr!;c`o!!EGlq@N`+s7lWr!WW,s!!<Akq@WE$s8VWis8RWMj8f5[qu?j&
+_t!d,qu@',mJ7Cp!!L40s8Vuss8V`l":G2)s'bj+s8Vrrs8VThs8W#t"Y'J\0)rE[!<<'$jt?m=
+p]1?orr<*(s7lQns8W#t"eYg""!36s!"?Xi('!S"!<<)10)s])!<<)t!"CCWU*'Eh!!#Oh\1ms_
+pAk4nJ,~>
+s&FUMJH16$JH1B(rDijts8N8$pZbZW!;c]q!;c^"!<<(tq9'0<!!<Q(o`Y3n$46S%"98F-eGJ'1
+rW!%Xn*c/5!!N_Nq5F>nrW!(Yn+3:XpAbF:[.=%6;?-^ns8N'-DX7)8)?9d;s/>b:$iU,/MXU/3
+"oSH$s8;rtrr]4q`sVeG"H)[>UBUVss8NFqli-na#Jg2Gs8Vfn"U`?HW;lns!!J2Jo:lKe!"921
+o`P7"_"tS@rr<&ts8;ros8;p#$2X;t!<)rn!!39&r;?Tt$2X;tp&P-mnc8^iJH4a2s8Vus":4GQ
+s8Vus$46S%"98E-mbe'EquHcso`,+2s7$%)r;cltqZ-ZrMZEcWJ,~>
+s*'"oJH16$JH1B(s*+KCrrE*!"iC/k+TMN=rr<&qrrrK's2=`7"nVcs-iMWtr;[EWrRV&M!.No(
+b;fP&"02(T@f??:/`-,Ls8N'!"0(tZK*(cI#=6B(oX-@Q!;c`q!#1Ugo;rB#!<<);q5a`"!!B4n
+l[o9;!<<)t!<<',`VHG8!!!,#p$753rW)uu$FB@'rr=(mp6>UWpAbXShXl<trr<$$WV,S0!rN$,
+-iMWt!$0bdPlLa`!<)rr!;c`o!!F\Jf)YmMs7lWr%fc+u!!=VIf)bRFs8VWis8RWMj8f5[qu?jF
+pSn2mqu@'OrRV&M!$q<<s8Vuss8V`l"C_?+rsJ])s8Vrrs8RuWs&FR~>
+s!WEuJH16$JH1B(s![nIrrE*!".^/+q#(3ms8)frs8;rtrr]hbs4dJPs8Voq!\46"qu@ojs3q#K
+*WP@O$>TVA.K?k0s0ht.8,p(Qs8N'!.K?+as4[2I"eYg""!36r!<<)s!#33q('!S"!<<)10)sZ+
+!%IrB+91'n!<<)t!<<',\h=$;!!"JJU*'EhrW)uu$K`uF<WG,Z].s?cpAbXms0sc_rr<$Js.UV8
+gACpX.f[uu!'("j1&q:P!<<)r!<<)q!!4YMeGTCIs7u]t!^cqBr;ZmKs4$]As8VWis8RWMj8f5[
+qu?kAqaUVcqu?dJs4%#J"EaN1s8Vuss8V`l"=4#ms1nR5s8Vrrs8VThs8W#t"eu#X#64>p!<<'!
+;tU.js8E!!s8Muts8W#t!qZF\p](X#qZ$Wrs#^Mcp\b*ls8;p,T`5u5s7lWp]Djnrs8Vfns&FR~>
+s&FUMJH16$JH1B(rDijts8N0t0)tG>!<<)r!<<)t!<<'$ARb\:r;cltq>^S6s-!9[,&R@C!!#Uj
+a;#AL!!$d6@Uf@P!!&qs@V5Z?!!$d6:dk>WpAbBWs"XX-VYpMps82j2Q5)+RdJs:Is(,[>V>pU2
+s%l,`U&=uks8;rtrsNCIs.o\qCB%*us.TDls8NGA*"%&nO8ig+s8Vfn%B'58B)hl2!,DO17/rtY
+!"*TCOoPKCs(6!Fs8;rts8)frs7u]sD?#dt!<<)q!!<C9s02G%!c@t#o`5$lnc8^iJH4a2s8Vus
+"Ln+@s8Vus!c@t#rW!)1pD3f/quHcso`,+us*4QIr;cltqZ-ZrMZEcWJ,~>
+s*'"oJH16$JH1B(s*+KCrrE*!""/$e_#495s8)frs8;rtrrXpas$lqes8Voq!lP%"qu@qYs#U2\
+PQ-^P,eF$V\Gn1ks![pJh#B"=s8N'!\Gmk<s%2qb"nM[7#!^9/!<<)s!#0J_D#\PV!<<'P\Go"u
+!4`%TP5e,P!<<)t!<<',0=_$N!!'P/-'J:"rW)uu$B>Z3Y5m#N0Y[SepAbZXs":q`rr<&/s!<j.
+8c/Pq_uDdu!7Lm$^An63!<<)r!<<)q!!:(<48f0Zs7u]t%&!W5r;Zo:s#]lRs8VWis8RWMj8f5[
+qu?lZh$O,]qu?f9s#^2["QJ5Ds8Vuss8V`l"Mk&\s!7OCs8Vrrs8RuWs&FR~>
+s!WEuJH16$JH1B(s![nIrrE*!!u(b8rquiss8)frs8;rtrrY@fs7cHls8Voq!kA5!qu?u3r^Hkf
+P5fFt!#;7.3X5WV!!'Y23X5Wa!!&\l*!609pAb9ds$cbas8Vlp&c__.!<<']#64Dt!20?3!rr)p
+!<<)t!<<',49ki[!!&\l*!609rW)uu!)rgr"g%_e#QOhu!"HR?3X5Wa!!&\l*!609qu@)6r^Hkf
+XT(Egs8W#ts8Vrrs8Voq!kA5!r;cltqZ-Wq!RD,O!!9\07eHc]s7-0is+(12!<<)t!!OnPJcPiN
+qu@)6r^Hkf/,k,#s8Vuss8V`l"BkbVs60C]s8Vrrs8VThs8W#t"nMZu!<<#s!<<'!$M=E!s8N'#
+!WW,t!<<)t!#9STrQU-/!!!V<oDeji!!*'!#QXo'r;cltr;[;ss8;lrrVurirs&Q(s7ZNn<Ib~>
+s&FUMJH16$JH1B(rDijts8N0(!WW/t!<<)r!<<)t!<<*!%KZUtr;cltqZ$^!mf!gs!!iVnrXf,1
+jSp4t!#=_t%M&O&!!)He%M&O=!!)6_"pFttpAb9mru(Y5s8Vlp&c_S*!<<'/%fbqs!9jFe"TS)l
+!<<)t!<<*!%LN1'!!)6_"pFttrW)uu!#5A3"mc0u&-)\(!"JAr%M&O=!!)6_"pFttr;[3+mf!du
+!:0Xp&-)\.!<<)r!<<)r!!<8irXo)/s8Vrrrr3#%!r`0%!Ufq!o`5$lnc8^iJH4a2s8W#t"_Ra%
+!<<)t!"/hqrXf,1B)Y0us8Vuss8V`l"Ng[&s2k3>s8Vrrs8RuWs&FR~>
+s*'"oJH16$JH1B(s*+KCrrE*!!s/],r;?Wqs8)frs8;rtrrWHds1/(.s8Vrr!sJAp#Q4W."S_`t
+!!)Ti%/^)?o`#+Vs.KDmp\tF\s8N'!o`#"+s3LE>!r`-+q>gQqq>_-0s53kWs8N9as1&+0o`#"+
+s3LWDs8W#ts8NH23rc_j!;-9n'*$;W!<<'!$2ji-p&>4^s8Vfn%JTl,4obN^!;-9n'*$;V!"/r(
+q?I!#p&>4^s8W#ts8Vrrs8Vrr!sJAp#Q4Z&s8)fqrrIcRrW!$'p\G-f!<<)i!<<(M!9=.[s8;p$
+X8<e8s8W#t$O$5##64b)q\fJ7s82lss7H?pkl6)2=oA@#s8)frs,-mW<Ib~>
+s!WEuJH16$JH1B(s![nIrrE*!rrE*!r;cltqZ-Zrr;clt!seo,rVZ`rs8)ct'`[Ir!!3l7lM^bb
+nGa$s!#>))#6=f&!!)Wj#6=f(!!)Qhr;Q`qpAbA<s8C2u&,cM.s8;p4&[_00s8Duus8N?)s8;ot
+nc/Ods8Mrss8W#ts8NH4!<;ut!:g*err;us!<<'!$N0r.nc&jps8Vfn%J0T)!<<'!!:g*err;ur
+!!3l7lM^benc&jps8W#ts8Vrrs8Vrr!Yk\"quHcsq>^U"@/nOO!!3l7lLY)Vs82lqs8)frs+(12
+!<<)t!!Vf*!!*'!r;Zm5s6BR`"n',*!<<)s!<<)l!!LUI/-#GD!<<)r!<<)h!<<)t!!Vuo#6=f&
+rW)uuoDnpkrr<*(s7lQns8W#t'`qdOr;YaV!2ojJ"98B$!<<')!<<#r!<<)t!!;cl$iBu.o`#-r
+s8Vfns&FR~>
+s&FUMJH16$JH1B(rDijts8W*!s8W#ts8Vrrs8W#ts8W*#!WW)r!<<)r!!4nTc27PC1&oMt!!<&t
+"8i-6r;Qd!s82isr;Qd!s8N'!qu?Tns8M`m"i:69_K,hX!<<)t!#7'+q#CBn!!*'!!WrE"!!)or
+r;Q`qr;cltr;cltrrNN,qu?`os8;lrrr)otrr<-!!!W9"!WrE%pAb[#rrE3$rr<&rs8;lrrqufu
+1&oMt!!W9"!WrE%r;cltqZ-ZrqZ$[Ps3:HAs8Voq!sk"gQMpjc1&oMj!<<)s!<)rp!<<(M!9=.[
+s8;p$qg\YHs8W#t!\s`"rW!-!J,fTLs82lss7H?poD]I'oDJ[hs8)frs,-mW<Ib~>
+s*'"oJH16$JH1B(s*+KCrrE*!rrE*!r;cltqZ-Zrr;clt!rrW,oDJ[hs8)ctNrO(r!!82\E;fh=
+rVlor!#>J4!!rVq!!)ut!"&]*!!)utr;Q`ppAbBZs6mC#!W<#us8;p4=kEQNs8Duus8N')s763j
+rVufps8Dlrs8W#ts8NH,#ljJr!<)rqrr;rr!<<'!!W<!%rVlj(s8Vfn%K6;,$31#*!<)rqrr;rq
+!!82\E;fh@rVlj(s8W#ts8Vrrs8Vrr!fm;"quHcsq>^U1cMpK8!!82\E:a/1s82lqs8)frs+(12
+!<<)t!!W<d!!*'!r;ZnZs)@r;"oU[d!<<)s!<<)l!!N,t.K@]l!<<)r!<<(W!<6&L~>
+s!WEuJH16$JH1B(s![nIrrE*!rrE*!r;cltqZ-Zrr;clt!seo,rUg-lE;tsr!!7->NrB"[nGa!r
+!#"o'#6=f&!!)Zk#6=f(!!)Wj$hOE&!arJ7s5NtWs8W#t&uYb\"98B$!<<')!<;ut!;$3uq>gQq
+r;clt#RCG1r;ZihrsS](s8Vus"n_g#!<<)n!"/Au#6=f(!!)Wj$i0i)E;tst!!W#p#QXo)r;clt
+qZ-ZrqZ$\:s,R!Ws8Vlp!X/Q#rW!"=s,Q^Os8VusrVu`ps8RWMj8f5[r;c]orW!"=s,R'YqZ$Ko
+s8Vcm!!rN&!)`^qs8Vrrs8VThs8W#t"eu#W#64>p!<<)k!<<*!!!3r9iViiWs7u^.(]XF6!;QR!
+#64]'!<<']#64Gr!!;Zi%fQG0V>jWp!!U"73X5WapAk4nJ,~>
+s&FUMJH16$JH1B(rDijts8W*!s8W#ts8Vrrs8W#ts8W*#!WW)j!!:FF1&M"Qc2TNt!!<&t"8i-3
+r;Qd!s82isr;Qd!s8N'!r;Qij!!NOL`r?"Kr;cltr;[Jps$Qqgrr<'!rrN9%qu?`prrW#ss8W#t
+s8W*##64T$!;uiuqZ-Zrqu?ourrN9%s7ZL#r;Qd!s8N'!r;Qip!!:FF1&_.Vr;Qg"s8W#ts8Vrr
+s8Vrr!mUa"quHcsq#CI's7cKm!mUa"oDnpkquH]qqZ-ZrJH4a2s8W#tqZ$Np!mUa"rW)fpr;clt
+p&G(+r;Qa1rW)uuqZ-ZrMZEcWJ,~>
+s*'"oJH16$JH1B(s*+KCrrE*!rrE*!r;cltqZ-Zrr;clt!rrW,oCW(blMhRr!!;Hc'`J(6rVlor
+!##81!!rVq!!)ut!"&]*!!)ut!V??q'T(E?s(hQ5s8W#t'(u8P#64]'!<<'!#ljJr!<)ouq>gQq
+r;clt#QP/1o)JdhrrMuss8Vus"o\H$$31&"!"/])!"&]*!!)ut!VuctlMhRt!!W?$!"&]*r;clt
+qZ-ZrqZ$]_rtPA2s8Vlp!\+0-rW!#brtP)*s8VusrVu`ps8RWMj8f5[r;c]orW!#brtPG4qZ$Ko
+s8Vcm!)`[o!!rQ(s8Vrrs8RuWs&FR~>
+s!WEuJH16$JH1B(s![nIrrE*!rrE*!r;Zlrs8)csr;Z]qs8N0`#64Gr!<<)s!!<K&pB:Ep!se\s
+"TAB&P5f=q!"u%+3<oNU!!'Y23X5Wa!!&kq=8Dpss7u]s(]XI4!!3#tr;[K*rs&c.rr<'!s#^Mc
+pAb2is&]$s!q?4"rW)uu#Wr=kpAb2is&]'ts8Vus"h=Rq#QOi&!<<)t!"-@<3X5Wa!!&kq=8Mt"
+#Q"/trW!,3s#gVes8;rts8)csr;ZZp!se\s"T/9"s7lX#!rr/u!!iAp"S;]os7-0is+(12!<<)p
+!<<)u!!<K&pB:<ms8Vuss8Vcm"s<m*!)3F'rW!#hrsnr,!q?4"nc8^ir;[!Ms0aKY\GcL.s7?<k
+rr`<<Y5D,q!<<)t!#<aI#93^9!!'/$B0?4o!!*'!\h3s;r;[Lms,[6]!%Is('GGoq!(d.!0E;(H
+!<6&L~>
+s&FUMJH16$JH1B(rDijts8W*!s8W#t!WN,r!!3*!r;cltrsf)0mem.cs82j!&cV2!r;Zp3rpBgd
+!!;6])uK[Kkl2)%s6'F_mf*b,s8N'!l2MLp!<<)q!!4tVqu$Kqrr;os')hh2%fcP/!<<'/%fbqs
+!9sLuq>^Torr`6#s8W*/#64)k!9sLuqZ-Zrqu?ogrsfS>s8;rts8;p)mf*b,s8N'!l2MLq!!<i4
+mK*:e"n)C#&-)\.!<<)r!!3*!qu?g2rpBgb!<<)p!!if/q#CC,rpBgZ!<<)i!<<(M!9=.[s7lZp
+s8E!#&cV2!q>gQqquHcsp&G:js189Cs%NCl!rN!"qu?fqrr\2[s&FR~>
+s*'"oJH16$JH1B(s*+KCrrE*!rrE*!r;Zlts8)csrr;oss8N0*3rcbh!<<)s!!5Xh\blF/7fKss
+!!;`k%/^)<o`#+Vs.TJnp\tF\s8N'!p&>?p!<<)q!!6U/nbiFgrr;os')qn249,<\!<<''3rc_j
+!;6?uq>^TqrrN*!s8N?/3rcbk!;6?uqZ-Zrqu?oprrt^fs8;rts8;p)p\tF\s8N'!p&>?q!!5Xh
+\buL3p\tF^s8W#ts8Vrr!WN,s!!5Xh\bcC,s7lX")?8n#!(Qsuo)Sgjnc8^iJH4a2s8Vlps8W&u
+!_31"q#LHpquHcsp&G<-s%EFQru_4?!r`-"qu?fsrrJ&Ys&FR~>
+s!WEuJH16$JH1B(s![nIrrE*!rrE*!r;Zo=s'ts,!lk7MrW)uu"1g)ag\h-Ps82iu49*4r!!57^
+_u0QU*WP=M$"s;=.K?h-s0r%/8H6.Ps8N'!.KA3<'7Tl[s8W#t"jKI@)uoU0!!:1?A,ZHCXoE#r
+s8N'!s8TY^s4[MR.KA3<'7Tl['9N6U!<<-"s10f^g].='s4nA&If9?Is82j#5l\GLs8W#ts8W#t%
+7pN.0E;%P!%Is('GGrp!!57^_u0Q=5l\GLs8W#ts8Vrr!lk7Mr;Zm\s24^6s8W#t$dhlc"CM2c!
+!#+\_t*m.s7-0is+(12!<<)p!<<)u!!57^_ta<4s82lss7QEs:]Ig&*WP4"!!A>_O9,:["-EPE!
+V6<ks82j"AEEQd"9&<#s7?<krri>h\4?Vrs8N'6/?A:;e5cPL(XW&ss8N'!s8RWBi@k-0'+r%Us
+8N'!=kNZ2GQ7^IXnp-=s7ZNn<Ib~>
+s&FUMJH16$JH1B(rDijts8W*!s8W#t!qH:Dqu?fgs"F?Os8N13@fN;'!<<)s!!8;_D>XA8OoK:s
+!$+]3`Y9#D!!$g7?ss"M!!&tt@:fK=!!$g7W!FN<r;cltr;[#%1BT?2lMU\anc(9A!#=i".WbXi
+!!*'!A7GS8!!$g7W!FN<r;ZoYs%<7js8NI;@fN>+!,MV5#U#c=!<<)s!!SnmAS1uBr;cltr;[;*
+s']L=rr<%7s/62GTDeflOoK:s!!SnmAS1uBr;cltqZ$]fs"F<N!g3M"qZ-Zrr;[525RRpWs/c8$
+OoK:i!<<)i!<<(M!9=.[s7lZps8E!"OoK:o!<<)s!<<)m!!^1;7fZ'Z^A\*6ir;XK!!;0[8rNcM
+<Ib~>
+s*'"oJH16$JH1B(s*+KCrrE*!rrE*!r;ZoorttY6!r2d4rW)uu""q+`7K!5ds82iueGh#r!!:[M
+.fB>fPQ-UL+M%OQ\c44hs![pJh#At;s8N'!\,U=K0uj.ls8W#t"cX`.>5t]&!!;rq)#aLMp&>]A
+s8N'!s8O^]s$Znf\,U=K0uj.l!qQ@>rW)uu$SJsh7fWOus)%ro`r5u<s82j#f`*V;s8W#ts8W#t%
+G^t8])Vd1!4VuG">Rpq!!:[M.fB>Nf`*V;s8W#ts8Vrr!r2d4r;ZoKs!mmGs8W#t$^EIP(!$>X!
+!(OK.e<Z?s7-0is+(12!<<)p!<<)u!!:[M.es)Es82lss7QEsjSp5#[Js&%!!;`k./X&Ho)C+s!
+<6&L~>
+s!WEuJH16$JH1B(s![nIrrE*!rrE*!r;ZsEbP2&:rW!<MbP2&:!<<(Kp"h7u!<<)t!!<8Rr?qOD
+!s.$P-i<rI29,IZM#IA_AEEQd!rr<)Xnp-=s8E!$=kNZ2Gl7XBs8;p$/?A:;e5lMJ'-bWos8N'8
+d/1`\rr<'!s*s^u/H,VP=kNZ2Gl7UM&]"5BrrE*!JG%kSrW!((f_j]QrW)uuqu?m'U\`I>rquis
+s8;p$"g.XBs8W&u$<c$ZiHP>&!S@8tr;[$)U\`I>rW)fpr;[-JbP2&:!!1^M-iO,Bs8N',/#Vb4
+kFiLg!S@8to)Sgjnc8^iJH4a2s8Vlps8W*!!s.$P-i!cBs82lss7QEs^]-k*#ljYu!!EnLq>^Ko
+!!EnLq>^JT!<6&L~>
+s&FUMJH16$JH1B(rDijts8W*!s8W#t"BF.Ps8W&u$WYmWs8N*!s/>e8$N0u)s8;p""SMTtr;Zp&
+p%f!m!!HWZr8D;f!!A2MnVmGI"UiQNXT/>"!!If5r6eaH!<<)t!!Q$0p@uTVr;[L2g&(gL!'TB;
+WrN)!!<<(tqT'$C!!If5r6eaH!"1@-rVults8T+qbR=CM"FoP2dTQPLs8Vus"UN'E\GuR,!<<)t
+!!NbSqQ0_srW!:Tjo!P0!!!/pq?d*#"pi0F\GuO.qZ$Ko$!#[Us8N'%p%f!o!;c`q!"2E2oDII&
+"98Stq?c`ns8VWis8RWMj8f5[q#LHprr<-(p%f!j!<<)s!<<)m!!_ol&HEFCn,<:i/CaXus8E!$
+/CaXus,I*Z<Ib~>
+s*'"oJH16$JH1B(s*+KCrrE*!rrE*!r;ZtOjSf,YrW!=WjSf,Y!<<)=qPaVr!<<)t!!<i0m0*@f
+!tkCs"T/6-J)gIS4TGHaX7t^drW!B]iUqj'rr<$#SaZBj2#RFSs8;p$B?pDFYRpa5)hI)Ks8N(<
+n*u/4rr<'!s2Oo7"98E'SaZBj2#RCf?K1tarrE*!a82nA!!!(kn+jdVrW)uuqu?mGg\I'5rquis
+s8;p20]D\Ws8N'!!hJfU_)),l&c1ktr;[$Ig\I'5rW)fpr;[.TjSf,Y!"o(p"TADts8N',B$0lD
+dVT$c&c1kto)Sgjnc8^iJH4a2s8Vlps8W*!!tkCs"Si&ts82lss7QEsp\tL!8cQR)!!HWfrr<#t
+!!HWfrr<"Y!<6&L~>
+s!WEuJH16$JH1B(s![nIk5bP^o)Jh5s5<eT!ZqC"]E&!3ci=+Ks8;$[!ZqC"q#CHts8;<c!ZqC"
+li7).s5<GJrr2u_p&G)Nrr7NLj8f2Z!9s4X!ZqC"o)JcKrr7NLli@&cJ,~>
+s&FUMJH16$JH1B(rDi"\s8VZj!_iX"qu?dls0B9;s8UFG!X8W!k5YQWs0DG#!X8W!mf3D_s0Ctk
+!_iX"nc8[h!71?=!9=(YJH4a2rr2uEpAb7gs0D4r!9=(YJH5$:s&FR~>
+s*'"oJH16$JH1B(s*+KCk5bP^o)Jins&/ap!j)E"]E&!3ci=+as5`>C!j)E"q#CI5s5`VK!j)E"
+li7*gs&/Cfrr2slp&G*`rr7NLj8f2Z!)3+e!j)E"o)Jd]rr7NLli@&cJ,~>
+s!WEuJH16$JH1B(s![nIk5bP^o)JiUs(qT5!gEY#]E&!3dJsEW'e]OPk5YRIs(qQ4"LJmrs6K+R
+!gEY#li7*Ns(m5dZiC/ks(m5dg&V.QJ,~>
+s&FUMJH16$JH1B(rDi"\s8VZj!oa/"qu?fWruJ`Ps8ULI"G7%_s3Tp/!oa/"qZ$bO$<R8Smf3FJ
+ruLG+!oa/"JH3%W!oa/"JH4C(s&FR~>
+s*'"oJH16$JH1B(s*+KCk5bP^o)Jj^rsel+!qH:"]E&!3dJsDT"eu$;k5YSRrsei*"C),)s)RQ.
+!qH:"li7+WrsaMZZiC0trsaMZg&V.QJ,~>
+s!WEuJH16$JH1B(s![nIk5bP^UB(>odJsD7f_s;eh>d[Cf_s;eJH16$JH4L+s&FR~>
+s&FUMJH16$JH1B(rDi"\s8Shos8ULI"DR)r_AD&/"DR)r_A@b'JH16$h#RITJ,~>
+s*'"oJH16$JH1B(s*+KCk5bP^UB(>odJsE0o(B!hh>d\<o(B!hJH16$JH4L+s&FR~>
+s!WEuJH16$JH1B(s![nIJH16$JH16$K`M-QJ,~>
+s&FUMJH16$JH1B(rDeCKJH16$JH1B(s&FR~>
+s*'"oJH16$JH1B(s*+KCJH16$JH16$K`M-QJ,~>
+s!WEuJH16$JH1B(s![nIJH16$JH16$K`M-QJ,~>
+s&FUMJH16$JH1B(rDeCKJH16$JH1B(s&FR~>
+s*'"oJH16$JH1B(s*+KCJH16$JH16$K`M-QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+s!WEuJH16$JH1B(s![nIJcC<$JcC<$L&_0QJ,~>
+s&FUMJH16$JH1B(rDeFKJcC<$JcCH(s&FR~>
+s*'"oJH16$JH1B(s*+KCJcC<$JcC<$L&_0QJ,~>
+JLH'tJLH'tJLLOuJcC<$JcC<$L&_0QJ,~>
+JQ78$JQ78$JQ;_MJcC<$JcC<$L&_0QJ,~>
+JTlZhJTlZhJTq,oJcC<$JcC<$L&_0QJ,~>
+JLH'tJLH'tJLH(LJQ78$JQ78$J,~>
+JQ78$JQ78$JQ78$JQ78$JQ78$J,~>
+JTlZhJTlZhJTlZFJQ78$JQ78$J,~>
+JMVj5JMVj5JMVjWJQ78$JQ78$J,~>
+JMVj5JMVj5JMVjWJQ78$JQ78$J,~>
+JMVj5JMVj5JMVjWJQ78$JQ78$J,~>
+JH16$JH16$JH16$JH16$JH16$J,~>
+JH16$JH16$JH16$JH16$JH16$J,~>
+JH16$JH16$JH16$JH16$JH16$J,~>
+n4\B5JH16$JH16$JH16$JH16$OoU"~>
+n9BKaJH16$JH16$JH16$JH16$OoU"~>
+n<nh-JH16$JH16$JH16$JH16$OoU"~>
+!)2r3!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n'7!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1ED%!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)2r3!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n'7!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1ED%!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)2r3!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n'7!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1ED%!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)35;!<;mD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n??!<;mq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E\-!<;n>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)38<s8VpD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-nB@s8Vpq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E_.s8Vq>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)3;=!rj\KqBu>;JH16$JH16$JH16$JH16$JH1i5J,~>
+!-nEA!rl:#qGdN?JH16$JH16$JH16$JH16$JH1i5J,~>
+!1Eb/!rmKEqKDq-JH16$JH16$JH16$JH16$JH1i5J,~>
+!)35;!<;mD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n??!<;mq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E\-!<;n>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)35;!<;mD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n??!<;mq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E\-!<;n>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)35;!<;mD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n??!<;mq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E\-!<;n>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)35;!<;mD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n??!<;mq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E\-!<;n>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)35;!<;mD!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n??!<;mq!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1E\-!<;n>!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)3;=r;Z[C!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-nEAr;Z[p!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1Eb/r;Z\=!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)2r3!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n'7!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1ED%!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)2r3!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n'7!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1ED%!1AB<JH16$JH16$JH16$JH16$OoU"~>
+!)2r3!).qDJH16$JH16$JH16$JH16$OoU"~>
+!-n'7!-j%pJH16$JH16$JH16$JH16$OoU"~>
+!1ED%!1AB<JH16$JH16$JH16$JH16$OoU"~>
+n4\B5JH16$JH16$JH16$JH16$OoU"~>
+n9BKaJH16$JH16$JH16$JH16$OoU"~>
+n<nh-JH16$JH16$JH16$JH16$OoU"~>
+JH16$JH16$JH16$JH16$JH16$J,~>
+JH16$JH16$JH16$JH16$JH16$J,~>
+JH16$JH16$JH16$JH16$JH16$J,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/GPN-2009-06-27/xft.eps b/docs/GPN-2009-06-27/xft.eps
new file mode 100644 (file)
index 0000000..486d381
--- /dev/null
@@ -0,0 +1,1708 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1,17 by Peter Kirchgessner
+%%Title: xft.eps
+%%CreationDate: Sat Jun 20 20:49:20 2009
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 553 304
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+0 288.99323244445742 translate
+537.98740157480313 -288.99323244445742 scale
+% Image geometry
+538 289 8
+% Transformation matrix
+[ 538 0 0 289 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 538 string def
+/gstr 538 string def
+/bstr 538 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData:        94268 ASCII Bytes
+colorimage
+b1cpOp"TN#s4dS-s5!M*qqCf!qq@t&"kqY_gY1BZg\0@qg\]^Og\oq'gAp%.g\oiWgQpTE~>
+b1ZjMp"KH#s4[M-s4R5%qqLl!qqKTRs4c/Z"l%bbgtUT]gAKY$g\9G!gX+[Qg\KP'g]#q*fn%kC
+g40~>
+b1-LCo@<lls4."ts4."ts4./#s4./#s4./#s4./#ldc$dl.,g_f$siOe^sZJr7(bss46els45KG
+rRUep!7q/"rR?DKQIUK~>
+b1d$Rh;$fagAK_*g'-4I()@])rYYSH!sSo5"o];<)>tENE<+PgdfU$h%1]Als4%(trXAu?g=tB;
+r7h,&pY5T!d+eL(q:kiQJ_Q@BJ,~>
+b1ZsPgtUT^g&0S(gBH:H(Ddi&rYPMF!sJl6#5oD;(]A=Oe,p0k%LpqAs4c2["4PfMeG]p\%GBIh
+g\fe&g\9G!gX+[Q#5R!O#(bKkg40~>
+b1-UFf@JOOeG@\uee/Q,')`LD%2fQ`!<E6&',(um'+tokChmg&d*Bq_#mgkCma_?gl.,g_f[U,M
+cd'iCrWiVUe^`7Iec44lec44GeboOEeboN"eWSI5~>
+b1lmMrS%2(rn@>e!#PSNr=T)7rWN?>()QlcrG`1oe'leV%1Ng%gYB!e"5MYceGdo!%1WgWptP]"
+pY5T!d+eL(rn@G.rn@G.r<N;U!8N.[QeR#~>
+b1cgKrRq,&rnIDg!#GMLr=Su3!Z2^jr"o<N$IdMSeIN-"%GKOjYM'*5g=k$Te,p0k%Lr3eqqM,(
+!8ID)qqKKOr<E8T!8IM,!8IGVrRq8+J_HIEJ,~>
+b16IArRChsr7:i[!#5AHrXAi<r<!'6')N@@D#V`]cjKaY!nPoQYLN^*e^j]F":5DA$.f"(pt#Jq
+!7UnspX[dCr;loJ!7q/"!7q)LrRCo!J^p+;J,~>
+b1lmMrS%2(rn@>e!#PSNrXo5D#6"f*(]P<R(Dn"fE<F_>daS1)!"Q!_!7_"srXAi;r7_5,rnI>(
+pY5T!d+eL(q:kiQJ_Q@BJ,~>
+b1cgKrRq,&rnIDg!#GMLrXf,Ar<3EB(`4&*()IecE!+S=e("@,!"Gp]!7UqsrXJo;r7V/*rn@8(
+rn7A,qqCr%d+\F&q:bcOJ_H:@J,~>
+b16IArRChsr7:i[!#5AH!tPhM%fHJ0(&\dI&ebrWD#_f^cHlFq!7n4$!7q+pr<WJTrRCr"eb@Vq
+e^OKIpX[dCr;l`Er;hK"P1>'~>
+b1lmMrRqD/gtgc?rn@>e!#PVO#T"*c&eYBP"pOuBr"oESrc%qfrmUiU":j5AgYApc!7_"srs\u;%
+fY2_h#,q(g@sA!g<eUQ#QNN[gtUQ^g\hA.gQL<A~>
+b1cgKrRh>-g"P37rnIDg!#GPM$Pj<c&J50M"pGe[)#P0MEW0nWe,Ikr%Km6qg=k<RgAfp?g&TV$
+eGg$Y%K>&]g\fe(g\KP'g]#q(gX+[Q#63BYgY1?[gAM5,g610?~>
+bLHXEfDaA"e-"7Ne^scNrXo2FrY5_R%h&mX!s8Z.(&\gG&ciY_rbVPZr<WSXe^`7Iec45!ec4+g
+ec44HeH+7Krm1TN#RCafe^`:&e^aQJs4IA&rRCqteb@YCeboOKeH4=PeGe"s!J/daeUR~>
+b1cpOrn@G,rS.A.rnIJ,"5DP`g\on-T`1Vb0`Ea)f`g*cgt^`@rnID#rX8c9WS7F&rmUiU!"St^
+!8RP-qqCf!qqBKQ"l.k7Xfef)h#6",#64u,gk"4GgOK~>
+b1ZjMrn7A*q:Z&.gY:N<gY2V\!2'7`r@\H0g=k68gY:N<rn7A#rm^oV!"A>M!8G0?!7UqsrXJo;
+rRq8+rS%5)q:Yi'rn@8(db4lZg8qBXXSpoPgAV9V"o[2,g6UHC~>
+bLHXEfDa;#eGIerecsaWf%8L(f_sJ*SXc4Ar@J$$rm_/(f%/L*rmh(prm1NK!7pnps47+u!7UJg
+s45NH!S5Ztci".Sf%&=%f@AFKf)OD&f)=,"e(+3DeC=`ReYf=DVu>3Fec#RL!<(K"eX"a9~>
+b1cpOp"KK"r7V/*rnIM.rLj3Fr\+9(!8@D,rS%>%rmUiT!=dhagB5sRe'n:*!"SeYqqCf!qqBEO
+riH1'rS7G-!SZ<,#6<TZgk"4GgOK~>
+b1ZjMo\'<"r7_/)!8@CEr@\9+g=k6Yg\oh+e,Ikr%06mlWnRL%s4%#X!"J_WqqLl!qqKKOri?+%
+rS.A+!SQ3*"p!HXgO\(Eg40~>
+b1-LCpXT;p!S,d!f`'P(f_qE?/HFE%ec"+uf)<qn#QWKTf)O:qf"0B7f$DXfci"1>f)+"hf%/CN
+VZ<[of)O8$eCFKu!8%5$J^p(:J,~>
+b1cpOp"TAt!ScH0h#3oH0`Ea)f`9b)g]ZBegY:6WdfU!f$k9;m"5MYceGdqr%0R0qg=tE\g\]_!
+g\]^QgC;lkXf\b.gtg`?gY:H:r<E>YrnN(ZQJ6o~>
+b1ZjMp"KH#r7V/+rnICEr@\9+g=k6YgB?6bg=k$Te,p-i%1K>l"5DP`e,Ikr%Km6pg"P3YgABY!
+gABXQg'u`hXK8P*gYCN;g=k66r<<8WrnE"XQJ-i~>
+b1-LCpXT5nr7D#'rn77Ar@J$$rmgu!"4l)Tf)<ns#RLbBr7:nupX[%.!nPoQrQkEK"4l#RfC[Yk
+eaqAEeIC$YVl-Jkf%8I'e^`1"r;coMrmlYNQIUK~>
+_V5(GrS.5'r7q7E!&4C*"5;G\gATh*gB5sRe'n:)!"J_Xs4[M-s4[D*!8RP-s4[M-s4RM.h#?%.
+h#6"-g&p-bg=lP\!8RM,!nuD_o@s<!s4dS-qqD>1gY:6,daS1)!"SeYqqD#'!o2ParnI>(!8RM,
+!8RS.s4[)!s4[M-s4ZtsrN6%R#M[tcg'7fd#Q<HMgAp#[gSESS~>
+_V,"ErS$u"rLa-Dr\+H/g=b0Xg\ok+e,Rqs%0-h3gAfq-gAfq*g&Tn+gAfq-gAfn.g=uV\!8IJ+
+rn@M.gY;_]!8IG*!nl;\o@j6!s4[M-qq;8/g=k$*e("@,!"J_WqqM)'!o)G^rn@5'r7V/*rn@D,
+s4[M.pY,Z%s4[M-nCmiBrS%S2gY1<b#6tJ3g[s2"gO\(Sg40~>
+bLQXDqUGSsqpkYrs4RG("kfK;S=V>3.g+AQeCFNL#M.GUf$DXfci".If)O;!f)OD$f)O8$f%9WG
+&_>L_f%8I&f%/C%f@JL&f%/CNf)O8>f%&=#f%/C%f%/C%f%/C%f%/C%f%/C%f%/C%rmh8'f$D[f
+ci"1>f)O8&f%&:#rRV#!s4.2%rmh>,f%/C&f%&=Jf)+"tf)O;#f)O;#f)+"tf)O;#f)O8(eu5LE
+W7V%"s4./!r;llJp=9/n!7h&!J^paMJ,~>
+_V>%E!8IM,#MIhbgYCT=g\mfG0`E^,g=t?VgAob&e,BdZ%W#orD#G[r*ZQ.?WMlbpgY1H;`l5s;
++!)IFgtLK[g\nMb/M&G)gY1B9rRCiVrso!Ar?_Ij!@9)kZNs2r8kU3G*?I?B49*e3e^W+Je,BdV%
+fKu;/-@1D,:*8e!3,qO"OtuOe-u<arac(BrC6`6#-"Q"WS?.\r7h0?"=Y`I.3JO1r_`_prR^l"r
+<N;U"PVP^g'@T]rS.:urB^B,r?h\Q?=$oggT'"Y~>
+_V4tC!8@G,#MRqeg=tB9gARZE0E*X,gYCQYg&TV$eG]p\%;T]nC],RY*=s3hWMuiMg"Y6"`5T\:
++!2R'g\fe(Zj/-6/M,W1gY2VTrs\o:rFl-Ts!7[k-2k+T8kVfL*?H7B48q;@dfS%Je,Ikr%KHt:
+AGn"\,UF]^ri#mrrRqD'eC2kSrXAa;rC-Z4#,nN#W7p"\r7_*=#:M#M-lsHP*WAn9;Z52BgAM6S
+g'?<bg=ZZ8#6k([rQtL.r?D1e"'f,;>_1V/g40~>
+bLQXDqUPPqrm_J/e^i=(g"4g-St)=B/cI7$f%9cLs4%,#rQkEK$tj0aB-AB?+W2+6)Q*M0#M.GV
+f"o,:_#5,Nf)*uGf!)?]YUCkH.+Zr!f$DXecNja]$"ROVA0<!:+<_jL+g.rLY!tiL7f=2.2`<NO
+cd)F6r<`F1r?qUf!?WH_U]B!FeH=+CcHlIp"9r7B@:K4%%7;?b+sWnYUSQJke^i=Nec%i<66md#
+,T?Y""&2H_:&`NLdalt!f%/C%ecGjQ!nRA$rRCfI!!)uJrQG.$rZ)7c+sA*R=BSd.J^pdNJ,~>
+_V>%Ep"TG=!&4C*!nuD_ptGeurmUlVrsf0JD/=#7r[%UcrYu0BW2Q]NgY:H\`W.+[*ramkg]+Y_
+[^@^d/-FY\g=uVV!7UlVrFu6W!$qLirNcJsr_!/1!$;)#qpbYprXAi;rFQ![!\5fJrZqNB"fJ?S
+gY1E\e,TpV$iX];B)P3t-ig7GW;bNKgAj_B7fY";./k7f+8o+9fD4/'"pbG=rS%>+rn78T!!iJW
+"4>KCdJZB0,60(i-iIA&gT'"Y~>
+_V,+Hgt^ZWgARZE0E*X,gYCQYg&TV$eGg!_%h3;jCMP3p-2ee`WW&gugY1B7rP\aXrZD-or7_1X
+!k#Bdr[e6-gY:H]df@hp%K0u>,QK(f-2k+L9)_K_*WR5Z3rIG.e^W+J%KHt:AH+.].OueD-3'tE
+W;kQPg"QDR!"8c7ral.ArC-Z4!3#mrrnIA)!(HlV!%@gqrZ;+]rDEOEq:YoS#6kD2g&Th*gAV<W
+#6!6Xd*L(crBU<*!%%UkrEY!.WnMt~>
+cdhd@rm_,%eC<(KebI_oSGar=f%9cLs4%,#rQkKM#mpuOB4bd!+X&*/)??]7V?>H$f%'`8!#khS
+rmgqts0)O/Yl,sMfDaA#cN)8h$2nE6+9<N+rZV6CrC6`'rAOT"!mo9>r<`F1s!Igo-iG1fU]mNh
+f%&:#rltMir<N:0rB^B,rM98?!($TNr?V=[rD!7=q:5WK!s/Q&f)F2"eGTFHeH=";bKKlH!'L3$
+!$V=crE0-OJ^pgOJ,~>
+_V>%Ep"TG=!&4C*rn@2&!Sl3(dfU!f%M&GRr?_Ue*#fmsVuWgqgAo:n`W.+[*ramkg\nM[/cI=#
+g&Tn,e,[tr%fL,?-2f.nZa@'F9E%Q_*<7/Z48dV-e,KjX%LrAJr@@pprZqKA!3,qOrR:fUrX8^:
+!G4k$7f=_?WMlepg=k<8rS.9@"">WI./k7f+8o+9fD42$#6>#6rS%>+rn.DX"pP=drnID!rB^B,
+r?qVO!FK/agT'"Y~>
+_V,+Hgt^ZWgARZE0E*[)g\KP(gXH/O!t>_N%K1)@-3"qc)]\gTrRq7krl"jYrZD-or7_+V!%e+$
+rn@G,rmLkqr=/^=r?V=f"L>A>Z:b*hrZ2%[rAsl*rm^rX!=oV;AGn"Y,lT+hW;rmqgATJ#$iUS6
+AcZI4r^Hc5#H4W%WS?1_g&9Y'7KY%f.Ok?=!$;)9rRUeurrrK-#6!6Ug&B\."pYA;g&B_(d/?6.
+,5ikg>le8;J_I-XJ,~>
+cdhd@rm_,%eC<(KebI_oSGau5f)O8#fDX###RLhEB4kghrZMCh)B'J3rMBSIrmh(drkSRQrYb^c
+r7:hNr@%Wqrm(Sir<`F5rZD4`+T<MdY-5"2rC6`'rAOJtrs8]5#lS00-iG1dU]B!Fec*hoci"+I
+@/rXn62`&.U]mTjf%/I'rRUp6s!.Uk,lJY[:&WN9f)GdP!<W5Nrm_&!!<*!!eGe"sbPjR'4T-?"
+,6(dI>$9F-eZ75N~>
+_V>%Ep=fT&rLj3Fr\+9)ptGeurmUiU!"SsD"=>NF,out)s/>ssrS%IpaN;FDrZ;'m!8RP-"LY_J
+[4VA/rn7A,rR:oZ%h9*KB`VrorZqOlr[%cS[C*>6r_!/1!$;)#r7(_prseu<rFQ!["YD8O,pXc8
+VuWgqgBZ6WeC4m7$k*&G$"cXs7RedU.O_:qW;bNKgB9u:8Ok6/-j(M4*Zk8X!8.;&s4[P/r7h/T
+"P_bggY2Y["9eu6#Mf=5rR(R0r?M7grEf0O!8<"Y\(cE~>
+_V4tCp=]N$rLa-Dr\4?+pt>i!eC;tG%K1&B-2o1g*<2r<WModL"NA<u`?,"#rS.;)"LPMAZn22.
+rn@G,rR1iX%LimHBE;flrZhIjrZq]QZ*CT,r_*53!$2#!r6t\q"Odeh%LrAIs!n7(.jQGf-2sk]
+W7ot[g=+L!dgHNl$Y<p^AOT'W740E/-`I$DrnIA)"@Y^I7O\6b"!8X-*W8h8fDaA$g&Tn*gAM3Y
+g=b05g&B\."pYA;g]#n/d*^7frBU<*r?hJKp"BE!J_ITeJ,~>
+dFIp@rmgtuqUPPq!8%1>r@@fss4./#s4%,#rm(Slr<rR:rZM7cr>P^5&Z;MYf%&?f_8=#,)&X@D
+e^`:Mf);iP-ik^Grmq(p$.0+h$O^QWA7Zk^+93Vb,64tIY5Lig)>uJicNV]($OdDPra>aR"Xk`@
++Wqp+U^Yi)e()agcHc_%$415A@08e^5sbGorM98?s$?ZOr?MI`)]BUm9`WZAdf7kufDO2"!r`<&
+f`'J#eboLKf)F2%bK7lLr]:*Br>tn]rE0-Op=0/mJ^q6[J,~>
+cJ/<Qq:bo)o%X,:!&4C*rn@;)rRq8%rm^oJ!!<+`"P_bggPc&g"$&D'48mn:`lQ6@+9!>\g&]s`
+rn@R`[^WXrr[e'&!8IJ%r;cnarg3T<rH&8W'bq@p]tD&Xg&Tn+7K/8IN7@jUrW*!#rJgm5rn@OQ
+VP^9j)ZUlVg&9D#!r`6"VuWgqgB=(>T:J(C3We$igAK\.b08)Pg]#q+f`9b)=8mpSL&'L%#6`f;
+h:p]`gAV9Z#M\%gg\m95:AruIgB?6Vcd'l0g],uYgUQ!g~>
+cJ&6Oq:Yi'o%O&8!&+=*rnIA)rRh;&e^`1J!WA2ag=b05rJCS8r]:#3"NA<t`?,"#rn@J-g]#n0
+['I$F/H.7#gAot+e,97HQ2[*JgAQ*k&Hf\[]tXL#!8@B>repu<e'umrr;lkV!8IM,"/_uoW;[b>
+)q`frf_s:t!<]:"WModL"ItsNS3$X2!o)Mbr7V:qaN2KWrnIG+!87<Ore1?*q:bcO"PVP^g=lP\
+rW`]5g=t?8OHGZerD!7Frn7M.cHa\[p"KH!J_IWfJ,~>
+dFJ6IrR^turm_#"pXT2mrLEg:r7:nu"P2,QeCFQF!7LfG!0R8Armh)%rJ1G4r]'r/!S,d"_$Cqs
+)&h)Ve^i@OecW.[Yd"*T!@QFsf)EtqdJX%FPQ$aDec9XfE<d!a%LoqY\@MRhrBU@<!/LR"!7C`F
+!/pi5!8%5$rh9Cfr>,Rce'ZYDc2c2h!!&nqV#AmCR/JoDf%9fMrPe`drRLjErdb'"q:5NIrWE5R
+qUPWJrW*8Sf%&</M2@/i8,u6[fDa>)e]Q%Vb1?::s3uVM\CH*~>
+cJ/BS!SuQ,gAp%"g\mfG0`Ea)gAK\.g=t?8ec+(t!<<3"PQ]^rh:mkeMZ,X:48mn:`Q6-?+T<G]
+gAK\.[(!NP0)dF#gATP"!WAA`g\l3s',;5q^AbhFg'$/!77K`EN<@YZe'n9s"9OUENfO+n!SjXQ
+VZ%M7*<"Rhe,TRL!<]9uWN#jN#G%KZSNAno3r[k4gBQHfb08)Pg]#q,g&Kb.=BAR)rJ(:*!8RS.
+r<EJ[h;-i?rn@>U!!iJWrK7(S!)NRK"5DVcg\oIsgAot+gB-0bg]#oXgUZ'h~>
+cJ&<Q!SlH*g&TmugARZE0E*[)g\fb1g"P-4eCE+!rW*!!rKI66!8@F0!K0&=3rRe3_uRdT+9($m
+gA\DY[/DTUgAoq+df@hp!<&5^gAQ('&eP]g]tV4og=tB96psI3rJUj,e^W(H!<\=ANK*qk!8IIM
+rYtnWrRh(tr;lqs!NN*sg'=.;S")N%4$3Grrn7S2g<%FWakHaKs4RY2fiM3T<W.XMg&Tn,gAM3Y
+g=b05gA]k+#64u,g&R66OoA&T:AroLg=t?8rQbAq!87>)!o)G_rn2kV\_;Q~>
+cd`0Lf@S[,r7:kt!7pnprRM#"S,SrV/,n,teH==OeCFQF!R^uI!<A8]Ns!q`f%BtX"GSfo3&^`d
+!5STM!#tnTrmgqt!3cC+"">TF./qctfDa.te,97HPl?jFec=A$EW$FO]=GJaf`'J%5QO/9rJ1j,
+d*L)>!<E1YMM[8jfE'U!rhB?-!7_"srlteq!!**#VPBu`rRUq7"#`(r2Z)&+f@Ko>rRV#!&_>K2
+;GpACJ:N4%e^i=)f%/LP"T6pOf)>^N!WCOKMuJS58-):SrRV/&f@JOOaoL#leH"+teH4=Pec+'L
+e[a4\~>
+cJ/<Qq:bo)o%X,:!&4C*rn@;)"PVVag=?2P!s&B&!r\>ggYL]?Mi3IMr]1$@rS.:j!$D1]!nu>]
+r7_Ia\$i[r.kE7Ng&Tn+eGTFJQN<J?rn@G.rH&8X'bqCs]tM)Xg&Tn+70&AIN<@\ZdaS0r!!<+Z
+rS%=Mrhf]7!?)sVg&9D#!r`6"VuWgqgB=(>T:J(C3r[k2gB>[Dbf\]>gAT_'<s+24L5#HXr<EDY
+h;/(bs4R\]"pP=egYCQ^Oo8&Rh#5t0cd'k_ptH#.gY:H8g=h,4]%_`~>
+cJ&6Oq:Yi'o%O&8!&+=*rnIA)$ea7eg!nR&e,]OM!<&)eg=b05MMm@M48q;>gAStj*r[5_gY1E[
+g'>!kZEu/6/M6tV!8@G$!7LfGs-<\PQN#S<g\l0q&eP]grk8BFrn@G,rBpXFreps.eC2nF!WA#V
+g&S#LVuIb:)u\Ffe,9:LW2ZbprRqCES"#p/r]C,6r7_1m!m&L;rnIG+!8.6N",2J`K_a@#"q]MA
+g"P08gY2o;#6ro9gY.bgOo8#Qg\oh.cHXY[pt>r,g=k64g"Cr1]%VZ~>
+cd`$HrR^turm_#"pXT5n!S*\=SGau;f)4&#eCE(!rm1hs!!!$#OoCF@ed0oaM26mE3&ihpf)<Db
+)ZCTUe^W.If)MrXYHTE%-ReuF!8.:u!7UlH"-et4P5a#4g&5ph&-KSU\[qajrBL@>reUU##0tTr
+!<E1Yre^X,!7q+Crtb_P(Y&H5rltMir;ZhprhTMDrL!OAq:5Ye`l5pqf)F2"eGW;FJcC6*f%&@&
+f[eX+r<3&N$eNt\!<N<'e^`7$MuJP58H)3ZfDX8'b/qfKf(mi#f%&=#e'ulue[j:]~>
+dG+KPlJ)92!&4C*rn@5's4[M's4%&L"TSUgQ'7I2gAm02MZ#U7g&o=6`Pqft!$2'mr7h1Xr@Is%
+!8IJ%r;lk`rS.9mr=f.D"5DVcg\jS>NW%?*!=8jfNfT4Tg=tA[rh]c:)B0[pg&9D#!r`3'W2HSn
+h#?(,SH(bN3rdn6g&B_,gtVeMrS%8(!8@BQrJ(@,!8@A*r<N8Trn@>U!!iMX"PT!"OcfT;rS7A+
+rQk/kr7Z_V]A%i~>
+dG"ENp"KH#ptG\>!&+=*rnI;'s4Ie0f%&7N!<<.aP`h7/g'!:kMi'Rp48mn9`lH*=rZ;+]rnIA)
+rNlPTr[n-(!8@D#r;ce^rS%3kr=](B"5;M`gAOG<N!%MXeC4Bt#m-'FNfDcGg=iG'Vu@Y9)u\Cl
+e'ujq!WE0"W<&sPrn@=@!':*@s4dM+!Sc?,aT1#ng]#n,g&4tML&]j,g&0S&#5m3Sg\qEX#6*<Z
+foV;XOSqoPg\ok)cLoohfn%khg40~>
+dFJ'Dp!s)krRLhsrLEg:r7:er"k;)LdEp>?!!JFGNfMZhf)CC)LcGAlrRM+f_SO&,rYYdge^aWL
+!SF^WYQ-'M./h]sci2>j!!&8_P5a#4f_ogg&-0?A\HCF7e^j[arJ1R$cd1#;!!eC<MM]p7f%0eo
+r>,I`rmLtpbg+Q5!<&\nfDaA"R/JrCec=8"ecFCRrP\cermq)!!S:<M;Z21Hec=8!ec=A$"T6pO
+ec5dN!WLUQe;K->Mb*h=rR_#!rQ5,kp=9)jJ^qB_J,~>
+[bLf8!8IIH!&=I,!o)G_ptGeurmUiO!!rPWrS%Fi^V@S_+9U?Ng"QDDr>tslr7_4YrjDbX!A#c#
+g&Tn+eGT[Kg\mlL2E*QSq:kmhr,VkfrmLrP!s8])f_jM'g&i94)]\gh!7Uqsr<WS[g"P6[g\nqj
++WqmLrn@;)rHSAur\=C0!&jd!"(5JC@/8RU#Q3?UgAV9V#Q<HV^&8oQ@:NbUrL<i=$/!kagY1E;
+h;$f`g4A"fgOK~>
+^"WM@r7_/'!8@CF!&4C,!o2Pbpt>i!eC;tG#Q<?Sg&Sne^]5MV+TpKQg=uSGr?)$nr7V.Wrj2bY
+/hJXRgAot+e,9OIgAR`J2)[?Oq:bgfr,MqheC;qMrWE,Nr7_/)rYtnWrOW3\eC2kPrX/VYrS%4c
+"!Aa1+TC-ngAQ6r1&`s-2?5W5+9PtW?=3N^r<E2RrnIDW!!`DV"2)=\]_rcO?t*PQrL3c;$.mb^
+g=b37gtUT]fn%kdg40~>
+^"*/3rRCo!rm_#"rLNm<!8%2#qpb\trm(Slr<3>Ue^`1"rmq(\!PTWS*!=dBe^j]8"r\?s)V3Hh
+rRM#%Z2Us0-n-PlrRLtprmCZJqUPZ!rLa9L1c.)BrRV#!!7q-dr,2M[!RUuJ!<gs%e'ceCf)6Bb
+\,Nf=c-4JY"TAT(ec=>#f)<8\)uprRf)9^h/cII*1EQN8"'\r4>PcnNf_ksNf`'G%!r`6!ec`Ii
+[C6qN(B[oK?![Dps3_5&dalsue^i@'f)4$Ke[O(Z~>
+\_@2>gY;\\rLs9Hr\+E.g=l>V!7_"srs/Q0rS%8*!SkKi^\o;RgAT"h*ramkgAnV[[/_fX/H4?'
+g\oY##Qic7gAK_*UB70b2Z>Z2g\l0kEra_he,KOM"T@!Ng]#q+)[%.n]tD#VeGT^QgATb+h#5%h
++oWV`gAK\*GlDsg1B'$-2#oQ5+Tl+Z?srfbr<N8Trn7GY#6kG3h#4qb*;s@FS,Lt;g\oq+g4A"e
+gOK~>
+^"WM@s4RP-g=lMYrLj3Fr\4K0gY;MW!7Uqsrs/W3#Q<?Tg&]sCrkSIUrS.:jr?)$nr7V.Wrj2YV
+r[n-(!8@D#r<EDXg"H;Ws.TRgU,Dp.q:bderGhnerm^rN!<iT(fDOA%g\r/q)nWbp]D^1Y#lY21
+g\oh+g\nnf+T<P`g\fb*GQ)ge1&`s-2?5W5+9PtW?XNW_r<E2Rrn@M[#R:S4gB5+%]tF:_rF,Yn
+rRUr$rS.;(J_IQdJ,~>
+^"*/3s4%2#e^j]LrLNm<!8%2#qpb\trQkKG!<`N'ec+,"fDW>[*<"Ie_>P;Of)4/#Z2V$/.fLjp
+f)<qn!s7'(eG[r%fV"n0TJQR(!8.8$s4%,#rGDLNrQkEBrR:Snr>5LCs0hmO!s8Z/"o?dMfDWA\
+*;S.cF8g:[/cII)1]8?s?!:H:qUPZ!r<3&Nrmq)NrrN)L"LkeH[herZrE]AfrR(\srmgturR?DK
+[afm~>
+[bLc7rLs9Hr\+E.g=l>Vs3q(udf'IS#hn"egATb.^q[\"r?2'mrPe^Vrn@;)rNuVWr[e'&!8IJ%
+!!iK/r7_S6gY8KuU8'Y,2`L`j!SlE.g\l-tF)l>BeC2prrW<-'rRh,(!SlH/gAW#o*5&tt]`$=[
+$N:>;gY1B9gYCQ<_Z%@O+oWSbgY2PZrHSAur\=C0!&sj"rF#HUr<N>V!SlH/gAV9V#Q<HV^&8rL
+@K;krS,Lt;g\oq+g&]s`J_R]hJ,~>
+^"WM@r7_,&rLj3Fr\4K0gY;MW"4PfMe,BUU#MIeag&9V,^VI\$r?;-orPndXrnIA)rNlPUr[n-(
+!8@D#!!`E-r7VM4g=i9qTqXG(2E(Qg!Sc<,gAQ!rEcH,>e'uptrWE3'rR_&&!Sc?-g\r/q)nWbp
+]D^1Y$2t8;gtUT;g=t?8_>_4M+T<McgtUW^gAQ6r1&`s,2Z4cs?hrFS#6*<WgY2Y]rW`E-rS%Fe
+]tM)W)uX1FRJrZRf)=>$g\oe+g=q24\CuH~>
+^"*/3rRCo!rRLk;r@@s#rRUkr"P1oGcd)Iks4%/$ec")!])fRVr>bderPAFNrmq#"rNZDQr[@`r
+rQbHFrW<hbe^`7%f@JTITV%l62)I/Bf%/IPeH"2!D$OrqDJd_Gd*MXjrR:bs!8%2#r>5LCs0hmO
+rWE6*fDX8&f@JNdrk/1L!nZ#Tr7:ggr@S"'!&XWq!+#S.qUPZ!r<3,P!SQ-)ec5dN!WCRP\$`WQ
+(B,-K>l^/hQMo53f)F4uf)=)!e^f<%\CH*~>
+[bLi9!Sc?,U'!,(0JEFZptGf!rmM)W#R:Xhg"P0ZgB$*FrkJIU"Wnl@g"P0Y`;gqX*ramkg\nM[
+/cI=#g&Tn+e,TaQ#l36RU]!.Ig\l0kEs'q@eC4C!"pET2g">'7rn@M.g"QEE!?AfP]`$=[$N:A2
+gA]h-gtVeD"!Jd1+o^3ng\lBt1B'$-2#oQ5+oPgEg\hBTg]#n7"pY>;gt^`@]tV1nr>bcFrL<c;
+s4[V/gY;__rRuhW[bH<~>
+^"WM@r7_2(!SZ6*T`Zu'0eiU]ptG\r#7(VA#MIb_g&B\+gV<a'ruhOg+kt`*g\o+l*r[8\g\fe(
+ZiDZV/cOK)gATJ##6"l'gARcE2Yl)*EW'n[e'uptrWEE-f@S[,g=uV\!o)G`rYtqX]`,PAdf9^R
+$NAfZg&]s^rP/LX+X/-0g\fe(GQ9Jt1B'032>nZr?hrFS#5m3SgC"5l#6rr;gtTKU]tF:_rF,Yn
+rRV#&!nl;]rnID)J_IQdJ,~>
+^"*/3rRD&%e^`7$rLNp=!%[uuqpb_ud/M>r!sA].e^N$trm_##rO`(L"WJH4e^i=M_#PAP)ZJ=c
+f_r)U.fLjpf)<np!r`9%f)*tuet2l6!&X[1r7:nu!7q*crGMY]!RT0k!!^p#e'ln!ec+,#e^j[8
+"LtnK\'P'!r<3,Mrmh,%f)<8]*<.&Tf)9^h/cII)1]8?p?2e(+f)O8$ecPgRr7M#"rrW3$s4.D+
+f!i)q[herZrE]AfrR(i"e^W."rmq%tJ^q3ZJ,~>
+ZJ5>O!&4C*rn@/%!7_"srXAo=gY2PZ!5nfQ$Q^<0*no<$g;h:T`r6qX*WFdjgAnPYZ2H6Qg&Tn+
+eG]pY&)-m7rM9BUq:kjirG_hermUiK!!N8Qr7h5)rYtnYrOi-Z!RhPX%K>&agY1?7gASnh+9!>\
+g&Tn+V>VqFdf.YogAfq+HMq+Ig]#t.g\hBUgAot,g&;0]#M[tfgY:N<g\oFrPlFM[:f%$H!8@;(
+!8<"YZeL!~>
+^"WM@ptG\>!&+=*rnI5%!7UqsrXJu=g=cAW!5e`Q$QgE3+5>N(gW7LXa8R(Z*raplg&SDWYQ-3Q
+/cOK)gATM"%06slqV(nCrB9u1rH%pV!7UqsrWE3'rR^u$rnIDm!$(sLrmLnr%K6k:gB?6`f\+sV
+_>kYV+9(!pgARiG.fdurdf8&&gtM^PrEK6Srn@G,r<E5S!87A*rW`]5g=b67g>(H:rQY;)s%WSj
+:AlsKg%sD&fn%k`g40~>
+^"*/3rRLhsrLEg:r7:bq!7q+pr<WMUeGRhsf)<;j)AsG3f%&@&_o0I0rYPVQrmq#"!3cC)!%Imq
+rRUqnrWrQ3qUGVtTDkMa48q8<f)O8#f)9OcD#M]Y!!^p#daQdtebn"s(^IOY[^XT.cHZ:nrm_/&
+e^W."rP&4KrRUq?r?qQgs4.5&f_p!o=oMM$ec=>$ec5dN"T?sQfDa;#!r`3+e^W1#e^W'uaSs<[
+O8hfQ91o.9q:,JpJ^q*WJ,~>
+ZJ5>O!&4C*rn@/%!7_"srseu<r7_>/gY9XF_?1i$*Zk:6"38F%a8I"WgA]h2gtT'<Yd#eZ/H4?'
+g\oV%%K6k5gB44HUndlP!8RM,"kq^QFEM^(E<+Mfe,BFL"T@!Ng]#n/*$$">rOi-Z!S%\Z%K>&]
+g\ok)_Z1eX*rajng\muI/-+,tdJhi&gj49lHMq(NgY1E:rS7>VrS%>+rn78T!!iDU#27hWcHje"
+rfm@WrA4N0J_R6[J,~>
+^"WM@ptG\>!&+=*rnI5%!7Uqsrsf&?%K+o^gY1Aurkeg[+<M^(gB5O;aN4<#rn@b5g"G*5YHP+5
+/H.7#gAot+df9gU%Je][U8+KXrB1/8r7V>-g2h=WF8^%Xe,Ikr"98Q&fD=2(gDq=U*<!MKdfIr-
+rXSq^!8@D)rPAOUrZD-o!8@CIr@7lqrmLc"s*4WiH2UqLg=b36rS.8TrRq8)rn@>V!!`AT#M[td
+c-=PYP5^[D:AlsKgO\(Zg40~>
+^"*/3rRLhsrLEg:r7:bq!7q+prs8`6$.f(*!nPoQrOr@P)]BXnecWh,_o)EirmhD.g=k<6Xg#"3
+.fLjpf)<np#lY,1f)*u$et/S/TKE-5!8%2##1_5SDf9T5rG2S^cHac7!!(LIdf.esf)OA+eef8A
+(q9LQrltMir<WDQ!7q,!rP&4KrRUq?r?qQgrmh8+GB\4S=oMJ.f%&@&f@JO)!r`?$fDsP&eboOL
+f)=,(e'cdgai__crf@"Mr@\0&J^pgOJ,~>
+ZJ5>O!&4C*rn@8(#27hdeC2mprXAi;q:bnerkeUT!87A*rQ"jVrn@;)rNQ>Sr[e'&!8IJ%r=8YX
+s.f[lV#<LQg\l6mE<+Pge,BFL"T@!Ng]#q+)uq#Y]E#SBe,U!X%K>&]g\ok*_Z@[trZ20rg=k<[
+V>i(M/M,>tdF/$J!8IHu"'f,:>Q*:Ygtgc@r<N;U!8@G*rWW?-q:kknrKR7VrA=Q/"5MVbg4A"_
+gOK~>
+^"WM@ptG\>!&+=*rnI>(#2._ae'umrrXJo;q:Yhcrkn[V!8@G,rQ+pXrn@G,rn.J/Yck77/H.7#
+gAot+e,9aOgAdoKUndlOq:bdgrG__brWE3'rR^o"!8IJn!$)!M!4r-X!"Jo;rn@G,rRq1e!Q,uX
+*s:<QgY2V%s!n7(/()ene,J)%gAQ:!>?kB9rRqA.gtUT^#6!6Ug&B_)#64u+g&g$_gAT:pPPn8T
+1]Q/2gY(<6J_I?^J,~>
+^"*/3rRLhsrLEg:r7:hs!n>cOrm(Sir<WJTqpb\trP&4K!7h)"rPSRNrmh)%rn7P.Y->.5.fLjp
+f)<qn#lrQReHONrTq\5Br]0o-s4%,#rGVXN"45?=ci!kBdf.esf)OA&f)6Ef\$i`QrQb?Irm_#"
+rRLn]!5JIN!8%5$rLj0<!@T>pblH&gec=A$G6:uM='#:Ns47>'f)kpSrR_,%rmgrK!7q,!!n5]N
+rQ5#!rC[#A"kM5TeCE'"eZdSS~>
+ZJ5>O!&4C*rn@;)!8RS.!7_"srXAi;q:bnerkeUTrS%4j!$2%Yrn@;)rNZ;Prn7A,rmUqsr=8YX
+rhKOjrBC&3rH/!X!7_"srW<-'rRh&&#2Ite*#fk<rOi*YrXJo;rn7M0g=k66rPJUWrZ;'m!8IIK
+#:qGX/CMnmdJhi"g\lHs>lEFUg].WZ#Q<BZg=b05rWW?-q:kknrKR7VrA=K-!8N.[YM4R~>
+^"WM@ptG\>!&+=*rnIA)!8IM,!7UqsrXJo;q:Yhcrkn[VrS.:l!$;+[rnIA)"L,)5YUf])rn@G,
+rmLkqr=/SVrhBIhrB9u1rH%pV#Lh2PdfT[T"9$jLg'6<cgDq7S*<!MJe,BdV%fY2cg=b03g&8bf
+*r[8\gAot+U^&D$.kB#pdaJ-L!8@Et!-nHHrS%5)!!iK-rRqA,g=k<\#64u(gAT:pPPn8T1]?#-
+gO\(^g40~>
+^"*/3rRLhsrLEg:r7:kt"4l#Qf)<qn#lrQReH"2!^ASrPf%&=%rPJ^T(Ddqff)4/'Y->.5.K1ao
+f)EtqcM\%Lf)*u$et8Y0U-&?7r7:nu!7q*erG;JZ"OR5N!!)uG%+`tZf%/I(eef2?(q9LQrQbBJ
+#RT)4e^i:$eCFN3r>PXcrLaBC-mpCebg"E3ec=A%G6)tlr`B'L"P;5Uf)u!TrR_5(e^`7L!W^gK
+eH"2!ao.;!9)UCCf)F2"eq)ATeUR~>
+ZJ5>O!&4C*rn@;)rS.D'rmUiT!"Jn]rS.Cjrk\XUrZ;$lrRV#^rXo.Q!6kDrrH&#kr[e'&!8IJ%
+r=8YXrM9BUq:kjirG_qhdaQ\E!!!&uO8[f8Vl$AhrYkhWrRq/!rXJo;rn@A+!SZ<,_uLnY*rajr
+gR+CrR/KGRg]#q,f`0Y'2#^_\?/>J7rnIAV"PhhhgtVh^rWNE/gY:N<rP\ZarS.:q!so5>$2rS/
+gTK:]~>
+^"WM@ptG\>!&+=*rnIA)rS.;#rXAi9rS%5)!5e`Q!$;+]rS.;'!#,>ErlbAcrRqBqEcQ4Pr[n-(
+!8@D#r=/SVrM0<Sq:bdgrG_ec!S#Ts!<%rVg&n4KVPjD5!#tmhrR:`T!"T"_rn7D+gASnh*r[8\
+gB?5sR$X0<6ibs?g],q-g=ZB\!&FOX!F4FYg]#q*"pE]9gtUQ^g\qB["kq\bgASqfe,A#!bQA+U
+#RLC^J_I9\J,~>
+^"*/3rRLhsrLEg:r7:ktrmh,%d/MAi#QWHTec+,"fDWD`)?(NVf%&=%rR1iY$k*UE`rO6[fE?28
+F)`]/./h`qci".Mf)*tuet;r8!'C0?r7:nu!7q*erG2S^cHjo:!<.f\MUp>.etSk4UAYl.eGdqq
+cMe(O$.dYWrmh,#f)<A^)ZA4hPE_8prBU>4s3q)"f)@B-1Kdd\=P3T(s4%/$!r`<*g"P05f`'J#
+!<^p'f%'c6!5JKYrRUqg"9\f0"P*M$J^ppRJ,~>
+ZJ5>O!&4C*rn@;)rS.D&rmUiT!"Jn]rS.CjrkeUT"5;G^gATY%&cTrRbl-;pF9!ol/H4?'g\oY#%
+f+lXV#<LQg\l6mEW+Al!<<*#O,oB`rn@S0W2HSlr>bgi!8@D$r=8\Y!8ROk!$D1]rn7A,rL!OP!
+8IM,"5);Yg&3c+>lEIVg\hBUg]6+.gAV6U#6!<U_uRdTeGe2&gAT:p$2rS/gTK:]~>
+ZJ,8M!&+=*rnIA)rS%>$rm^oV!"Ah[rS%=hrkn[V"5DPag\oe(&c`OBbPg/nEr[cj/HFQ)gATM!%
+Je`VU]!@OgAQ*kE;e8a!<8&[O,j4n"PK]MVl'D3rn%5(rR:]SqUtr(rPJUVrZD-o!8@C<rBpY>r
+n@P.g=Y'V1]:PVg\ok)#6!9VgA]k+"oni*gA\ti`;S0ag&Th)bl%hGfn%k[g40~>
+\(1E-rLEg:r7:nu"P22Uf%9lHr<NDSrmh#!!8%1`r>GdheCE.Ke,BdV&,jWKf_odi.fLgrf)F>#
+d/XRR#lrQReH+6nrh0<Rr]0o-s4%,#rGM[Prb_hccd1#;!<7oWMi.Mb"kTTHV5,".(B`19e("BB
+!71TMqUPYurP/:LrRUq2rBU>4"4YlMf)7<'=oMM$f*'[Te^ag$"T@!Rf`'J#!<C^Mec*8__#;UY
+ec=8!aSc5Aec+'LeZRGQ~>
+ZJ5>O!&4C*rn@;)rS.D&rmUiT!"Jn]rS.CjrkeUTrS%5%r=T"OrS.9m!&"7%rn7A,rRCcUq:kkD
+rBC&3rH/!XrR:oM!!*-!O8[i3Vu7V6g&9G!%f+lX_uLnY*rajng\mN<70)*AgA]_)g&3c+>lEIV
+g\hBUg]6+.g&hH]"U=q[rP\Zarn@G,rQY9IrRuhWY1nI~>
+ZJ,8M!&+=*rnIA)rS%>$rm^oV!"Ah[rS%=hrkn[VrS.;'rXo2CrlY;arS%3kr@J$(rn@>"r=/SV
+rM0<Sq:bdgrG__arr<'#!<%rVgARoI)u\Ffe,9aOgASnh*r[8\gAot+Qi0;PgA]k+f`9\'1]:PV
+g\ok)#6!9VgA]h/"U5/7rS%4frR:c"!87=pr<WATJ_I9\J,~>
+\(1E-rLEg:r7:nu"P22Uf%9lHr<NDSrmh#!!8%1`r>Gdhe^`7Le,BdV&,sZNaSjciE<%Ng-ihit
+f_s1t$iUG4f)*tuet;r8!'C0?r7:nu!7q*e!,VXP#gpuEd/X.I!0$o7rmh)%rM0E2rYGRarmUkl
+!71TMq:>MZr>PXcrKI1FrRUtt!7q*'!*T;&rRV2'e^`4PrWN2Q!8.;%!!*!!!7q/"rk8BIrQkJo
+!7h%hr<*,NrmZMLY18%~>
+ZJ5>O!&4C*rn@;)rS.D&rmUiT!"Jn]rS.CjrkeUTrS%5%rXf;FbKS/RgA]k*F9aBK/1]E-g=uVV
+!7h#Xq:kkDrBC&3rH/!X"4YfLeGTFHO8[i3VZ7\8*<"RheGTmQg\o%j+9!>\g&Tn+R/]SS70)*A
+g&osZf\69\!*fG-rS7A+r<N;V!8IM,rWN9+rn@G.rPS]drm^o$rQY9Ir7Z_VYM4R~>
+ZJ,8M!&+=*rnIA)rS%>$rm^oV!"Ah[rS%=hrkn[VrS.;'rXoAHbg"ATg&B_(EsF6J/M,W1gY2YU
+!7^rVq:beBrB9u1rH%pV"4P]Ie,9:FNr@]1V>qP6)u\Ffe,9aOgASnh*r[8\gAot+QiBGQ6ibs?
+gAon*g&3],>5hb)g\ok)#6!9VgA]k+"oni+g&Tn+_Z83ce,A#!bl%hFfn%k\g40~>
+\(1E-rLEg:r7:nu"P22Uf%9lHr<NDSrmh#!!8%1`r>G[ermh"r!7UoV#Rnbpa2urcf[g">r[7dp
+ec+/!cN)>j#lrQReH"2!TD^bMf)*ttf)9OcC]i#/cdD[k!0$o7rRUqA!#GPM!7_"srltbp#n%+I
+f%&=Kf)<A^)ZA7cPQ*lI5lK:5df@qs0*#&P=8peOf)F2"f)>^O"PNe+rRLrLrW)rJ!7q.`!Pd"\
+ci)GnaSc5Aec"!KeZ[MR~>
+ZJ5>O!&4C*rn@;)!8RS.!7UqqrXAi;q:bnerkeUTqq;)*gAZ[,K./2t.fE!<?iqu3/M-nT!8IJ&
+r=8YXrM9HVs$$85rH/'Z!cW2/rm^lVrF,j[.kE7M,lahIWi=b-gtVeWr=8YXrPJUWrZ;'m!8IJ'
+rC-lQ4Zu".8H;B];>jbug\ok)#Q3?UgAV9V#Q<EUSGai8.01nIr?h]%LPCP7gT'"Y~>
+ZJ,8M!&+=*rnIA)!8IM,!7LkqrXJo;q:Yhcrkn[VqqD/,g\ug.KISE#.K)j:?NVi2/hR(W!8@D$
+r=/SVrM0BTs#p23rH&!X!cN),rmUfTrF#dY.P!%J,QF\GWMnP)gY2VTr=/SVrPAOUrZD-o!8@D%
+rC$fO5!D418cVH];#OVsgAT_'#5m3Sg\qEX#6!9SS,F]6-ikbFr?_W#L4t>4g8`kW~>
+\(1E-rLEg:r7:nu"P22Te^j]Er<WJTqpb\trP&4K!7q(us470u"Fh^C,q&[^!(Hijs!Rms./h`q
+d/=7Nf)*ttf);6@3<(u=f)*ttf)9OeC^"TkcHjhar<iU4r`oUR-7:2>+9/,?V52\mf%'cF#L<\a
+$OPD7ebn"s^ASuKf)="p62ikI3^lG)7K#pY=8pbNec+%uec#UN"PES%!!<-#rRLn5!13X.s!.Uk
+,lJniJV&H(eq)APeUR~>
+ZJ5>O!&4C*rn@;)!8RS.!7UqqrXAi;q:bnerkeUTrRq8)rn7I+JV&LP.K)m;?iVeX/H4?'g]#_'
+f)6*Sg\mrH4o*k2FT$4Ze,e%Jr=8d8r@Ipn!%%TCrS.;#r=8YXrPJUWrZ;'m"P_MZf%0gi!C]3O
+4Te8H8P8qYrET<UrS%2Tr7h5)rWW?-rS.:@r?hRnr[IdnrIt=-J_R6[J,~>
+ZJ,8M!&+=*rnIA)!8IM,!7LkqrXJo;q:Yhcrkn[VrS%>+rn@O-JqJ^T.KCmq8c;ur/H.7#gAot,
+e,\%t%Je`VU]!=NgAQ*kE<"AfdaS.(rF,XTrZ_CgrM]\KrR:]Sq:bea!$;+]rn@S0e^i:$r^?iU
+4oRVI8kDWHrD<GsrS%5'r<E2RrnIDW!!`DUrL<a4!%7aor?hJs!8E(YX4i(~>
+\(1E-rLEg:q:5Ptrmq%nr<WJTqpb\trP&4K!7q/"#h7DTep`$rIO4t=rC-Zhr@%Wqrm1Ymr<WJT
+qpb\trLa$J!7q%t!7q*erG;M[!RB$i$2n0.-iP1f+T8)9f)F5!c2c2h$3&NSeH"2!^ASuKecX=J
+dF%qZ!'pKC"%>UH7K#pY<rghNec+%ueboRFec5dN!WCRJQ2m9M+oike,lJqcJH4;QeZ75N~>
+ZJ5>O!&4C*rn@;)!8RS."4YfJdf'[U&,Fr[_u@OO*r4OgJe'=[.4Rq_8kNK!?XPH:/M-nT!Sc3)
+ebp!Rg\moM4Zkkjq:kjirGhkfs4$uWrF,jZ/M&IO,QOkDWVtTMeGTmQg\o"i+9!>\g&Tn+f)8&<
+55m_E8H;B];>jbug\ok)#Q3?UgAV9V#Q<BZS"-%>r?qOmr?qPuJ_R3ZJ,~>
+ZJ,8M!&+=*rnIA)!8IM,"4PcKe,9dPg&T"h_u1\Qg\la8.k3"t8P2QG?XI,H/1iJ+rn@J-ec+(s%
+Je`VUB<V?4?WGnrH%pVs4%(tr=/^6""GiP/,^[mWW&jpgATM!%Je`V_>kYV+9(!pgATS#70#LM5
+5n.S8c;Ka>Q*:Sg&2-QgA]k+#64u,g&me5S=BI(r@%UkrIogVWnMt~>
+\(1E-rLEg:q:5Ptrmq+qs3CTM!=IETeH"2!^ASrMf)*ttf):%.-6si_77K^7>?b98-n$MmrRLtr
+rm:TM!7q%t!7q+@"?8>"37duW!7q*erG;M\s3LWMrETLP-mpD@*rr/:U]B!Fec*hoci"1Lf)=,!
+f)<>])ZA7cdJZB03W2DF9`8#mf)F5!e,\%t!r:CI!r`6!eH;)&Q^@Xpr?V=crIFt"J^pgOJ,~>
+ZJ,VWU7n870.npWgA'D&e,Iep%0-n;gF1k3g=k<!_SX54*ZZ<WgY1E:g=k;6JqAV)-n-W<8P)N^
+?XR7n/M&LPg\o\$%fY2_h#6"+V#<IPg\u9tF)c2=EW+Dc%fKl8/H$goWrAt"gY1E:rR:oZ%1WmH
+gAot,g]#(j`;LeVg],h*f@Bghr]U<FrC[&d"B&N1>[.0]rn7M0#6kD;q:blRrWiDVrL<s:-RU8>
+.17LM-ROV'Kn\=:g>%86Y1nI~>
+_:nqDo\'PBTqJ&30J>-Zg\BJ&df._p%KHt;g'-6bgY:H!rkffu+!)HWgtUQ:gY:G6K7eb).4Qc<
+8kMZ^?=.%j/1W:MgATP"%K>&]g\ok)U]!=NgAZ-rEc>u9E;e8a%K0`6/,^[mWW&gug=b36rR1iX
+$k3[Eg&Th*gA\qh_u1YTgAf\(f$sXer]L6DrCQub"ArE.>?_!Zrn.G."pG27q:YfPrW`>T#Fh6R
+RjBC.-2f5"-7'ubL4t;6gY1?8J_I9\J,~>
+_:AS7s4.)!rRLr!#hY]=S=D)[.P(;Fs4@>&rQYBLrWrMR!7q,!rk/NM(`=/-f%0`Krd>Z5,pOZ]
+779O4>?P-6-mp>if%&=%d*L%b$2t50eH"2!ebu*<2u2#'D@p`$CMI\3cHa`B#RC`B>[1P^r[.Rb
+!2TUh"4boOec*i"cNsg^$.dYWf)F27f"Si2^D[t-)V3Hhf$Vjlcp9o^5rnp($UmHO78-?I9itFs
+<W1JIe-4A'!!*)MrRUtu!!*!!rRD%:Pa%IVrZMdt,9nHX+<_n[J:E("e^W0$eZRGQ~>
+cJ/<Qo%O/uq:bo)rn@G.qqCf!rn7G.g"Q>Xs4[M-s4[M-s4[M-s4[M-s4[M-s4[G+"5V_bg@s>%
+h"ob*gA0J'gABV)g?dPog@<ntg?%&kg=b36rS%>-leDBlrn@G,ptGf&q:bo)J_QIEJ,~>
+cJ&6OptGc&rRq8)q:Yi'rn@5'pY,W$!o2MaqqD))s4[M-s4[M-s4[M-s4[M-s4[M-s4[J-s4RJ-
+pY#W%qUtr&q:Yi%qq;&'m+MHmn_*urjk9gif\+sVg&TmngAT_(g&Th$g&Th%g'$0ag=tA5g6pZF~>
+cIMmEpsoDns4./#!S,d#ec+,#f\-8T!8$Yi!S>i^ec"&,f[eR&f%/C%f%/C%rmh>)f%/C%f%/@H
+eH"+reH"+gec45"eHjaVe^i=%e^i=JeH"+nec45#ec45#ec45#ec45#ec42$eC4BHrmh_4f%/C%
+f%/C%f%/C%f%/C%f%0iNrRChs!7^qsrRLtuq:,W!e^`-trRLr!s4./#s4./#J^p[KJ,~>
+cJ/<Qo\0B"o\0E#g\]_#gB$$_qV(Jo!8RD)!nuD`rS7A+!8RA(!8RD)!8@5&!8@5&!8@>)!8@"u
+!8@5&!o2Pakh?*jrn@A+"5MYcgA0J'h#5t-h"oe(g?.,igAK\*g@s>%gk"4\gOK~>
+cJ&6Oo\';uo\'Q'g=tB9g=tBXg&]m\qqD,(n_*utq:Yo'g=lM[rRq8+pt>`&q:Yi%pt>`$pt>`$
+qq;&'o%F)spt>f(g=b]D!8.;(rn7J/g=k6Ug&Tn+g&Tn(gAT^ggAfn-g&0P(g%X2#gO\(Zg40~>
+cIMmEp=92o!7gttrn.2#!7h)"s4IA&s4I5"!7gqs!7^Ph!7ptr!n>cNrRUqt!7pqq!7ptr!7^eo
+!7^eo!7^nr!7^Si!7^eo!nPoOkg][^rm^qt"4l#QeG7Vpf)=,!f)!qqeEGH_df@nsec42&eCE.$
+qUGSsJ^pgOJ,~>
+cJ/<Qp"KK%n_<rpqqD,+rnI>(o@j9#p=fZ&gY;\^iS+@fr7_5*o%O/uo@j9#nCmrsrn@G.r7_5,
+qqD2*g=lDX!8RP-!8?tts4RS.g=k?UgAot*gB$$`rS%>-qV)&+g4A"PgOK~>
+cJ&6Op"BE#n_4#trn7A,qq;&)rn@8(o@a3!p=]T$g=lM[iS":dr7V/(o%F)so@a3!nCdlqrn7A,
+r7V/*qq;,(g"H5U!8IJ+!86nrs4IM,g"G-Rg&Th(g&]m]rRq;-g\]\*gY%/3U"Y"~>
+cIMmEp=02pfDF.sf_X1ufE0XVf_sA$fD*qgeH"1oeH47Nec"(XeH"1ueH"+ieH"+jeH"1ieH"+u
+eH"1ueH"1teH44LeG@\qf)=,!eFD)he-"1LeCO?D!7^qs!S#^!eH+1KrRLnu!n>fPJ^pOGJ,~>
+cJ/<Qq:c#*gtUQ\g],t2gYCN:gY;\\"52D_g\]_)g\0A#gAot%gAot"gB66egt_n`"5MYch##h+
+gA'D&gA]h,g?RDmh##h+gATe+g&Tq*gAp$kgAot,gB60_g"Q8V!8@D+!8R2#rRq;,h#5t-h#,n,
+h"BD%h"08#h#,n,g4A"\gOK~>
+cJ&6Oq:Yr(gY1?Vg&Tn'g&fs]g%X4qgAoq*g&Tn&g&Th#gAfn1g=tH=g]#n/gY1B9qq;&'pt>`$
+rn7A*lIl6mqq;&'rS%;)!8ID)!8HYi!87A*"52>Zg%j>%g&9V)g[j.tf`Bg]rRq8+r7V/*q:bf%
+!SlH%g&Tn*g&TfWg9'(Z~>
+cIMmEq:,Ssf%&:Lec45"fDsV#fE0[Wg@s8!f)*tteGdu!daS!A!7^bns3h,$f%&:$rm_,%e^`7J
+eH"+oeH"+ueH"+aeH"1teH"+tec4,!f)*ttf&kK_eGdu#eC2mrq:,JprRCo!o@<fh!S,d"eH"1u
+eH"1rec!qteC4'?!7q(u!7ZSMXjqq~>
+ceAHRp"TH!rS%SY!!!$#!!!$#rW)ourrW3$r;ciurW)lMs4[P/q:kl'qqD,+qV)#(r7_5*mb@]q
+n_=#rrS.;+s4[P/ptPc&kh?*kp=fT&^YAeDs4dM+J_R'VJ,~>
+ce8BPp"KAtrS$oErW3$!rrMlpr7h8,!8IM,s4dP,rS.5'!8ID)!8IM,s4[S.g$[Smg[X"rg&9Y'
+g],t-g\BM$gZ[>kg%O,"gWJ7Ig\fe*g]-"+fn%kSg40~>
+cd`$Fp!s#jrm_#"nc8[jp&G*DrRLnurmh%trmgtuqpb\tqpbr#dacmse()t9ec"(hec""rec")!
+eH"1qec"(_eH"+meH"1Cebdhnec45#ec"!KeY^lI~>
+`S1UPgY:H8g=cGZ!s&B%!Vl]s!<<,u!VcZng&p*`gYDVZrS.J/h;.YV!8?kq"kq_dgYCTVgB-0b
+g\ok)g\oq#gBHBggt^Z<rS%>-eCt/^gY:N<h"ob,g=tECgAot&gBH<cg=k<8J_R-XJ,~>
+`S(ONg=k64g"?8WrVup!q#CHs!Wr<$p]19I"5MYdg]#q,g]#q*g[s4tg[3\ug"P37gY;AS!o)G_
+rRq/'rS.#!"l%hegY1?Zg&TmWg'-6bg=t?9qUu#(g=tiFr7gu""khV_g"P,1g8N_U~>
+`RP1De^`0ueC4EI!7q,L!!2lqq>p?k#M.GUe'uq!f)F5"e,Inrf(@Mjdf@haeHOIQf%&@&o[O#o
+e^aWJrRLktp!j5sf@JO'eG[ntf$r4Rf%&=%e^jTI!n>cOkgfU[!7LYm"k;)PeCE'"eYq#K~>
+`S1ILgY;\\rS%;Qqu?]tqu?d!!!)otqZ$p'!8?2]g>(E:h"f_'g]H6dh>>q,h"ob*g@X/"g]?0b
+r7_>/gYCT\gD&GtgYCQ<gtUT;gY(<8gtUT=h;$fYg\oq-gAot,gAp%.gB?6bgY1BXgAp$ugAp%%
+gAp%!gAot*gB66cgYCoFrS%;+!8<"YWS;q~>
+`S(CJg=lMYrS%,K!!2ut!W`?(quQZp#lt%\gtUT>gYCQ_gAfq,gATe$g&Tn,gATb,g=u;Ss4[S.
+g\fb-gY1E:qUuY<g=k<8g=t?8g"P*3g=t?8gYCQ<p"KB!s4RJ+rn7A,rn7M.g=k65qUtr(nCdls
+p"BE#n_*urr7V8-g=k<RgABY"gAT_)g&TfWg8WeV~>
+`RP%@e^aWJrm_#"qZ$TsquHNnq#LHG"kD)Pe^i=Nec4+tec"(oeH"2"ec!qtdaRm>s4.5$f)4&#
+f%&@&qUH;2e^`7$e^i:$eCE$te^i:$f%8L(p!s#ls4%,!rm_#"rm_/$e^`1!qUGSsnC7Nip!j&n
+n^RWhr7(o#e^`7Cebdhjec""teH"*MeZ%)L~>
+_:o%Fg"QDZ#QXo*!<E0#!<N-!q>pQqquI)Xg=k<;gY:N=rS./'g"ZJ\p"T;rq:tf#q:qCmq:^DS
+VqZ_~>
+_:etDf\-5W!WW6%pAk$jq#CNNgY:H]h#H.-gA0LrgABXjgATe!gA0Ftg\KS!gSNX(g]-"-g\]_#
+fn%kTg40~>
+_:8b>e(*%"e^ig^!7q/"!8%2#rRL_pp!rrgldbsbp!rlfq:>Alq:;Cms3q"us3pkqq:'uGVq$:~>
+\_I/<s4dS-s4d/!qqM/)s4dS-J_Pb1J_ST,J,~>
+\_@)<s4[M-s4[)!qqD))s4[M-kM#gfJ_K#8s4dS-s4`+YRG*/~>
+^X`A8s4./#!7g5_iRRhSJ^rZ.s3q"us3lPLRFQf~>
+]A!>@o\98sJ_Pb1J_S#qJ,~>
+]@m8>o\02sf@p,VJ_G\/J_KYJJ,~>
+]@?r5ec+.@ebdgHeUc8%ea_1?~>
+]\<G?o@s/rp=f]'gtUQ*gAorYgO\+8gOK~>
+]\3A=o@j)rp=]W%gY1?CgABXjg&TfWg4@t6g40~>
+][[#3ime.\f%&:4ebdh]eH"*MeUc8,eUR~>
+^tSkCq:kr*q:kf#q:kr*rn@G,J_Pb1J_SN*J,~>
+^tJqEg=k<9o@j)ro\';ujkBUdJ_G\/J_KYJJ,~>
+^srS;e^`-ti7.hWjjj7WJ^o>%J^s;@J,~>
+\(^o=ptP]"q:kr*J_Pb1J_SB&J,~>
+^"WM@s4[M-pY,N!f@p,VJ_G\/J_KYJJ,~>
+^"*/3s4..ua4:(9J^o>%J^s;@J,~>
+[+bT7qqM#%rS.A+J_Pb1J_S6"J,~>
+^"WA<rn7A,qqCr%rS%;+h:hb\rS%;+J_KYJs4dS-s4`+YNS8m~>
+^"*#/a4:(9rRLqsJ^s;@s3q"us3lPLNR`O~>
+[G1`8qqM#%rS.A+rS%>+J_Pb1J_SE'J,~>
+^"WA<s4[M-qqCr%rS%;+rRq8)inF:arS%;+J_KYJs4dS-s4`+YNS8m~>
+^"*#/kLBR^immqTrRLqsJ^s;@s3q"us3lPLNR`O~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_KqRs4`+YJ_G\/n_/K~>
+J^sSHs3lPLJ^o>%n^W-~>
+J_Pb1J_Pb1kM(L~>
+J_KqRs4`+YJ_G\/n_/K~>
+J^sSHs3lPLJ^o>%n^W-~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+S(7PiJ^o>%J^r)sJ,~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+S(7PiJ^o>%J^r)sJ,~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^sGDs42bOJ^o>%p!nQ~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^sGDs42bOJ^o>%p!nQ~>
+b1cpMqqM)*n_43%g=tB9pY,]'r7_5*hV/%aJ_Pb1J_TeNJ,~>
+b1ZjKkLp'ng"P05pY#W%r7V/(hV%t_J_G\/J_K_LJ,~>
+b1-LAldc$ds4%8'eCE+!pXK8prRCo!h:2MTJ^o>%J^sABJ,~>
+cJ/<QqV1u)ptP`SrPnB^r<N;TrS%>-mb@]o"*8L(F+N(sgO\,MgOK~>
+cJ&6OmFqLFrPe<\r<E5RrRq8+mb7Wm"*/C%Ee2qqg4@uKg40~>
+cIMmEmFD1=!<p==_"#tS!<E8Prm^ns!7pSgrR:pdCi+$?eUc8%eah7@~>
+cJ/<Qr7h&'qV1rUrl+rYn_=!IrS$Pkr7_*jJ_Pb1J_TbMJ,~>
+cJ&6OmFqLFrl"lWn_3pGrRpJir7V$hJ_G\/J_K\KJ,~>
+cIMmEmaV<gr<<2:!Q*FZeH"2!!r^XLf&kN]D?/7=eUc8%eaq=A~>
+cJ/<Qr7h&'qV1uV"UW2f`l?a*gBQHfgBRrh#Q<B@g\ok)F+N(sgO\,MgOK~>
+cJ&6OmFqOG"UN)c`PpO'g'6<cg'.`d#6!6>gAT_'Ee2qqg4@uKg40~>
+cIMmEmaV<grWNE-_8*n'o[O/se^ad'!s8GO!7pJd!7q,!rGDVdJ^o>%J^sABJ,~>
+cJ/<Qr7h&'qV1rUrl+rYo\0H&gY;Z3rS$MjrRq?pFE;MSgO\+1g[a*L~>
+cJ&6OmFqLFrl"lWo\'B$g=lK0rRpGhrRh9nF)l;Pg4@t/g@EsJ~>
+ldbsbkgfX_maV<grWNE0_nj1+rmpho!nZ#Sr;urJ!7pJd!7q,!"E&3uDUsBhJ^o>%o@8?~>
+rnID,dG+WR!8RS1!8RP/qqD,)rX&c9`lH*=rS7A+rS7G-!SlH.Xl\=9f_l0Ugk"42gO\,QgOK~>
+rn@>*dG"QPrS%>*pY#W#rWr]7`Q#m9rS.;)rS.A+!Sc?,XQA17fDQ$SgO\(0g4@uOg40~>
+rmgtuo%!]ijOO4YrRLtup=9-G":2o^_86-&!7q,!rRM)$f%8LOW;P64eH"2!df]gZ#6i`Yeq)A&
+eUc9EeUR~>
+rnIJ.!SuPYgB?6`g=k?]h>l@0h>5n)$NA$F`VnTjg]-%0h;%t`rN529rRh&UrS2tYJ_Pb1p=k)~>
+rn@D,!SlGWg&p$\g"H>Y!87)"r<`JB!6"ijrS%;+!SlH.gAS,7gATY%$2rV0g4@t/g@j6N~>
+rmh&"!S>otea_5UeH==MeC=HJ!7^bn!S.GR#QDUA_V+q?!7q/"s4.5&f)F2"f);QFf'Cidf)=(r
+"o[$Qeq)A&eUc9FeUR~>
+rnID,dG+WR!8RS1!8RP/qV1rUrPnfkrS.;+rS%=RriPA<!SZ<,f_l0Ugk"42gO\,QgOK~>
+rn@>*dG"QPrS%>*p=fHOrPe`irS%5)rRq7PriG;:!SQ3*fDQ$SgO\(0g4@uOg40~>
+rmgtupsnoclIGj_rRLtupXK;q"o\c*_Z8Bhf)XD$ec"(ueH+7!ri#bGm*u-df)=(r"o[$Qeq)A&
+eUc9FeUR~>
+q:tVs$JO:ig=k<9gtUW<r7_5*nD!oqrS7)#r<`YHa2Z0th#?(,h#5t0XfSV+rn@/%!8R/"!8.;&
+rWrQ3rS2tYJ_Pb1p=k)~>
+q:kSr$f'Lkg=tB9g=t?9g&0P(g$m_og&9[ugAM<[`Q#m:r7h5)rS.;)"0AW,Y5[2Ng&Tmug&Tb(
+f_u3X$2rV0g4@t/g@j6N~>
+q:>Srqptets4.P/f%J^,f%AX,f%9oOs4.5$eF;#eeG[tpec"&!f_l$X_o0I2g&9P%ec"(ueH"2"
+VuWglf)O8,f%8I&f%/C%f%0`K!7q+t!sJf1"o['Peq)A&eUc9HeUR~>
+o%X,T">hnk2%'<hrA=Sfrk&-`rS%5)!8RD)!SuQ#g\hKX`qnEigATb+gA]h,#Q=r,g&Tn+dJlK5
+5XG>n"",EC-iIBMgAkmcB)Vl4"T:@]7fGo/gO\+1g\TZT~>
+o%O&R#;\1o1^OKr#lQR[]DfD?gAT_'g&Tn'g&^!`nCmgIrPeWe!87>)!87A*!!`E-rn@G,rQtR0
+!C&jJ+p0/<-78[srRq6`rb)35!!E0[!(HlVJ_G\/J_KtSJ,~>
+pXT2m%(<RO[P'9f1'[sd"u?03"LkhI[atH.rRCer!7ptr!S>oqec"&!f_l'R_Z8?ff)O8#eG[o"
+eCE+#r;urKrQG[44$#JF*??1F+<_q3r`K0M!7q*Xr;cdR"$o7?6%RR;eUc9IeUR~>
+q:bo)qqD@g]=Y^51Ggrf#lk>22>t,eh#?(,gA'D)g=tE=rS6tur<iMCr7_5,r7_D1gY:H;#Q=r,
+g&Tn+dJZB0,Q0"g?3&d[gAkmcAci,:!sJQ`rC;FnJ_Pb1qV-N~>
+q:Yi'qq;:e]"5L11Ggre$2l^Z\cCLagAT_"g&p$^gYDb^o%O$KrPe]g!8IG*"l%bbg"Q`1#QEHX
+gATCs5lDo*-N.3Mg]#q*Aci/<"9\T_rC2@lJ_G\/qV$H~>
+q:,Msebmu'\$i`U1,1O>r<N9VrO)^XrmgtspsfJre^i@Nf([_nec=A$#Q;O?f_j=ueHFIRe^W4L
+!r^^Kbl'[&*rR;]=Td:,f%Bq3r;cdRrB^M8J^o>%J^sYJJ,~>
+q:c#,gY:N_gAnnc])X_f2#[d]$N2j\]D^L_g@j8%gthqao%X*MrPnH`!nuB6rW`AU!8IM#!7:[1
+r?M7gra#S3rS%<brau-3!!N6]rC?kA!8N.[J_Pb1rnDr~>
+q:Yr*g=k<\g&Sba])=Ja$2l^Z])C@]g%O,#gYDb^o%O$KrPeB^!nl93rWiGW!8@G!!71U/r?D1e
+r`oM1rS%3^!s8Z/"8t7Y7fM*AgO\(0g4@uWg40~>
+q:,Sue^i@OecWCi[^c8kr<N9V!4`$:!7q/"rRCPk!S5m$f([_nec=A$#Q;O?f_sCreH+1Nr;urK
+rlbAcrB1$"r?D5D!*]BQ!8.6\!!3'!rAFO?"4l#Qeq)A&eUc9MeUR~>
+o%X/U"MHZL1Go(;":@"C1c>6DrS.;)p"TH#n_=!LrPnB^!!iK-rn7A-rR(U1!CA"0,6K>A-RSdu
+rS%<brau-3!!N6]rC;FnJ_Pb1qV-N~>
+o%O)S"M$?G2)P:=!=1L\2#Y#agAT^tgATdrgAM?V`UVX^#6"l+g\oLu5QO.orZVFl-71&;?2`LU
+Aci,<"9\T_rC2@lJ_G\/qV$H~>
+pXT2mrjDg:r\=X6#mU\A2#]61\Gio:f)F4ueFhAjf(RYmec=A$#Q;O?f_sCqeH"2!!rgaNfDWqm
+497ScrZ2.d+sJ3/=oQtPf_o=\!WE)t2$6056pgn(J^o>%J^s_LJ,~>
+o%O:(2)R;nqZ-Wsrr<$"rAE9_r<iMCq:kl'rS%;XrW`PYg=k<[P5S,XgtUT=rS.:s!8RS.!8.;&
+!sf2>$MrKWgk"42gO\,UgOK~>
+o%F:(1c-ug!!2iprA<3]r<`GAq:bf%rRq5VrWiV[gY:H\Oo7uVgY1B9rS%4q!8IM,rRV,W$47+9
+g&TlYg4@t/gA9NR~>
+pXT2m""u>^1A(YI1B0'.f&5*Wec=A$#Q;O?f_sD#ec"(ueH"2!!s$mNf):U,8H[Sqf%9lOrQ55o
+f%/LPeGogQ"oQsOfDsP&eq)A&eUc9LeUR~>
+ptGl(gY2Y]rA=QUpAb<s2)[9Kg"ZH4rPnZfrS7A+!!rQ/rn7A,rK@.T!)<:DrQkGs!87A'rs8]3
+$3&ZZgk"42gO\,QgOK~>
+pt>f&g=cJZrA=0I"#Mkk1tgU]$2qj=gATe)g&MBW#l`QYgAR059`Rl_gAT=qg&Te)f)l<d#mgOa
+!8E(YJ_G\/p=b#~>
+psfGqf%'cNr\+=-o`,(L1GLZ_f&P<Zec=A$#Q;O?f_sD#ec"(ueH"2!"9$gLNW)KL8GUj8b5Trm
+f[g&P!s\u4"THsPfDO3NeUc8%ebdmI~>
+o%X+#rrMlp!!3$UrS%>+mFqWro@s3NrPnZfrS7A+!!rQ/rn7M1P*;&lrD*1CrQkMu!nuG^rn%,U
+!"/PV"5MYcg4A"0gO\,YgOK~>
+o%O%!!<</p!!"hS2#Z,.g$RJng[j.t$2qj=gATe)g&MBW#lWK[OckihrD!+ArQbGs!SQ6+f)l<d
+$46O^"5DP`fn%k.g4@uWg40~>
+pXT2mr\+C/!!2fo!&X[1!8.;%m*u*epso>o!8.5TrPJWfrRUturRUtu!7q)Nrmh5(NK0!XrCQh9
+rQ>/k!S,m%eGojR"o6^Of@AF$J^o>%J^sbMJ,~>
+o%O.&r\XZVqu?]tquH^Q!&`Har<iMCq:kl'rS%D[#7(P5g'$/nP*;(-:ANZCcNN"XgY:B[fDZ'V
+$A$r_gO\,MgOK~>
+o%F($r\XKP!!2utrA<3]r<`GAq:bf%rRq>Y#RLb8gB?5mOckk*:&3NAc32kUg=k0Xf_u3X$%^f]
+g4@uKg40~>
+pXT2m"#2J`1A_%O!W2ot2#]61f_sC]ec"&!f_l'R_Z8?ff)F4uf)F2&ecQ!W!r^^MN<,'!rCQh9
+rQ>/k!S,d"e,9IJeq)A&eUc9FeUR~>
+o%O9T$k*LErW)ltr;Zg(rX/VZh:ql8rPnQc!8RP-!!iK-"5DPah#4te*!I9$@U`hVrL3]:rS%>)
+rn%,U!"+;3J_Pb1o%SZ~>
+o%F0Q$O[=?!;urs!!<N7$46[ch:hf6rPeKa!8IJ+!!`E-"5MYdg\nhc)[.-!@:<VRrL*W8rRq8'
+rn.2W!""51J_G\/o%JT~>
+pXT2m!sSu8#lOc%!W<!$#m^eAg&BS'f&P<Zec=A$#Q;O?f_sCueH"2"eH"2!!X%'*f@Tu3rtbhS
+(L:<Q?2^&edKA(Ne^j]Jr<<,MJ^o>%J^sMFJ,~>
+o%X*O!!3'!r;lisrX&W5rS65`r<iMCn_4-N"U,,0gAp%-^AT&M@f;bqf)aISrS%>)rn%,U!"+;3
+J_Pb1o%SZ~>
+o%O$Mr;ccsr;cd'rS-/^r<`GAn_3sH!!iMY!8IIcr>Y]DrL*]:!S,d"g&Tb(f_u3X$2`EVgO\(0
+g4@uRg40~>
+pXT2mrW`E0r;ccsr;Zg)rWiMWrmq/$j44+Z!8.5TrPJWfrRU_n"P*VT!<W5OrOMkCrE]Aes3^qq
+df%bqe,BLO#MB"+!S,YMeUc8%ebRaG~>
+ptGf(r7h/Y!!3'!r;lis!"8c5rS65`r<iMCn_4$KrWWJZgtUW_^AT&N@K9p:RKM0mf@TuU!8.;&
+rWrQ3J_Pb1J_TbMJ,~>
+pt>`&r7_)Wr;ccsr;Zp-$47+<gYLT^$2qj5g&M?V#6Wc;gtVe@r>Y`E!+Pnp"4l#Rf)=;&fDaG%
+$31D0g&TlYg4@t/gA0HQ~>
+pso8mrW`E0r;ccsr;Zs.#RC[grmq/$j44+Z!8.5TrPJWfrRU_n!7q)M"4u2WfDW8Y(]I\??N$,k
+da?LkrRUqrrWN9,rRV#!!7QMLJ^o>%q:0u~>
+ptGf&r7_2ZrX8c-rW)s!!<<0!!!<Q7$4Hgfq:bo)k1fhArPnB^!!iK-"5DVch#4tc*;s@FRf:n=
+f_sP)f`'M%#lk<`gO\+1g[a*L~>
+pt>`$r7V,XrX8Z)rrE-#!W<!#$4@1JrS./%!8HYir<`GAn_*sIrW`P\h;$c`^&8oK@JuVnec=>#
+g&Tb(f_u3X$%^f]g4@uKg40~>
+psfAor71rS#6tS6!<3'#!!3#u!"/]2!87A'!7q"s!7pJdrRLu$r<N;=!8.8$pXK8pr;m)Qf[naR
+\c!?C?2^&fdK%bpf)=(r"om/)eUc8%eb%CB~>
+rnID,q:kj+!!2cn"#Vnl2YGi)gumGj$N8!;g\on-#Q=o/g=t?[gB$*Trlk\4Q'@M/:/=[a2#uG2
+gBZEaf@L96#mu7<J_Pb1o%SZ~>
+rn@>*q:bd)o`,(O2E!GcgAfpjgAM?V`V%s`gAhHW#6NZ8g\oh,gWf`A#EtC9P>4hI:Am!Lg]#n3
+f\+p0#mgqFJ_G\/J_K\KJ,~>
+rmgturmgqtr\4C/o`+tLr\FQ,rRUhqs46PerRLu$r<N;=!8.8$qUPSr!8%/N!S5m#ecFCErl>>*
+OH5Gp8P2VR0EB`(f)O8"e,KRN"T[,)eUc8%eaq=A~>
+rnIJ.!SuQ,gB9Dl2)YL6!!!&s!!>)81cG-`!nuD`rnQ_lr<iMCp"TH#!!iK-rn@;)rQPG/PEV70
+:]E9Q1c>6d!87A(rWiK1J_Pb1J_TbMJ,~>
+rn@D,!SlH*g&j2h1c>12!!2rs"#Vtp2>Gl,g"P0ZgZ[Ai$2qj9gATb+#6"l,g\fe(bQF&lP*>i>
+s"ja42#Z,.f`'S'#lk6^g4@t/g@EsJ~>
+rmh&"!S>p%ebmu#0eb:;qu?]tqZ$URr\FQ,rRUqt!n>cNrmpJerRLu$r<N;=!8.8$qUPSr!8%/N
+q:>Mc"-8J&O8V]N0EEg\rRUqsr<*8Se^`7%J^o>%J^sMFJ,~>
+rnID,q:bm.r\a`Wp&G1P1c.)bgBQBdgYCW?h!*Sl$N8!BgAot)g\oq+#6*?SgB5^Ec-?3OrD3AL
+rS%>*rn%;Y#7(WegO\+1g[a*L~>
+rn@>*q:Yg,r\a?K"#Vtp2#,c/g"P07gtUTJgAM?V`VeEig&'M%gAhEV#QEKUg&oRBbfp$LrD*;J
+rRq8(rn.A[#RLcfg4@t/g@EsJ~>
+rmgturmgqt"#;Sc1\C_N2)@$Df_sD"eHXORe^i@'f'_)eec=A$#Q;O?f_sA$eGIeqecFA'rW;oH
+"3AO(aSh1u9)UIBf)=)("9Sc0f%&=%eq)A&eUc9FeUR~>
+rnID,!Sc?*gB9An3&Ug2!!G/91c=(]g\opmgC=Ps#n+bl`Q$Zdg=tB9gAK_(g].WZ"p3N3gAK_(
+c2En+:B4/g2>u80g&BV+#R:VAJ_Pb1J_TbMJ,~>
+rn@>*!SZ6(gAWo/2>$qP2)[?Lg\';!gZmMl#lk>2`<P&NgY1B9g\fe(g\hBVg\fe(bl*b):&n#e
+2#Z,.f`'S'#lk6^g4@t/g@EsJ~>
+rmgtu!S,]seH7HZ0f/J&r\FR1g&9Ltec"(fec"&!f_u*Z#fFX#_q=q=s4./#s4%;(f@JO)"9&At
+f)<\gO8_`O8c:@Af)=+s"T$]#eUc8%ebRaG~>
+s4[P-rS%>+qV)7e^:h-:2DmAj$N2jd]",DagYCuHrS%5)!8RS.%LNLK$HC'(`nT5$gY:H9ptGcR
+rWWJYg"P3Z_unN<eC4BNrQY9Iq:bfS!"/\V!o)Mcr7_5*J_Pb1J_U4ZJ,~>
+s4RJ+rRq8)qV(t\"hD3%2DmAj$N2jd]">Pbg=tfErRq/'!8IM,r<`GA#27hdg=k<9pt>]PrWiGW
+!8@Ch"4P]Idf%nubl%hFg&B_.$4@1IrRM&(gY;Y[!82qWJ_G\/s4Vu~>
+s4%,!rRCntqUH"^\$ie&1c$ur#RCbqr\XS`!SH$'f':faeGdu$f%8L(f_l$X_o9U4f_sD$ec45#
+ec45#eH"2!!r^^K^B;g-cd)L?rQ+p?r71et!sJl4"oZjNf%8OOeH"*MeUc8%ec40M~>
+!8RM,!8RD)rOW:m2)I/s$4@4>2ZC8f]B.fGgABV/gtN/C#n"]O`;nZigABY)g&]q5rW`AU!8IIj
+rRCf#rQY9IrRq8+rn@>X!"/\VqqD/*gk"42gO\,YgOK~>
+!8IG*!8I>'rON4k2Dm>u$4@4>2Z:5KgAT_%g'-6b#mptFrl"lUrS%8*qqD)'!SRbW#QEHXgASqf
+e,A#!bl%hGf`9b*g\qN[$2rHPg&]m]J_G\/J_L+WJ,~>
+!7q(u!7ptr!4Dg7s"O[21C"0l#lQUY\,b1[f':fbe,\%recj[X#7(P>rke`QrR_2&e^aQJs4%,#
+r;urKrP/<WrRUqgr<3)LrRUoNrR1Vp!nGfOJ^o>%J^sbMJ,~>
+p"KQ%gY;\=#<"Ft2$s]u$N2jb]">PcrS%>-q:bo'o@s5tq:c/^#mgsY`Q#pPqqCi"!!iK-"5;M`
+g\o(heGe2&gAT:q#lk81gAfn/g"P0Z#lk>2fDOA'gk"42gO\,WgOK~>
+p"BK#g=lM:#;nCu2$s]u$N2jb]">PbrRq8+q:Yi%o@j/rq:bcRs2>#Y`VeHig\BJ&#6"i0gYCQ;
+rPST_rn7A*rQP6H!!iMVrn@D,rX&W3rRUo#!8E(YJ_G\/r7ZZ~>
+p!j/oe^_),[f8&c1,B1B#RLAc"1YnO\GatYfD3qseFV5ie,\%qec=A$#QM[B`5DN*!S5frf)5XP
+f%8L(rP/<Wrmh)"rQ+s@!!E5Ns4.8%f%0d'rR1SoJ^o>%J^s\KJ,~>
+o%X,T#W=Os2$sWs$98#Crji*AjkKafq:blVrWr_H`5KXLqqCi"!!iK-rn7A,rP\ZarS.:qr<`GV
+!8IM,rWrQ3rRZVTJ_Pb1p=k)~>
+o%O&R#;nCt2$s^!$N2p_])]G(gAT_#gAM<\`Pf^6g\ok+g\BJ-"pYA;g=tB9rPST_rS%4or<WAT
+!8@G,rX&W3rRQPRJ_G\/p=b#~>
+o%!`I!4Mk]"Z$Dg"pd*c1B"Z]f&tT_e,\%qec=A$#6_r]_Sb(*f_3nq!W`GVrmq%_rQkGnrQ+p?
+rRLktr<</J!nQ#VrRQPMJ^o>%rRHD~>
+rnID,o\0i/g"P05g=k<9g"P-5g>pugg@j8$$N:A2'EAmE(BG@(r[n*'!!iK-rn7A-rL=*?-mpAl
+.k3%I-NJr$LA]g*g';(q@U^N++sQtHs4[P/J_Pb1J_U.XJ,~>
+rn@>*o\0?"s4[M-s4RY3g=t?9gZ7&gg%O.u$2tV=(&SmJ(]bF'r[e$%"9o)9#29(2rL4$=-RL/h
+.OchF-3/f"L&B[(gBV4t@ppN)+X-eEs4RJ-J_G\/J_L(VJ,~>
+rmgtup=9,ms4IA&s4@G*e^i:Lf&kKaeCE+Fec=A$#Q>>9'DrUE'*'EZ./h`r!X&YYf%/IOQNn]Z
++sJ<[,piL6!.t3$q:6$^?!^eW*ZZ7Y2`EVFf%5K'J^o>%rRHD~>
+rnID,ptGf&rnI%ujP'[gp=oTSrsAW<r>,SP(Ddo@r[n*'!!iK-rn7A,rLEg6r@7anrJ(7)s4RJ+
+ra>e9r?D2$J_Pb1J_U%UJ,~>
+rn@>*pt>`$rn?tujOsUep=]TT$4.%;'`AgJ(B,*M/cI="g&M?V#QEHXgARN>-N,Cl-N/YrgAfn-
+gAYO]@JqAJ3J#n8g4@uSg40~>
+rmgtupsfDpeaM)OeH47NebRc!fEVZe#Q5;6'`\sI'`]c`./h`q!r^^KQi/-,-2f%dJbmptebreP
+*W7hqeq)A&eUc9JeUR~>
+rnID,rn@G.ptGi'g\9D&g"P*5!"/]3r=fMR()Ri((`+#?r[n*'!!iK-rn7A,rL<j9r[7^q!@oVt
+-iSi#L&Tg-g=uV\ra>e9rZV=erAju6g4A"0gO\,WgOK~>
+rn@>*rn7A,pt>c'h"TP(g=t96r<`E:#T"6n(Ddo)(G#J9rRq5UrWiGW!8@C@!%7ams![su./bLl
+K`Hf*g&]m\rnIE]!+GjM!$_A%!SZ4Xg4@t/gAKZT~>
+rmgturm_#"qUPSr!8$tr!7h)"j43tV!8.5Tr=TAN'G_Du()7Q5r[@`rr;urKrKdL/rZ_@g!@B)j
+,6!,nJH"+"ec"(t?2biE*rRqsf$o9$J^o>%r7-;~>
+q:tYts4[M-s4[M-s4[M-s4ZDc!8@;(#mptF#S[sd'c._d(BP?g)#Z&bg\qEX"od3Ug\mWB-N5Ck
+.fLdq-N/\qgAot,@/sd8,5sV'3J#q9gO\,UgOK~>
+q:kSrs4dS-s4dS-s4dS-s4cJc!875&rWrc7'GM2q(E!)e!>lXO/H+<$#6*?WgARK@-2o7i.K1Xo
+-2iPog&Tn,@K9j8+oXJ%3.]e7g4@uSg40~>
+q:>/fs475#s475#s46)X!S5fuec=A%#6kAF&ePcl(B,$N&ec!0r[@`r!!<-##M.GUesD\gQi8-3
++seK[,pN=3(P.*eJ_&B%f%/C%em2Nc>oan)*AoZ11P+)-eUc9IeUR~>
+mG%Zps4dS-s4dS-s4dS-hqJ.drn@G,rnIG+!87A*s4dJ*p"TH!p"KK%rS%>+ptGi'g]#oXgO\+1
+g[X$K~>
+mFqTps4[M-s4[M-s4[M-hqA(brn7A*qq;&'rn@D,rn@D,p"KB!p"BE#rRq8)pt>c%h#?&Zg4@t/
+g@<mI~>
+ldc$ds4./#s4./#hpqbX!8%5$!S,d!fDsP&f`0Y(f`0P&f_O+uec45#ec45#ec45#ec45#eHFLT
+e^`7Mec45#eHOOSe^W4%rm_,%e^`6%eUc8%eb7OD~>
+]%d5<s4d/!!8Q_k!8@&!!8RP-!8@A*!8<"YJ_Pb1ptL<~>
+]%R5=gY;VZs4dS-s4dS-rnHSh!86tt!8IJ+!87;(!SQ4Yg4@t/gA0HQ~>
+jjjC^h:;GS!nGlQqq1r"s4IA&s4IA&!8%"sn'qEfo@3ilrRCntr7(htdt-&#eUc9HeUR~>
+\_I/<s4d5#!SQ3%gAp%,gAp%&gAp%-gBH<cgtUT=p"KT(gY:G5gO\+1g\9HQ~>
+\_7&<q:Yi'rn7A,rn7A,pt>`&r7V/*p=]N$rRqG.g=t?8g\'8(gY1B7gY7;5J_G\/q:^?~>
+jjjC^h:;AQq:G\urn%>(f\"aKec=>"eH"1oeH"2!eHOIQf%&=%p!j5se^`0udt-&#eUc9HeUR~>
+_:ntFqV1bu!8I;&!8RJ+!8RD)!8@&!s4m;%!8@>)!8N.[J_Pb1ptL<~>
+_:enDnCdlspt>`&qq;&)rS%;+s4RJ+ptGc&rn@D,p"BE!qq;&)J_G\/J_KnQJ,~>
+_:8S;ec"(pfDsY)fDs\$fDsV(f`'G%fDX8"e,RqueG.Soe,Intf(IPneGIbreq)A&eUc9GeUR~>
+]%[2crVup!rW)Tl!!*!!J_Pb1J_S3!J,~>
+]%[)_!!3'!o`>!kptGc&p"KH#J_G\/J_K#8J,~>
+^X`;6!8.)IrrE0$!<Mlo!8.8$rRLqsp!s)kJ^o>%J^rZ.J,~>
+gY;b^jkBmoh:hu,!;$<l!!!&cgAp%.gB66cgYDGU!8N.[J_Pb1o%SZ~>
+gY2\^jOsXfgA(a@!WE)bg&Tn,g&p*`g=u8R!8E(YJ_G\/o%JT~>
+^X`A8!nZ#Uq>^Ksp&Y'k!8.8$nC7Nirm_,%e^`7CeH"0OeUc8%eah7@~>
+gY;b^jkBmmh:hu,!;QWt!!**%rVup!ptGo)gY:NVgAosmgBQHfgtUQ;gk"42gO\,YgOK~>
+gY2\^jk9dgg"Q6%q#LQt!<E9#!;P7Mg"P07p"BE!lIlHsg=t?7g=q24J_G\/rn;l~>
+^X`A8!nGlSq#L3k!<</t!;tFHeH==Oe^jED!7^;a#1h>Ue^W.#J^o>%J^sbMJ,~>
+dG+]TpY5T!rn@J-g\_*P!;$9l!<*"MgO\+1gW%uu~>
+dG"WTpY,N!rn7D+g@t[A!W<"Lg4@t/g;_is~>
+][[&4f'*27eq)A&eUc8leUR~>
+dG+]T!8IJ+r7h,&pY5`%s4d5#rn@G.o%X,srS%>-J_Pb1J_T):J,~>
+dG"WT!8@D)r7_&&p=]T&g=l5Srn7A,o%O&qrRq8+J_G\/J_K#8J,~>
+cIMmCo%!Wg!nc)Vn^[]lo%!]grRCo!J^o>%J^rZ.J,~>
+cJ/<Or7h,&s4[P-o\92qrS%>+n_=#rJ_Pb1J_So5J,~>
+cJ&6Mr7_&&s4RJ+o\0,qrRq8)n_3rpJ_G\/J_Ji3J,~>
+cIMmCo[NrkqUGYue^j<A!7^PhrR?DKJ^o>%g=:]~>
+cJ/<Or7h/'s4dS/!8@,#q:Yr+gY:NQg\oiWgO\+1gY1D4~>
+cJ&6Mr7_)'"Ph_cgY)8RptPi&!8I"srRlbUJ_G\/g=h&~>
+cIMmCpXKDte^i=$mF;<ie^`7?ec"!KeUc8%e_8Q(~>
+cJ/<Or7h,&p"TN&rS.5'm+_KmJ_Pb1J_So5J,~>
+cJ&6Mr7_&&n(RZnm+VEkJ_G\/J_Ji3J,~>
+cIMmCjOO:Zs4..um+)'aJ^o>%J^rK)J,~>
+ceAHTptPc$!Sc?$g]-+-g\fdlgAorYgO\+1gXk21~>
+ce8BRptG]$!SlGugABXkg&TfWg4@t/g=P&/~>
+cd`$Ho[Nrmma_?ds4..um*u*cJ^o>%J^rB&J,~>
+`S::Drn@G.rS.,'r7h8*m+VNoJ_Pb1J_Sf2J,~>
+`S14Drn7A,o@j)rm+MHmJ_G\/J_J`0J,~>
+][[#5o@<`em*u*cJ^o>%J^rB&J,~>
+`S:@F!SQ3&g\9P%gAorYgO\+1gVMWp~>
+`S1:F!SZ;sgATb,gtRD6J_G\/_:jD~>
+_:8P8ma_9b!S#SLeUc8%e\Tdd~>
+_;#"Dq:kZ""l%hfgY1A4gO\+1gVMWp~>
+_:nqDn(J*&gtUQ;gY1B9gO\(0g4@tsg40~>
+Xjma,eCN1!e(*!tdt-&#eUc8ieUR~>
+_;#"Dq:kZ"rS.A+J_Pb1J_S#qJ,~>
+_:nqDn(Rfrs4[M-s4[M-J_G\/J_J)sJ,~>
+Xk!I#s4..us4..uJ^o>%J^q`iJ,~>
+\(gZ5rS.A+J_Pb1J_S#qJ,~>
+WS7C,J_G\/J_IroJ,~>
+J^o>%J^o>%kLG(~>
+\(gZ5rS.A+J_Pb1J_S#qJ,~>
+WS7C,J_G\/J_IroJ,~>
+J^o>%J^o>%kLG(~>
+b1cpOn([`qs5*e3rn@G.J_Pb1J_RroJ,~>
+b1ZjMl.Z0jr7V/*J_G\/J_IlmJ,~>
+b1-LCime%[J^o>%J^qNcJ,~>
+b1lsOnCn0'hVR)Fgthtbrn7D-h!a"rgk"42gO\,1gOK~>
+b1cmMn(Rfr"5;M_f_a>&g=u)MrS)nWJ_G\/f%PW~>
+b16OCn(%Hh!S,cse,e+Nn(%BfJ^o>%J^r?%J,~>
+c.`<RgY;__n_4*#hu;L2h#5t+h!j(ug]?6dJ_Pb1J_Sc1J,~>
+c.W6Pg=lP\nCdltrnI8%rnHqrs4[S0gO\(0g4@u/g40~>
+c.)mFe^aZMnC7NjrmpnprmpShs4.5&eq)A&eUc9%eUR~>
+c.`HVgY:N>gt_JT!8[V1rnRG*"5M_fh!s.tgk"42gO\,1gOK~>
+c.WBTg=k<:gY;8PrS./$"5DVcg[X"rgO\(0g4@u/g40~>
+c.*$Je^`7&f%0BArRUeo"4l)Tf(%;heq)A&eUc9%eUR~>
+mG%Zps4dS-s4dS-s4dS-n_4'!rS.;+n_40$h;$c]gAfq,h!s/!g]?6dm+_Qos4[Y0gY:P8gO\+1
+g[j0M~>
+mFqTps4[M-s4[M-s4[M-n_*utrS%5)r7_2*pt>i)h;$cagAT_)gA]jsgAfn.gtV2Ls4dS-!8E(Y
+J_G\/nCiB~>
+cd`$HrRLktr71hrpsfJte^W(Idf%\qec+.iec42$f@KfKs475#s475#rRQPMJ^o>%l.(:~>
+mG%Zp!8IJ+"5DP`g]#pugB-*`g\ok%g\ok)h#,q,h!s/!g]H<eh#5t&g\ok)gAp%%g]-"-g],t.
+gYIG8J_Pb1o@nc~>
+mFqTp!8@D+"5;MagA]jug&fs]gAT_#g&p$^g=cGZr7_2+rS.#!s4[V1gY;\[q:bf#rRq8+p"KH#
+s4[M-J_G\/J_KYJJ,~>
+dFA<Je^aWJq:,SsdaHYDf)4(ueG[khec42%f@JOOeG7YneGdu'f%8I&f%/C%rRQPMJ^o>%l.(:~>
+mG%6dnD!oqqV1r%rS6YlrS7A*q:bo&rn?krqq?VUJ_Pb1n_8Q~>
+mFq0dnCmioqV(l#rS.8(qqLbsrS.;(q:Yi$rn6epqqH\UJ_G\/n_/K~>
+cIMmCqUPMnrRUnsqpY2frRUqsq:,SreC<%<eq)A&eUc9:eUR~>
+mG%6dnD!oqq:kl%rS6YlrS7A*!ScE,g\ojqg\]]UgO\+1g[X$K~>
+mFq0dnCmioq:bf#rS.8(qqLbsrS.;(!SZ<*gAT^ogABWUg4@t/g@<mI~>
+cIMmCq:5GnrRUnsqpY2frRUqs!S,cuec+%ueaV.@eUc8%ea(b9~>
+mG%6dnD!oqq:kl%rS.G.g?[Mlh#5t&g\ojug]-+0g\]]UgO\+1g[X$K~>
+mFq0dnCmioq:bf#rS%A,g&B_&g[s4ug\oh$gAT^sgAfk+gABWUg4@t/g@<mI~>
+cIMmCq:5GnrRM#"eGe"qe+D2hf)=+oec+%ueb%Gmf_sBPeUc8%ea:n;~>
+mG%6di7e@hgY:NFgAot$gAostg]-+0g\]]UgO\+1g[X$K~>
+mFq0di7\:fg=k<ZgABXog&Th"g&TgrgAfk+gABWUg4@t/g@<mI~>
+^=<>:e^`7KebdhbeH"+meH47NeaqAlf_sBPeUc8%ea:n;~>
+mG%6di7e7e_;"k@J_Pb1J_T_LJ,~>
+mFq0di7\1cq:b`#ceA9NJ_G\/J_KYJJ,~>
+^=<57q:5AkiRRDJJ^o>%J^s):J,~>
+mG%6di7e7emFqWpmb7`qlJ)3iJ_Pb1J_T_LJ,~>
+mFq0di7\1cq:b`#qq;&'mb.ZolIu-iJ_G\/J_KYJJ,~>
+^=<57q:5Akqpb\rmaV<er718eJ^o>%J^s):J,~>
+mG%Zps4dS-s4dS-s4dS-g=uY]rS%>+c.i-LJ_Pb1J_T_LJ,~>
+mFqTps4[M-s4[M-s4[M-g=lS[rRqV3gY:H9gY:H9gY:?6qqH\UJ_G\/n_/K~>
+\CLW/rRD8)e'ljte'ljte'mF/s475#s475#s42bOJ^o>%kLG(~>
+mG%Zps4dS-s4dS-s4dS-f\?A[q:kl%rS%>-h:qh\J_Pb1J_T_LJ,~>
+mFqTps4[M-s4[M-s4[M-f\6;Y$ej@ig=k<9g=b36g&9V)gYLT\gO\(0g4@uJg40~>
+[ak?-$e<_Te^`-te^W$qeG[ntf'Cldf)O8#f)F2"eq)A&eUc95eUR~>
+[bLc9q:kl%J_Pb1J_S&rJ,~>
+[bC]7r7_/)rn7A*lIu9mpt>`&rn7A,J_G\/J_KABJ,~>
+[ak?-r71eqrmCerlIGp`psfAnrm_"tJ^o>%J^s#8J,~>
+[bLc9q:kl%J_Pb1J_S&rJ,~>
+[bC]7r7_/)rn7A*lIu9mq:bl's4[M-J_G\/J_KABJ,~>
+[ak?-r71eqrmCerlIGp`q:5Mos4..uJ^o>%J^s#8J,~>
+[bLc9q:kl%J_Pb1J_S&rJ,~>
+[bC]7r7_/)rn7A*J_G\/J_IupJ,~>
+[ak?-"P))Se^aZJ"4GQEe:H/$eUc8feUR~>
+[bLc9q:bo'J_Pb1J_RroJ,~>
+[bC]7r7_/)!nuD`J_G\/J_IroJ,~>
+[ak?-"P))Se^aZJ!n,QHJ^o>%J^qTeJ,~>
+gY;b^hV8"aq:bo'J_Pb1J_RroJ,~>
+gY2\^hV.q_ptGc&le;BnJ_G\/J_Jf2J,~>
+[ak?-q:,Ppe'mX5s3lPLJ^o>%g!tT~>
+gY;b^hV8"aJ_Pb1J_RWfJ,~>
+gY2\^hV.q_ptGc&le;BnJ_G\/J_Jf2J,~>
+[ak?-psoDnldc$aJ^o>%J^rH(J,~>
+\_@2@gY;\^r7_5*`7k:IJ_Pb1J_U%UJ,~>
+dG"WTpY,N!qq;,+g=lM[qq;2-g=k<9ceAERs4[M-!SlF\g4@t/gABTS~>
+dFJ9GpXT/iqpbc!e^aZM!S>p$eHOCMe^`-tj441\n(%Hes4..u!S#SLeUc8%ebdmI~>
+\D%&<g\hKX`p)7WguR5gh#6"+g4A"0gO\,YgOK~>
+dG"WTpY,N!qUtu'gAM?V`W+WpgY1B9g[NqrgZ7&kgYCT=gA]h,gA]cVg4@t/gA]fV~>
+dFJ9GpXT/iqUGVrec#[Z"i8$j^t$uae^`-tnC@NhpXT;pnC7ZmeC<("rmLkqrmZMLJ^o>%rmcN~>
+[bL`frPn*VrS6MhrS.M0gtUT^g4A"0gO\,YgOK~>
+`S14DptGZQrPeKas4d8$rS-Gf!8IM."5DVcgAT]Ug4@t/gA]fV~>
+`RXk7pso?H!!W>;p=92lp=9,mjja@^rmV&!eC2tHe:H/$eUc9MeUR~>
+[bLcg!"&VDl.c0ljkKahrS.;)J_Pb1J_U1YJ,~>
+`S14DptG]R!!rPBp=fQ$p=fK"jk9^hrnRM-!8@D)J_G\/J_L+WJ,~>
+`RXk7pso<G"Mr!n_:JA2s3p\lrRU)\!7q/!rmLktrR?DKJ^o>%rmcN~>
+b1cpOqV)#(p=fQTrX/VDrn@G.q:bo)p=oQ$jkKahrS.;)q:bo'J_Pb1LYI=~>
+b1ZjMrS%8*!nuD`pt>]TrX&PBrn7A,q:Yi'p=fK"!nuD`kh69rgt^Z<gY:H\g&Kb+g\fb*fn%k.
+g5"C4~>
+b1-LCrRLnr!n,QHq:,Z""pG/8_u@ISf%&=%q:,Jrp=9,m!nGcKmFD6frm_8)eC<("e'lkHeGdtu
+e,7_re:H/$eVD\*~>
+b1laIp"TEPrPnik!8@8's4mA'rS7A*rS.A-nCmrsp"T;tJ_Pb1L>.4~>
+b1cdJrnRM-ptGZQrPeci!872%s4d;%rS%G-g=k6YgAfpsg'?<bgY:H9gY;Y[s4[P/r7ceVJ_Gk4
+J,~>
+b16F@rm^qrq:,JrrWN<-_u@LPecF=Nq:5MrpXT5n"4YcIeG[qtf(@Mmf)O8*eCE$se^`-trRLnu
+!7^qtJ^o>%L=Le~>
+c.`<RgY;S[p=fW'g\hKX`q\9ig=tB]h"]Y&h#5t*g]$!hg\T]VgO\+5gOK~>
+c.W6Pg=lJZs4mS-qUtu)gAM?V`VA-gg"P0Zg\BM$g\oh(gA]k$gAfq%gAfq*gA9QTg4@t3g40~>
+c.)mFe^aTKs4%"rqUPVs!!W?,rPSQarRCu!e^aZMpso>ormUqurRLu#q:>Mps3p_ms3pnrqUU5J
+J^oJ)J,~>
+c.`<RgY;Y]!o;YepY,`(g\hKX`q\9mg=tB;h;$f`gB-0bg\oq+gATb.gtgc@jkK^g!o;YeJ_Pb1
+L>.4~>
+c.W6Pg=lJZ!o;YernI;'!Sc?,$2qj<g'66ag=tE;g\fb,gY1B[g\oh(g&p*bgY;MWs4d8$!8IG*
+r7_;.gY7;5J_Gk4J,~>
+c.)mFe^aTK!nGfMrmU_os4./RrWiD>!8.8$rRD,%e^`7&f%0cL!nPoPrRUtt!7h&!s47;&fDO4u
+ec4+leH"(rebmu"f@JN(eUc8*eUR~>
+akQXHp=oNQ"3/="`r4Wlh"oe(h#?%.gATe)h#5t+gAot+h#H+/h"]V(h##h+h"f\*gthk_p"KK%
+qqD,)J_Pb1RbN>~>
+akHLDptGZQ"3&3t`VnKjg\TY&g]#n,g&9Y'g\oh)g&Th)g],t-g]#n,g\fb*g\]\)g\KP(gYD\\
+p"BE#qq;&'J_G\/RbE8~>
+ajp4<s3peo!S.GR#6_r]_o(.+ecOIRebmu$f@JO)f)F2-f%&=%f@JO)e^W+!rmhJ-f@JO)f%/I(
+f%&7IeH"1teK<Doe^`7%e^`7&f@JR*f%/I(e^`7%e^`7%e^`7&e^aWL!7ZSMJ^p4>J,~>
+[bL`frPnfjrL<a5"!f0<,lK+h^AZgbN;Xt!+oO\)aSjomeGTgSAckLm7Rm>)!36$trS.:us$6ZN
+62`&,-iIBMh#5t-g4A"0gS`eV~>
+_:nqDptGZQrPe`hrL3[3"!]'9,Q/tf^&?[`Mu=gt+T4P'a8Ocke,9[QAHP@j77I/&!3,srrS%4s
+s$-TL5lDo*-N.6Kg\oh+fn%k.g8EYT~>
+_:AS7q:,Ms"o\c*_Z8?gecV5'Q'V@mruVgo+!MjO,.Y4n\^o<]eq]!7L]&7n*!$uurAt"srkeWb
+rQbEIrs/R4*FN;A5sR^\+sJ8.USFX9e^`6pbKJ*l4$#JF*??4#+oieb=T-hLeH"*MeUc8KeUR~>
+[bL`frPnfjs-j%XS,F`5,lK+h^AZgbN;Xt!+oO\)aSjomeGTgSB)P3t./g.Dg\oOu62`&,-iIBM
+gk"42gS3GQ~>
+[bCZdrPe`hs-`tVRf+T3,Q/tf^&?[`Mu=gt+T4P'a8Ocke,9[QAc5'r-iL"BgATCs5lDo*-N.6K
+gO\(0g7m;O~>
+\((N1"o\c*_Z8?gf)M$:Q'V@mr?(t^rOMmXreCK1r?)"Y!$;)%rPJWermq(o!71TKrF,Xjr?M9:
+rRUqkrB1$"r?;5Er`K-MJ^o>%U=Fb~>
+[bL`frPnfjrL<g7!@T>o,lK+h^'!-DgY;[cruqXj+sA-R+[>rkrQ#E&h;$f8e^W(W$k!JTral.#
+r^Qo9!@K;oWVtTNd/_Pl62`&,-NINQ?3&aZgk"42gS3GQ~>
+[bCZdrPe`hrL3a5!@K5m,Q/tf]`[!Ag=lL`ruhRh+WqpN+?ochrPo?$gtUT4eC2kS$OR8Prac(!
+r^Hi7!@B2mW;YHLciDDj5lDo*-3.BO>l`UXgO\(0g7m;O~>
+\((N1"o\c*_Z8?gf):p7+oro4r?(t^rOE$]e^i=NLC&eZ+!)LF*?6+_r]L8#rkncfs4.J$cd'iA
+#6kE@ra>dnr^$Q/!?rceV#AmDbQ,ib4T-?"+okgG=9-nNeq)A&eY:TE~>
+[bL`fs2G,\`n^RJrL<g6s!Rajs!Isu-bmC0^&?^aN;b"$,Q/ea5lJe&h#5_&$iUS5B)P3t./g.E
+gAp%-dJcE466cCR!%@gos'>_5?N&Z1gO\+RgOK~>
+[bCZds2>&Z`S:CGrL3a4s!I[hs!@ms-GI1,]`$R_MuFk",5iY_5Q/Y$g\oS$$N:G3Ac5'r-iL"C
+g&Tn+d/H925p?4O!%7ams'5Y3?2`N/g4@tPg40~>
+\((N1"o\c,_ZIcog&BS$QN&-.,5iV`+pK89]",A]f)F;(M2-kCrZ;7c*ZQ.@rB1/"rke`frmq(o
+!RCuL#lnK7@JrLj,Q4G;ec=>$bQuKX4?PhM*Zc@#+p1tM=]kXRJ^o>%U=Fb~>
+[bL`frPnfSr=f@F\[oBNgBc<ZeC;modaPu1_#4oE_ZSZKgY;[<"&2Na9`EcHh#5b$!WB"rg\mTA
+3rV5>g\m<6:'9;+gYDe_!8RP!J_Pb1T%eb~>
+[bCZdrPe`Qr=]:D\@K0Kg'H0We'l[kdF,c.^\ncC_?8NHg=lL9"&)E^9E*WFg\oV"!<&kpgARH?
+3W;)<gAR049`s/(g=uV\!8IItJ_G\/T%\\~>
+\((N1"o\c*_Z7OP^\nZF[C!?LrRM8#d*L%^c-=PFrk/CE%1NjH^]W6@f%Bq1#>.QX8(Q5@f)Eqp
+ci!hDVZ*Cif):m72?#N4f)CX7O%W,;9A.nIfDa>%f?4*7J^o>%T%/>~>
+[bL`frPnfSr=o4ArS.;#rmCeqrP8@ErPSTgrac(ArD!7FrRCcHrMfbM!1NnVrAt#7rnIC7r_<Gf
+q:c"td*L$hgO\+NgOK~>
+[bCZdrPe`Qr=f.?rS%5!rm:_orP/:CrPJNeraZ"?rCm1DrR:]FrM]\K!1EhTrAjr5rn@@6!0I1S
+!)34B"4#6<c@O]#g7I#K~>
+\((N1"o\c*_Z7OP^\n]A[0>.3e^i'lrm1Vh!7:\Xr=AkBrRh*Y!Fnb$8H%*Acd'h^r;ZhprhTMD
+!1!PLrAFc0f%/LQNrY=A9*%Z;qUY\hs2fiBJ^p@BJ,~>
+[bL`frPniT!Q>`O'`PZD]DgOcg=?2PrR1_]!PcGK')ocO`7s)%g\taaAGo7$g\oY#!WB"rg]*`D
+R[a7;rn@S2P*;&lrD*1C"4,??c[ji%gRd/M~>
+[bCZdrPecR!Q5WM'E5NB])LCag!p#MrR(Y[!PZ>I&cTWM_qNl!gAYU_A,T+"gATM!!<&kpgAdTB
+R@=(8rn7M0OckihrD!+A"4#6<c@O]#g7I#K~>
+\((N1"o\c*_Z[fj^VC?Y&,rs;[atH.$dd2Ecd0k\cb7$)^&8K@^]_L+g"=sV@KBn0r^d"="4,9<
+ci!hDVZ*Cif)M$:Q'VA,rmh5*O-#E`rC[:Gf%/L+rmq+ls2fiBJ^p@BJ,~>
+[bL`frPnfS!#,>GrOVs^!7UqsrR1Y[r=](H!8@G,rFPt&!D_AJgAoe'e,o^Q!<N.urn@J/Rf8fV
+3rqB(rS%F;PEM+-:ANZCc[ji%gRd/M~>
+dG"WTpY,N!ptGZQrPe`Q!##8ErOMm\!7LkqrR(SYr=T"F!87A*rFGn$!DV8Hg&TY%dfTRN!!)tr
+rn7D-RJrZT3WV6%rRq@9P*(n*:&3NAc@O]#g7I#K~>
+dFJ9GpXT/iq:,Ms"o\c*_Z7OP^AncC%fj$:[/SSUf)Eqpci2/hci1TY]++`M!5STJ"4buRf`#=[
+@/`[t8_*gk"45?=ci!hDVZ*Cjec=>$Pm!C22DmDkecUnlNK*m.q:5PgrlK`AJ^p@BJ,~>
+[bL`frPneps%W_n:>FXZh#?%1gtUT=r7h1."%l3Z9`!KDh#4nb'`\sHg\oV%$2t;-gAo+i_>YSX
++T:'n^&K&U)]W<r@q,D*rR^;grS%5)!8N.[J_RroJ,~>
+dG"WTpY,N!ptGZQrPe_ns%NYl:#"FVg]#n/gY1B9r7_+,"%c*W9D[?Bg\nb`'EAgFgATJ##lY/+
+g&Stg_#>GV+8spl]`/oS)B3*n@U]5'rRU5erRq/'!8E(YJ_IlmJ,~>
+dFJ9GpXT/iq:,Ms"o\c*_Z5PmL]9pL8kIXce^j`M!nZ#Rr71l#reL`477]s@f_a5"g&AM^\,Hp=
+&,k&^cd'h^"TAW+f_X/$]t:nhrYtnWrRUqWrtbhS(L:<Q?2^#gdf.YYec""reH"0OeUc8ceUR~>
+[bL`frPequNJrhp:AruBgBlTgMi3OP91qlMq:bn_rk/1ErS.>$!S%MU$MiEY_8=%)r?20prnICb
+r>bcFrL3c<!S5leg\oiWgO\+jgOK~>
+`S14DptGZQrP\ksN/NVm:&Wi@g'QHdMMd=L8kMZIq:Yh]rk&+CrS%8"!RqDS$2N9W^qmh%r?)*n
+rn@=`r>Y]DrL*]:!S,ccgAT]Ug4@thg40~>
+`RXk7q:,Ms"o\c*_ZPaOLPPh"!8%5$qUPSr$J!dbLl$pY84Q5'qpkf#])K5?')iI@ed'OHcHl\!
+#6jqSs1ABE]_rfMec+.u\G[6B?2^#jda?Fhl.,a^J^o>%]%)<~>
+[bL`frPneprD*=H!8@A*!8@A*rJUVIr7_J3gY9BQ]Y#$Z(&lqfh#5_)#mq"Gq:kkar?;-orOr.L
+raGk;rL*i?f%8O<g\oiWgO\+jgOK~>
+`S14DptGZQrPe_nrD!7F!87;(!87;(rJLPGr7VD1g=j0M]=SgW'`Qedg\oS'#RLeCq:be_r?2'm
+rOi(Jra>e9rL!c=e^i=9gAT]Ug4@thg40~>
+`RXk7q:,Ms"o\c*_Z5PmL]'dEfDa>$eGRhseGRnrM#BjEf_sA+f@JTb\@K-`rXf([#hRDJcHcUu
+#6akR"2)7X]_riKf)<,W(]I\??N$,kda6Chl.,a^J^o>%]%)<~>
+[bL`frPequNJrhp:AruIgAot'g]*04MMqF+q:kk\!u2Rd(&cnceG]dW$/=4gr7h1d!$_CcrS%=d
+rk/:NrZ(lGrL3`;!8.,%!8R/"rRuhWJ_RcjJ,~>
+`S14DptGZQrP\ksN/NVm:&WiGg&Th%gAd$2M2M7(q:beZ!u)Ia'`Hbae,BXU#hn"cr7_+b!$V=a
+rRq7brk&4LrYtfErL*Z9!8%&#!8I(urRlbUJ_I]hJ,~>
+`RXk7q:,Ms"o\c*_ZPaOLPPh"!8%5$rRCu#e^aTKs+UQ.M#BjEf_a5"f_r>_&ePZdrRM(scHac8
+"U,%[f%&@&rmh"[!PBHP*<"Fg\c0)=(B,-K?2^#jda?Ijq:,Jro%!]gJ^o>%]%)<~>
+[bL`frPehqrf$eNqV),+gY:H[g\m'/9`<]Gh#?(,]_rQIgtg`?rRCcUq:kkcr?)$n!8RP-rQPS3
+Q'@M/:/=[a2#uG.g]-(#gAorYgO\+ggOK~>
+`S14DptGZQrP\borep_LqUu&)g=k6XgAQp-9E!QEg]#q*]DWEGgYCN;rR:]Sq:bear>tsl!8IJ+
+rQGM1P`q;+9hnI^1]Z;,gAfq!g&TfWg4@teg40~>
+`RXk7q:,Ms"o\c*_Z5MlL]'dEf)!nuf%&:KecaNWL5(N_8H@EBecXOTf%Br3!##8B#M7VZf?_af
+ci"1Jf)F5!]`>eF)ZJ:ffDX;!a9[igO,ln)8kLf:0*'T"ec44leH"*MeUc8[eUR~>
+[bL`frPneprD)n;rJUVJq:kn]!58@H!#5Ce"4YlNebp!TgB$$_rPJ^Z+<DX#g\oA!P`q;qrD3GN
+!Al\3gB-*`g]$"#gAorYgO\+ggOK~>
+`S14DptGZQrPe_nrCuh9rJLPHq:bh[!5/:F!#,=c"4PcKeGTjRg&]m\rPAXX*uuEugAT4tPEM)m
+rD*AL!AcS1g&fs]gA]k!g&TfWg4@teg40~>
+`RXk7rRLkt!8.8U!<p==_Z5PmL]'gBf)+"qf)CC(M#BmFf_a5"f`&Da\e5Pc&,k,[cN2><r<`DQ
+!nGfNrk/HK)B0P4q:>Mc"-8J&O8VZQ0J>%3r7(kue^aZMo[NrkJ^o>%\(-!~>
+[bL`frPneps%`Yj:\!0>MZ/P49_mHC]E,^Yr>#:drRCcUq:knd!6"gXs4[P/r7_=ubg"E2Pl4DV
+2>l25g=tB;h;$e:gO\+ZgOK~>
+`S14DptGZQrPe_ns%WSh:@[$<M>iD29DR<A])fRVr=o4brR:]Sq:bhb!5naVs4RJ-r7V7sbKS3/
+PPn8T2#Q&3g"P07gtUS7g4@tXg40~>
+`RXk7rRLkt!8.8U!<p==_Z5PmL]9sI8P8p3qpkVq",2JaM#BmFf_a5'fX\Q(\J"lQrRV.tcHac7
+$2iBRec*5^^\o)Nec=>"ecX"6aN4=@rCR&Dr\+3"#1V2Rf%8L(J^o>%WmuV~>
+[bClk$OR7>`r1kq:&n#ZgAp%-MuHBM9DR?@]`/]I'G^T%rRCcUq:kkcr?(jirQY;*"&;Wf:Am'G
+g\ooYgO\+ZgOK~>
+_:nqDpt>fV$4.%;`Vk_o9`RlXg&Tn+MZ-6K9)73>]DiQG',:E"rR:]SqUtu)_u@OO*r4Ogbl*_-
+9hnGXrA=?(rS)nWJ_I-XJ,~>
+_:AS7rRLkt"P<qb#7(4F!/^]1r^d)\r7:bqrRM,'L5:Y?r^QrXqUPZ!rOE"C&.]?Nf)s@EcHlFq
+r7:nu"Ojur]tXF`q:>McrJq(Q8kMZ/r\+)trRQPMJ^pdNJ,~>
+^>&V?rS.8XrPnfSr>,@GrS.;%rR1Y[r=o4NrS%3as%NMf:&`lMg==a'ebp!Rg\o%g*WXpngAo4l
+`;S3bgAot+c2@tIg4A"0gS3GQ~>
+_:nqD!8@D)rS%2VrPe`Qr>#:ErS%5#rR(SYr=f.LrRq-_s%EGd9`E`Kg!nO#eGTjQg&]sGrkeUS
+!87A*!6"lSrR:c"!87=pr<WATJ_G\/U=t+~>
+_:AS7!7h(u!7h)"!8.5TrPJWOrkJCDrODpZrmh"p!7Cbi"1u7[]DW9=_Z&'cfDT:`8k;HCrmh5&
+d*L"ar<`DQs4%8$]=knlr>>Ucrmh(brkJEXrmh)"rQ"sArWE,KJ^o>%U=Fb~>
+^>&V?rS.8XrPnfSrtYVO(B(uGg\o_%df$u['`Q,UaP,A$gAPaa9`s,(gYDbXr=8YXrPSRTrS.:h
+rRCl%!SlH.c2@tIg4A"0gS3GQ~>
+^=rP=rS%2VrPe`QrtPPM(&biEgATS#dJ^iY'E5uSa4].ug&5U_9EWu%g=uSUr=/VW!SbNk_YkMR
+gASqfe,S,&gY2VMr<WATJ_G\/U=t+~>
+^=E54!7h)"!8.5TrPJWOrkJIF!>6"C\c(+XdJ_>g]DW9>_?@d,e^W4LAcPI&8-d\rf%89pcd;Us
+r7:nu"Ojur]tXF_rRUq^!71Yls4@D+fZO37!!N9'rR?DKJ^pLFJ,~>
+^>&V?rS.8Xrl,)]`5KX5rY>JMrP&6b"4l)Tf)F(te,@&^'E/^Ea8O`lB`Vm]rCm:GrnID%r=8YX
+rPSRTrS.:hrRCf#rQY<J!!rPWJ_Pb1U>(1~>
+^=rP=rS%2Vrl##[_o'F1rY5DKrOr0`"4buQec*qrdf$o\')iRC`r4TjBE;aZrCd4Ern@>#r=/VW
+!SbNk_YkMRgASqfe,A#!bl.kJ#Q<>,g4@tPg40~>
+^=E54!7h)"!8.5TrkelW_8!e#rXf,CrOMmX"4>QEdJhAjcMb?T%fR";_Z&'hf4JW+AkN%n!7h)"
+"45B?d/=:Kf)O8'e%<<,^ASrJf)<>`ci2>jfDs(na9)PI!s8GNJ^o>%U=Fb~>
+^>&V?rS.8XrPf)\_o0J.()@Y`^AZgbecX@LdaS01r=o7O!6G,m")2F_C&Ld)g\o\$%KP;\g\o%g
+*ramogAStie,e+LrS.:qr<`GVJ_Pb1U>(1~>
+^=rP=rS%2VrP]#Z_Sa8*'bqG]^&?[`eH=4IdF/!.r=f1M!6>&k"))=\B`1X'gATP"%05/ZgASne
+*WFamg&8hgdfItIrS%4or<WATJ_G\/U=t+~>
+^=E54!7h)"!8.5TrPJlV^;%Do&J5TQ\c1.\f[KiI"3o-9cMbBR&,sEG_u8*fA7K.\rC?q>rmh"o
+!7:ZN!8%2#rmh"]!5ACLrmh)"rP/BY!RT0kf)<Yi"TAN%e:H/$eY:TE~>
+`nUIIrn@G.q:kiSrPerog=tB\Rf+T9-mpDkr@Io]rS.:0r?V=fs$$NJ5Q/\%g\oY#%JecX_Z7XR
++91'rg=uRrr?hIlr?hT#reBstrS%5*!8<"YJ_RZgJ,~>
+`nLCGrn7A,q:bcQrP\lmg"P0YRJeH7-RL2gr@@i[rS%4.r?M7ds#pHH55iP#gATM!%/JWV_>qLP
+*rjppg"QCor?_Cjr?_N!re9mrrRq/(!82qWJ_ITeJ,~>
+`mt%=rm_#"rmgtu!8.5SrPJ`ie^i=MQ2Mm0,9e?Y.K1^n\c(+XL]&=n+TFJ'3BI,V!7q/"rltMi
+r<W>Prmh"]!5JINs4.5$f):s6+oN\b+om5oJFV1geG[que:H/$e[O(Z~>
+`nUOK!SuQ(g\hHY`W=&urS%IDR@9Qkr[7[n!%IjtrP&6brJ^_$r$D;+!6>)[rS.;#r=/SWrPSRU
+rS.:@""#BB-N,Cl-iJeigB60_g=lM\!8<"YJ_RZgJ,~>
+`nLII!SlH&gAM<W`<!orrRqCBR$j?gr[.Ul!%@drrOr0`rJUY"r$;5)!65#YrS%5!r=&MUrPJLS
+rS%4>"!o9?-2f7j-N/Ygg&p$\g"H>Y!82qWJ_ITeJ,~>
+`mt+?!S>p!ec45"f_l$S_ZI]mf`'G)Q'@Q#,Q8tf,lf:j.0.!Z\c(+XL]/Cn+T4>$_Z%FQf)F5!
+c2c2h#lN9Qec*5^^ASuKf):p;+X/'Qr?V=c!.k-"n^R`ke'unGec=3NeUc8[eUR~>
+`nUIIp"TEOrPnfj".GXHRf+T9-mpDkr@Io]s4mY/rJ^\#r?_D,#KOp,akPP(g\oY#%JecW_u1\V
+gB$#trg`p6r@.[mre:E,n_=#rrS.D,J_Pb1\(cE~>
+`nLCGp"K?MrPe`h".>OERJeH7-RL2gr@@i[s4dS-rJUV!r?V>*#KFg)aP,>$gATM!%/JWU_YkPT
+g&]lqrgWj4r@%Ukre1?*n_3rprS%>*J_G\/\(Z?~>
+`mt%=qUPSrs4I8SrPSTb"-o+9Qi/03,pXc_r@%`Yrji'\s47.(r?(t\rAk2#_o'FDeCE+Kc2c2h
+#lN9Qec*5^^ASuLecF<erg3R,r?V=c"+buQJ+;(feG[que:H/$e[O(Z~>
+`nUIIp"THP!!rPCrS.@@!LoPV-iGIl/H*<]g\m*0,lK%f56K!KaN4>7rRCcT!8@G,!8@G,rkelW
++!2OFrS.@B!hGi-r[%^q.OchG-NGLlL@O"#g=b37rS2tYJ_RWfJ,~>
+`nLCGp"KBN!!iJArS%:>!LfGT-N,=j/,d0[gAQs.,Q/nd4p/jHa2e/4rR:]R!87A*!87A*rk\fU
+*Zc=BrS%:@!h>`*rZqXo.4?VD-3,@jL%3k!g">!3rS)nWJ_IQdJ,~>
+`mt%=pXT;prWE6*_u@LPed9mXQ'IZ%,U+EXr?_Ck!5&6@rRMX;L5(I**ZcCG+!2Ud3B9.<_ns:h
+ec!em#65&.eH"+uec*5j^)7e*):m?gesD\hQi8*5+X86W,U+BT+T6i\eH==MeCFNKJ^o>%[afm~>
+YhK03o\9E"!Sc?+gAp%)gAp%(g\opkgB-*`g\oq&g]-((gAorYgO\+KgOK~>
+YhB*1o\0>u!SZ6)g&Tn'g&Tn&gATdig&fs]gATe$gAfq&g&TfWg4@tIg40~>
+\(1H.s4@M+e^i=%ec")!f`0M*f[na-fDO8$fD=%uec+/"ec45#eHOOUf%/I(o@<llq:,Pre^aZM
+#M7PWe^i=%ebdqtec45"eH"*MeUc8?eUR~>
+[+b`=gY:N;q:bo)rS.;)o@j9!ptPc&jkKahJ_Pb1L>.4~>
+[+YZ;g=k<7q:Yi'rRqA,f\"mKg&Th$gATdfgATcWg4@t4g40~>
+\(1K/"P;;Yf@B]J!87>'#hRb_f@\[*f\$#N!S,]pec"(\ec+,#f@GN'J^oP+J,~>
+ZeGK8qqD,)rS%>-rS.;)r7_5,rS%M0gY:N<h"oe'h"08#gABV)h##k)h#H+/h!s,&g=tE;gY@A7
+J_QgOJ,~>
+Ze>E6qq;&'rRq8+rRqA,f\"mTg&Tn+g'-0`g=t?9qV(l%o@a2tqq;&)qqD#'s4RJ-n_+0"g=t?8
+gO\(0g7R)L~>
+\(1H.!878#!7h&!!87>'$.mk`f@\a,f\"gSec=8"ecF=PqUPMpo@3ijqpb\tqpk\s"4u,Sf(%8o
+eCE.#e^f<%J^pCCJ,~>
+[bCf9rS.A+s4dS-s4\.>g"Y98g=t?7g"P37g=tB9g@Eu!g=uS]r7_5,q:bo'ptGf&rnID,mG%Zr
+pY,]%J_Pb1VqZ_~>
+[b:`7rS%;)qUtr&rRqD-f\+s1le2BmgATe(g&Tn(g&Tn,gAfq*g&Th*gATdngAfq%g&TfWg4@tU
+g40~>
+[abZ5e^`7%e^W1$r7D>-f%/L+g=b*0g%sA$f(@JneCFNKr7(euqUGbudacmse,7_reGe"sf'V#f
+f([\pe:H/$eYgrJ~>
+cJ/<QrS.;)mFr'N!!!$$!!!$#!!!$#!<*$!!<3*"!!*,UqV1u(q:ki&"P__egYDY[!8@/$!SlDe
+g\oiWgO\+ZgOK~>
+cJ&6OrS%5'mFqL=!!2ip!!2ip!8IA(rS./%r7_A.gY:H:rn@D,rn7A,pY#Z&g#1T_fn%k.g8`kW~>
+cIMmErRLkro%!cks4%,#kl:_8qUPPqq:5Do"P))Se^j`Ms3q"u!RfHkeH+7Ni77eUJ^o>%WmuV~>
+cJ/BS!SuQ0g\ojngAh9K!!!&n!!<8Vg=lJZrS75'q:to&!8Qbl!8@5&"5MYch"ob,gtUT^g4A"0
+gT'"Y~>
+cJ&<Q!SlH.gAT^sgAfq*g@bLH!VHEog=tB[gATe%gA0M$g&Tq+g[*Vog%a8'gY1B9qUu#*g=lMY
+J_G\/WnMt~>
+cIMsG!S>p$ec""iec4+seH"1o!!!&m!!(UHec"(pebReoeH"+se*PTbeG.Prf%&=%qUGYue^aWJ
+J^o>%WmuV~>
+cJ/<QrS.A+!Sc>qgAh9?!!<;Wg=lJZrS75'!SlH,h"f\)g@3hsh"08#g@j8&gtUT^g4A"0gT'"Y~>
+cJ&6OrS%;)!SZ6!gAfq*g?JY?!SZ;_r7_,(q:Yl(gABY&gA]h.g=tBQg&Tn!g&Th"g&g$_gAT]U
+g4@tXg40~>
+cIMmErRLqt!S,]lec4+seH"1b!!(UHec"(peH+7Oqpt\qrmLqse'mm<!7pbl!7^_m!nPoPrR?DK
+J^pdNJ,~>
+cJ/<Q!8I>'n(Rp"!<E*"rrE'"rrE'"rrE'"rrE'"rr<$"q:kl'!ScE,g\BRGg\oiWgO\+[gOK~>
+cJ&6O!8@8%p"K>u"PVN/!<MWhrrE*"q:bf%!SZ<*gA'G$gAfq-gAfpVgAT]Ug4@tYg40~>
+cIMmE!7gnpp!ruh!S,cc!!(UHec"&"e^jWJpt#Dos3q"us3oHIrR?DKJ^pgOJ,~>
+ceAHRrS%>+kM$g/gY:H:gY1B9gY1B9gY1B9gY1B9gY1BRgB66egt[J8J_Pb1inJt~>
+ce8BPrRq8)mFqHlrn7M0g=k<9o@j6!o\'E%gtUTQgAfq-gAfoYg4@t/gA0HQ~>
+cd`$FrRCntmFD*_!7gqso[j;te^`7%p=08rf@JOBec4+uec4*LeUc8%ebRaG~>
+dG"ZVr7_5,khH-ngtVe_J_Pb1J_T2=J,~>
+dFnTTr7V/*m+VEmg=lM[m+VKoJ_G\/J_KqRJ,~>
+dFA6Jr7(eum+)!^q:5)fo%!]im+)-bJ^o>%J^sSHJ,~>
+Z.f<9h<Werg>)Y]!8RD)rS5'?!8N.[J_R-XJ,~>
+[G(Q5rn@D,n(Ifqg\oh+g\KS%g[*YogXFjVgO\(0g8N_U~>
+[FP6)"k;#Oe^N"Geaq>meCOTK!7ptrrRU>cs3oHI!7l_OJ^p^LJ,~>
+WnRO/lIu<mqV1u(J_Pb1J_T2=J,~>
+[G(N4r7_/)m+MHmqV(o&J_G\/J_K,;J,~>
+[FP6)!R]BoeH4=Ne,@hsf)O;#f(RVoeG@_of&"sWeq)A&eVD\*~>
+cJ/<QUtbn&J_Pb1J_U1YJ,~>
+cJ&6Om+V?kqqD))a4gOGJ_G\/J_L+WJ,~>
+cIMmEm+)'`!R]Bnec4+sec45#ec44Jec+(pec43OeUc8+eUR~>
+cJ/<QV;(t&J_Pb1J_U1YJ,~>
+cJ&6Om+V?kkM#sjgtM_[J_G\/J_L+WJ,~>
+cIMmEm+)!^kLKU]gsuAQqUPVsJ^o>%LXgn~>
+cJ/<QjkBdhrn@G.mb7m"g=tB9hV8"_J_Pb1J_U1YJ,~>
+cJ&6Om+V?k!SZ6+g&Tmqg'$0agY1?;gAT]Ug4@t/gA]fV~>
+cIMmEm+)!^!S,^!eH"1geHFIOe()t)ec""oec43OeUc8+eUR~>
+cJ/<QW8%.%inFIgJ_Pb1TA+k~>
+cJ&6OW7q(#in=CeJ_G\/TA"e~>
+cIMmEW7C^nime%[J^o>%T@JG~>
+ceAHRrS%>+K%p7ZrS%>+J_Pb1VqZ_~>
+ce8BPrRq8)K%g1XrRq8)J_G\/VqQY~>
+cd`$FrRCntK%9hNrRCntJ^o>%Vq$:~>
+dG"ZVr7_5,J_U.YJ_Pb1U>(1~>
+dFnTTr7V/*J_L(WJ_G\/U=t+~>
+dFA6Jr7(euJ^s_MJ^o>%U=Fb~>
+J_S?%rS2tYJ_QpRJ,~>
+J_J9#rS)nWJ_HjPJ,~>
+J^qonrRQPMJ^pLFJ,~>
+WnRO/o%O0"lIu<mr7_5,kh?*mlJ)9mJ_Pb1U>(1~>
+WnII-o%F)ulIl6kr7V/*kh6$klIu3kJ_G\/U=t+~>
+Wmq+#o$m`klI>mar7(eukg][alIGjaJ^o>%U=Fb~>
+cJ/<QiS4Cfo@s<#leDBlrS.A+leDHple;Epmb@]qJ_Pb1[bH<~>
+cJ&6OiS+=do@j6!le;<jrS%;)le;Bnle2?nmb7WoJ_G\/[b?6~>
+cIMmEiRRtZo@<llldbs`rRLqtldc$dldZ!dma_9eJ^o>%[afm~>
+cJ/<QjP'aigY;__pY,c'gY;__n(Rp!gY;Y[rnIG+n(RotgY;__m+VNqmb@cs!SuO^gO\+fgOK~>
+cJ&6OjOs[gg=lP\pY#]%g=lP\n(Iitg=lJXrn@A)n(Iirg=lP\m+MHomb7]q!SlF\g4@tdg40~>
+cIMmEjOF=]e^aZMpXK>pe^aZMn'qKje^aTIrmh"tn'qKhe^aZMm*u*ema_?g!S>nReUc8ZeUR~>
+cJ/<QjP'mmgY:N>gt_\Z#27hdgtgc@nCn$"gY;\\rS%G.g"P0LgBQBdgYCW?h!Nhrh!Wqqgk"42
+gU>je~>
+cJ&6OjOsgkg=k<:gY;MW#2._agYCQ<nCdrug=lMYrRqA,f\+sIg'66ag=tE;g[3\pg[<eogO\(0
+g:#^c~>
+cIMmEjOFIae^`7&f%0WH#1V2Rf%8L(nC7Tke^aWJrRD#"e'un:eHXORe^i@'f'Uuff'_)eeq)A&
+e[F"Y~>
+dG+KPiS4=dp"TH#mG%<fmG%Tph:qb\J_Pb1\(cE~>
+dG"ENiS+7bp"KB!mFq6dmFqNnh:h\ZJ_G\/\(Z?~>
+dFJ'DiRRnXp!s#lmFCmZmFD0dh:;>PJ^o>%\(-!~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+J_Pb1J_Pb1kM(L~>
+J_G\/J_G\/kLtF~>
+J^o>%J^o>%kLG(~>
+WS7F,o%O/uinFIglIu<mJ_Pb1LtdF~>
+WS.@*o%F)sin=CelIl6kJ_G\/Lt[@~>
+WRV!uo$m`iime%[lI>maJ^o>%Lt."~>
+o%O0"J_Pb1J_Pb1pY12~>
+o%F)uJ_G\/J_G\/pY(,~>
+o$m`kJ^o>%J^o>%pXOc~>
+o%X3"J_Pb1J_Pb1ptL<~>
+o%O,uJ_G\/J_G\/ptC5~>
+o%!ckJ^o>%J^o>%psjl~>
+p"KQ%gY;__J_Pb1J_Pb1q:gE~>
+p"BK#g=lP\J_G\/J_G\/q:^?~>
+p!j,ne^aZMJ^o>%J^o>%q:0u~>
+p"K])gY:N>gt[J8J_Pb1J_U%UJ,~>
+p"BW'g=k<:gY7;5J_G\/J_KtSJ,~>
+p!j8re^`7&f%,E&J^o>%J^sVIJ,~>
+s4dS0s4dS0s4`%ZhV6f@hV?oCh:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?
+h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?
+h:p]?h:p]?h:p]?h:p]?h:p]ah>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c40h>Q(ih:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?
+h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?rS'EigY:Q?gY:Q?gY:Q?gY:Q?gY:Q?gY:Q?
+gY:Q?gY:Q?gY:Q?gY:Q?gY:Q?gY:Q?gY:Q?gY:Q?gY:Q_gH46GgYL]?gYL]?gYL]?gYL]?gYL]?
+gYL]?gYL]?gYL]?gYL]?gYL]?gYL]?gYL]?gYL]?gYL]?gYMh_45JZGh;-i?h;-i?h;-i?h;-i?
+h;-i?h;-i?h;-i?h;-i?h;-i?h;-i?h;-i?h;-i?h;-i?h;-i?h>Q(hh:p]?h:p]?h:p]?h:p]?
+h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]]h>c70h>c5[~>
+s4dS-s4dS-s4[P-rnDqVgYCT=g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9
+g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9
+g=tB9g=tB9g=tB9g=tB9g=tB9g=tB^gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq)gAfq-gAfoX~>
+qpYSqs3h/%f$i*uf)F1ue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtudsq~>
+s4dS0s4dS0s4dS0s4dS0s4`%ZgtUT>h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?
+h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?
+h:p]?h:p]?h:p]?h:p]?h:p]?h:p]?h:p]ah>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70
+h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c70h>c7,h>c70h>c5[~>
+s4dS-s4dS-s4dS-s4dS-s4`%Wg"Y98g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9
+g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9
+g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB^gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq)gAfq-gAfoX~>
+qpYSqs3q"us3q"urmMh7e'ljte'ljte'ljte'ljte'ljte'ljte'lkHe,Rtue,Rtudf@qte,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtudf@qte,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtu
+e,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtue,Rtudsq~>
+J_e/us4dG,s4d/$s4c;as4dG,s4d/$s4c;as4dG,s4d/$s4c;as4dG,s4d/$s4c;as4dG,s4d/$
+s4c;as4dG,s4d)"J,~>
+J_Iros4dG)s4d/!s4c;^s4dG)s4d/!s4c;^s4dG)s4d/!s4c;^s4dG)s4d/!s4c;^s4dG)s4d/!
+s4c;^s4dG)s4d(tJ,~>
+d*i!Bp<s#hhU;JPJ^]2!J^_`iJ,~>
+J_e/us4dG,s4d/$s4c;as4dG,s4d/$s4c;as4dG,s4d/$s4c;as4dG,s4d/$s4c;as4dG,s4d/$
+s4c;as4dG,s4d)"J,~>
+J_Iros4dG)s4d/!s4c;^s4dG)s4d/!s4c;^s4dG)s4d/!s4c;^s4dG)s4d/!s4c;^s4dG)s4d/!
+s4c;^s4dG)s4d(tJ,~>
+dF8-Cp<s#hhU;JPJ^]2!J^_`iJ,~>
+qV;/.J_bn5J_bn5n(iK~>
+qUtr(J_G\/J_G\/n(N9~>
+qU5GoqpYSqo@*`is3q"us3q"qq:#Ak#h.>Qe(*!te(+HHs4..us4..us4..us4..us4..us4..u
+s4..us4..u!7h(ts4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..us4..u
+s4..us4..us4..us4..us4..us4..us4..us4..uJ,~>
+qORSVrLNnWJXq@_JXq@_qON-~>
+qO7APrL3\QJXV.YJXV.YqO2p~>
+qNLlBrf[AJPl?j>PQ-pJPQ$j>PQ-pJPP^XFPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJ
+PQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPQ-pJPCN~>
+qORSVrLNnWJXsrSs-poss-poss-poss-poss-poss-rVNJ,~>
+qO7APrL3\QnsTQHJXV.YJXVIbJ,~>
+rK[AGrfdDKrK[>G!1!GFq3:rGrK[AGr0@8FJX(eOJX)XgJ,~>
+rLF"[SXo_NrLNnWJXsrSs-poss-poss-poss-poss-poss-rVNJ,~>
+rL*eUR[X2ErL3\Qns]THm@+'CJXV.YJXW:$J,~>
+rKRGIPEZ!1!1*SKrKI;Iqigi@s-EVKs-*>Fs-*>Fs-A5$JX(eOTp:-~>
+!1`qUrLEhUrL2l<!1\V0ig]t=_jg[s_jg[s_jg[s_jg[s_jg[spR?[~>
+!1WtVs-j.[S"-"<rL3\Q#+D$NR[T_8opYiKrL*hXR[]dtRcU"<RDYKnRDYKnRDYKnRDYKnRDYKn
+RJ3/#~>
+!1*VLs-!SNQB[W"rfmMMQ2[!PQ'7DsQ'7F1Q2d0MQ2d0MQ2QpFPlm>;PEYs1qj.8Is-E\Ms-EPI
+s-E\Ms-E\Ms-E\Ms-E\MpQkiEs-E\Ms-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPI
+s-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPI
+s-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPI
+s-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPI
+s-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPI
+s-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIs-E\Ms-E\Ms-EPIJ,~>
+JcC<$JcC<$kPp&~>
+rr<#t"onT$s8N#os8N!$s8N#trr2Kg!<2rss8E'!rdk+6s8N#trVlf<s8N#trVlf<s8N#trVlf<
+s8N#trVlf<s8N#trVlf<s8MutrVc`ls*t~>
+rqcZj"o%igp\FXaqZ$HmqYp9op\FXZq>($ds82ims82fl"8MWbq>L0iq#U6crqcNhs8)cms8)cm
+qtg?is8)cms8)cms8)cms8)Hd%f6)"qYL*dqYL*dqYL*dqtg?is8)cms8)cmqtg?is8)cms8)cm
+qtg?is8)cms8)cmqtg?is8)cms8)cmqtg?is8)cms8)cmqt^WrqYBs`qYBs`qtp6iqu?Nmqu?Nm
+qtp6iqu?Nmqu?Nmqtp6iqu?Nmqu?Nmqtp3rqtg-aqYL$`qYU0ds82ims82ims82]is82ims82im
+s82]is82ims82ims82]i$2aSpq>0s`q>1!cqZ$HmqZ$HmqZ$HiqZ$HmqZ$HmqZ$HiqZ$HmqZ$Hm
+qZ$Hiq?d&qq>'m`q>'maqtg?is8)cms8)cmqtg?is8)cms8)cmqtg?is8)cms8)cmqt^WrqYBs`
+qYBs`qtp6iqu?Nmqu?Nmqtp6iqu?Nmqu?Nmqtp6iqu?Nmqu?Nmqtp3rqtg-aqYL$`qYU0dJ,~>
+rr;fnqZ$?ip&G!irVuiqJcC<$JcDMFs8MlpJ,~>
+JcE1Yq>SM9q>SM9q>SM9q>SM9q>SM9qu6BjJ,~>
+rqlQf!;cQh!;cQf!;cBcrqQQjrVQTi!;bFHq#-WXq>/51q>/51q>/51q>/51q>/51q>0sbJ,~>
+rr;fnq>^9ip&G!irVuiqJcC<$JcDPGrr2coJ,~>
+JcE1Yq>SM9q>SM9q>SM9q>SM9q>SM9r;QHjJ,~>
+rqc]lqtU9hrVHBkqYU'hqYg-b"8_ihqYg9nqYBs`gACXCReupWanto1anto1anto1anto1anto1
+qYPd~>
+rVu`nq#C3ip&G!ir;ZfrJcC<$JcD/<J,~>
+rr2uto)A^hk5PP_s8W(Ls69RZrlP39rlP39rlP39rlP39rlP39rqcYF~>
+rqc]lqtU6gq>10gqtU6gp%njfq>'mcqZH]jq>/hBs8Dutqu)u\q>/51q>/51q>/51q>/51q>/51
+q>0sbJ,~>
+s4[M-pY,Z%s4[M-pY,Z%s4[M-rn7J-g=k6ZgAfq-gAfq%gAfq-gAfq%gAfq-gAfq%gAfq-gAfq%
+gAfq-gAfq%gAfq-gAfq%gAfq-gAfq%gAfq-gAfq%gAfq-gAfq-gAfq-gAfq-gAfq%g@s@rgAfq-
+gAfq%gAfq-gAfq-gAfq-gAfq-gAfq%g@s@rgAfq-gAfq%gAfq-gAfq-gAfq-gAfq-gAfq%g@s@r
+gAfq-gAfq%gAfq-gAfq-gAfq-gAfq-gAfq%g@s@rgAfq-gAfq%gAfq-gAfq-gAfq-gAfq-gAfq%
+g@s@rgAfq-gAfq%gAfq-gAfq-gAfq-gAfq-gAfq%g@sA%gAfq-g40~>
+s4dS-pY5`%s4dS-pY5`%s4dS-rn@P/gY:H]g]-"-g]-"%g]-"-g]-"%g]-"-g]-")g\9Frg]-"-
+g]-"%g]-"-g]-"%g]-"-g]-"%g]-"-g]-"%g]-"-g]-"-g]-"-g]-"-g]-"%g\9Frg]-"-g]-"%
+g]-"-g]-"-g]-"-g]-"-g]-"%g\9Frg]-"-g]-"%g]-"-g]-"-g]-"-g]-"-g]-"%g\9Frg]-"-
+g]-"%g]-"-g]-"-g]-"-g]-"-g]-"%g\9Frg]-"-g]-"%g]-"-g]-"-g]-"-g]-"-g]-"%g\9Fr
+g]-"-g]-"%g]-"-g]-"-g]-"-g]-"-g]-"%g\9G%g]-"-gOK~>
+rRUkrpX]5lo[`ukr7:nug"-2Us4[A&J_#D'J_&#qJ,~>
+rS.;)!nl;]ptPc$!nl;]ptPc$!nl;]ptPc$!nl;]ptPc$!nl;]ptPc$!nl;]ptPc$!nl;]ptPc$
+!nl;]ptPc$!nl;]ptPc$!nl;]ptPc$!nl;]khH-ko@s<!s4dS-pY5Z#!nl;]khH-ko@s<!s4dS-
+pY5Z#!nl;]khH-ko@s<!s4dS-pY5Z#!nl;]khH-ko@s<!s4dS-pY5Z#!nl;]khH-ko@s<!s4dS-
+pY5Z#!nl;]khH-kn([lrJ,~>
+rS%5)!o2PbptG]$!o2PbptGT!ptGT!ptGT!ptG]$!SlH(gA9S!gA9S!gA9S!gA9S!gA9RfgAfq!
+gAfq-gAfq%gA9RfgAfq!gAfq-gAfq%gA9RfgAfq!gAfq-gAfq%gA9RfgAfq!gAfq-gAfq%gA9Rf
+gAfq!gAfq-gAfq%gA9RfgAfprgAfoX~>
+rRUkr!S5p!f)*tuf%BNDs4GrS!S,cqfR_V)eq)Dqepm~>
+rS.5'pY5T!pY5T!pY5T!pY5T!pY5T!pY5T!pY5T!pY5T!pY5T!pY5T!kM-$jo@s<!s4dS-pY5T!
+kM-$jo@s<!s4dS-pY5T!kM-$jo@s<!s4dS-pY5T!kM-$jo@s<!s4dS-pY5T!kM-$jo@s<!s4dS-
+pY5T!kM-$jn([lrJ,~>
+rS%/'pY,N!pY,N!pY,N!pY,N!pY,N!pY,N!pY,N!pY,N!pY,N!pY,N!kM#sjo@j6!s4[M-pY,N!
+kM#sjo@j6!s4[M-pY,N!kM#sjo@j6!s4[M-pY,N!kM#sjo@j6!s4[M-pY,N!kM#sjo@j6!s4[M-
+pY,N!kM#sjn(RfrJ,~>
+rRUkrpX]5l_q+k<!7ptuJ_#D'J_%upJ,~>
+rS.A+!8IM,s4dS-qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-
+qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-qqM/)!8IM,s4dS-
+qqM/)!8IM,s4dS-leDHns4dS-s4dS-qqM/)s4dS-s4dS-qqM/)!8IM,s4dS-leDHns4dS-s4dS-
+qqM/)s4dS-s4dS-qqM/)!8IM,s4dS-leDHns4dS-s4dS-qqM/)s4dS-s4dS-qqM/)!8IM,s4dS-
+leDHns4dS-s4dS-qqM/)s4dS-s4dS-qqM/)!8IM,s4dS-leDHns4dS-s4dS-qqM/)s4dS-s4dS-
+qqM/)!8IM,s4dS-leDHns4dS-s4dS-qqM/)s4dS-J,~>
+rS%;+!8@G,s4[M-qqD))!8@G,s4[M-qqD))!8@G,s4[M-qqD))!8@G,s4[M-qqD))!8@G,s4[M-
+qqD))!8@G,s4[M-qqD))!8@G,s4[M-qqD))!8@G,s4[M-qqD))!8@G,s4[M-qqD))!8@G,s4[M-
+qqD))!8@G,s4[M-le;Bns4[M-s4[M-qqD))s4[M-s4[M-qqD))!8@G,s4[M-le;Bns4[M-s4[M-
+qqD))s4[M-s4[M-qqD))!8@G,s4[M-le;Bns4[M-s4[M-qqD))s4[M-s4[M-qqD))!8@G,s4[M-
+le;Bns4[M-s4[M-qqD))s4[M-s4[M-qqD))!8@G,s4[M-le;Bns4[M-s4[M-qqD))s4[M-s4[M-
+qqD))!8@G,s4[M-le;Bns4[M-s4[M-qqD))s4[M-J,~>
+hpqbXs4./#s4."ts4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4.)!s4I8#
+Ib!$#e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%
+e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%e^`7%
+e^`7%e^`7%s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4)W~>
+rS.A+s4dS-s4dS-s4dP,$JX:ggYCN:gY:H9qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-
+s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-
+s4dS-qqM/)s4dS-s4dS-leDHns4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-leDHns4dS-
+s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-leDHns4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-
+s4dS-leDHns4dS-s4dS-qqM/)s4dS-s4dS-qqM/)s4dS-s4dS-leDHns4dS-s4dS-qqM/)s4dS-
+s4dS-qqM/)s4dS-s4dS-leDHns4dS-s4dS-qqM/)s4dS-J,~>
+rS%;+s4[M-s4[M-s4[J*"5;MagA]k,gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-
+gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-
+gAfq)gAfq-gAfq-gAfpngAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfpngAfq-gAfq-
+gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfpngAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-
+gAfpngAfq-gAfq-gAfq)gAfq-gAfq-gAfq)gAfq-gAfq-gAfpngAfq-gAfq-gAfq)gAfq-gAfq-
+gAfq)gAfq-gAfq-gAfpngAfq-gAfq-gAfq)gAfq-gAfoX~>
+n^[WgrRCo!pXT;ps4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4.)!s4I;$s4%,#rmh&"s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4./#
+s4./#s4./#s4./#s4./#s4./#s4./#s4./#s4)W~>
+o%X,sJ_Pb1J_Pb1qV-N~>
+o%O&qX4dR.J_G\/J_JN*J,~>
+o%!]g]%-W-qUGSpJ^o>%J^r/uJ,~>
+o%X,sJ_Pb1J_Pb1qV-N~>
+o%O&qJ_G\/J_G\/qV$H~>
+o%!]g`74q?e^jTIpst#HJ^o>%b12"~>
+s4[M-s4[M-s4[M-s4VtWg=b05gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9
+gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gY1B9gtLK:gY1B9gY1B9gY1B9
+gY1B9gY1B9gY1B9gY1B9gY1B9gY1B]g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-
+g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-")g]-"-g]-"-g]-"-g]-"-g]-"-
+g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-")g]-"-g]-"-g]-"-
+g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-
+g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-
+g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-
+g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g]-"-g],uX~>
+s4dS-s4dS-s4dS-s4]clg"P05g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9g=tB9
+g=tB9g=tB9g=tB9g=tB9g=tB]g'HHeg=tB9g=tBVgAfn-gA]k,gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAft.gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAft.gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-
+gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfq-gAfoX~>
+o%*ci`7>"Bf%BiMpt5Pr!8!4]s4=m6s4;hQNRiU~>
+rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"
+rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rrE'"rr<'#!rW0"!<3*"!<3*"!<3*"
+!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3)s
+!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!<3*"!;up5!W`9$!<E0#!<E0#!<E0#!<E0#!<N&t
+rrN-"rrN-"rrN-"rrN-"rrN-"rrN-"rrN-"rrN-"rrN-"rrN-"r;d?/!<<*#!<<*#!<<*#!W)ls
+!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!W)ls
+!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!W)ls
+!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!W)ls
+!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN0"!WN.M~>
+RK3<fNr].[]E%p3JH1`2!!.T~>
+JH16$JH16$k5^#~>
+RK3<fO9#4[]`A!3JH1]1J,~>
+RK3<fO9#4[]`A!3JH1]1J,~>
+RK3<fO9#4[]`A!3JH1]1J,~>
+RK39eOT>C^!<N;8!<3'#!WdiPNW=S~>
+RK39e[K-=.h>mQV!<N;e!<3)N!<3'#!WhilrrL";rrL";rrL";rrM!WJ,~>
+RK39eOT>C^!<N;8!<3'#!WdiPNW=S~>
+R/m0dPlUU\_#X93JH1`2J,~>
+R/m0dPlUU\_#X93JH1`2J,~>
+R/m0dPlUU\_#X93JH1`2J,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH1]1r;lEgr;hHLd/a+GW;unuJ,~>
+JH16$q>^KrSH/WiJH4@'!W`9$J,~>
+JH16$q>^KrSH/WiJH4@'!W`9$J,~>
+JH16$q>^KrSH/WiJH4@'!W`9$J,~>
+JH16$q>^KrScJ]iJH4@'!W`9$J,~>
+JH16$q>^KrScJ]iJH4@'!W`9$J,~>
+JH16$q>^KrScJ]iJH4@'!W`9$J,~>
+JH16$Q2pjaJH47$J,~>
+JH16$Q2pjaJH47$J,~>
+JH16$Q2pjaJH47$J,~>
+JH16$R/m$`JH4^1!!2cnJ,~>
+JH16$R/m$`JH4^1!!2cnJ,~>
+JH16$R/m$`JH4^1!!2cnJ,~>
+q>gHpf`2!QdK'4HJH50>!!.WNnc/XjhZ3TUo`4pknGrLgeH#OKl2Z>~>
+q>gHpf`2!QdK'4HJH50>!!.WNnc/XjhZ3TUo`4pknGrLgeH#OKl2Z>~>
+q>gHpf`2!QdK'4HJH50>!!.WNnc/XjhZ3TUo`4pknGrLgeH#OKl2Z>~>
+q#LBph#IEUc2deDJH5KG!!.WNq>^Krc2deDo`4pknGrLgo`+smiW/oXl2Z>~>
+q#LBph#IEUc2deDJH5KG!!.WNq>^Krc2deDo`4pknGrLgo`+smiW/oXl2Z>~>
+q#LBph#IEUc2deDJH5KG!!.WNq>^Krc2deDo`4pknGrLgo`+smiW/oXl2Z>~>
+q>gHpW;uktJH16$]`A!3o`4pknGrLgeH#OKl2Z>~>
+q>gHpW;uktJH16$]`A!3o`4pknGrLgeH#OKl2Z>~>
+q>gHpW;uktJH16$]`A!3o`4pknGrLgeH#OKl2Z>~>
+q>gHpec5[NeH#OKJH5*<!!.WNnc/Xji;ifWo`4pknGrLgeH#OKp&G'np&KU~>
+q>gHpec5[NeH#OKJH5*<!!.WNnc/Xji;ifWo`4pknGrLgeH#OKp&G'np&KU~>
+q>gHpec5[NeH#OKJH5*<!!.WNnc/Xji;ifWo`4pknGrLgeH#OKp&G'np&KU~>
+roMc4rrE*"qW._>JH3morrE*"roF.Bq#LHW!U&UP!<*#S!<3'"!<2'[k4&HOjoOZ-_#OH9o`5!m
+"9@QFk2lOBkl:\ap&OsN!9X+XJ,~>
+roMc4rrE*"qW._>JH3morrE*"roF.Bq#LHW!U&UP!<*#S!<3'"!<2'[k4&HOjoOZ-_#OH9o`5!m
+"9@QFk2lOBkl:\ap&OsN!9X+XJ,~>
+roMc4rrE*"qW._>JH3morrE*"roF.Bq#LHW!U&UP!<*#S!<3'"!<2'[k4&HOjoOZ-_#OH9o`5!m
+"9@QFk2lOBkl:\ap&OsN!9X+XJ,~>
+roO.[!!1^PqrIk>k(*NS!<)$W!!WH(!9WD*k-Y3f!SIJOjn&NW!<<,^jlY^A!!!&j!!D?DjlQFA
+kl:\ap&OpMq>c$~>
+roO.[!!1^PqrIk>k(*NS!<)$W!!WH(!9WD*k-Y3f!SIJOjn&NW!<<,^jlY^A!!!&j!!D?DjlQFA
+kl:\ap&OpMq>c$~>
+roO.[!!1^PqrIk>k(*NS!<)$W!!WH(!9WD*k-Y3f!SIJOjn&NW!<<,^jlY^A!!!&j!!D?DjlQFA
+kl:\ap&OpMq>c$~>
+s5a7AeH#F,JH3dlrT3hTrT:Kfr;kROrT3PLrT:?brT++^!W`>X!;YaQ!.Y~>
+s5a7AeH#F,JH3dlrT3hTrT:Kfr;kROrT3PLrT:?brT++^!W`>X!;YaQ!.Y~>
+s5a7AeH#F,JH3dlrT3hTrT:Kfr;kROrT3PLrT:?brT++^!W`>X!;YaQ!.Y~>
+roMi6"T\T(!!)0ZjT4N*jT#8]JH4g4!9X:Bq#LBU\,c=*g&V*5nGrOMYlOdb!9X4\h#IH;qW7PR
+J,~>
+roMi6"T\T(!!)0ZjT4N*jT#8]JH4g4!9X:Bq#LBU\,c=*g&V*5nGrOMYlOdb!9X4\h#IH;qW7PR
+J,~>
+roMi6"T\T(!!)0ZjT4N*jT#8]JH4g4!9X:Bq#LBU\,c=*g&V*5nGrOMYlOdb!9X4\h#IH;qW7PR
+J,~>
+"p"](jlY[dfDl!S!!)*ZjlldDjfngbjT+GV!!!'!!!D?DjlQ:<roO4B]`A#md/a.,nGrOLr;kRO
+rT<&=!9O4BeH#R0q>c$~>
+"p"](jlY[dfDl!S!!)*ZjlldDjfngbjT+GV!!!'!!!D?DjlQ:<roO4B]`A#md/a.,nGrOLr;kRO
+rT<&=!9O4BeH#R0q>c$~>
+"p"](jlY[dfDl!S!!)*ZjlldDjfngbjT+GV!!!'!!!D?DjlQ:<roO4B]`A#md/a.,nGrOLr;kRO
+rT<&=!9O4BeH#R0q>c$~>
+rW!&^jQ5LT!<3)ujlldDjfngajgbBijnSoVjoOZ-]`A#md/a.,nGrOLr;kROrT<&=!9O4BeH#R0
+q>c$~>
+rW!&^jQ5LT!<3)ujlldDjfngajgbBijnSoVjoOZ-]`A#md/a.,nGrOLr;kROrT<&=!9O4BeH#R0
+q>c$~>
+rW!&^jQ5LT!<3)ujlldDjfngajgbBijnSoVjoOZ-]`A#md/a.,nGrOLr;kROrT<&=!9O4BeH#R0
+q>c$~>
+rW)oYf`2*T!!!&ujlldDjo5;\!OMh,k5OJQ!<)$T!<)&n!<)$,!<)$N!!**#rT3tYf`;!5i;`l>
+roV`2rT3kUJ,~>
+rW)oYf`2*T!!!&ujlldDjo5;\!OMh,k5OJQ!<)$T!<)&n!<)$,!<)$N!!**#rT3tYf`;!5i;`l>
+roV`2rT3kUJ,~>
+rW)oYf`2*T!!!&ujlldDjo5;\!OMh,k5OJQ!<)$T!<)&n!<)$,!<)$N!!**#rT3tYf`;!5i;`l>
+roV`2rT3kUJ,~>
+rW)oYeH#U1!9EAE!9X:B]`8$5q#CU"!!)*BjlO#QrT3hTs5j@Fk.Lcnjj=),jmrHQ!<E)[r;l9c
+!!2KfrT<&=!9O4Bec5[NrT3kUJ,~>
+rW)oYeH#U1!9EAE!9X:B]`8$5q#CU"!!)*BjlO#QrT3hTs5j@Fk.Lcnjj=),jmrHQ!<E)[r;l9c
+!!2KfrT<&=!9O4Bec5[NrT3kUJ,~>
+rW)oYeH#U1!9EAE!9X:B]`8$5q#CU"!!)*BjlO#QrT3hTs5j@Fk.Lcnjj=),jmrHQ!<E)[r;l9c
+!!2KfrT<&=!9O4Bec5[NrT3kUJ,~>
+rW)oYeH#R0T`G#lr;ccsV#^Mr^AnAujlPXP!<2*\jm`?LjlldF!UBac!TO1YjjaA0jn\t-~>
+rW)oYeH#R0T`G#lr;ccsV#^Mr^AnAujlPXP!<2*\jm`?LjlldF!UBac!TO1YjjaA0jn\t-~>
+rW)oYeH#R0T`G#lr;ccsV#^Mr^AnAujlPXP!<2*\jm`?LjlldF!UBac!TO1YjjaA0jn\t-~>
+rW)oYeH#R0i;`iY_>sK7rW)lt\,ZL0mf<=f^]=>pd/a.-nGrRM!9EAErW2?crW2'["6JV*jjaA0
+jn\t-~>
+rW)oYeH#R0i;`iY_>sK7rW)lt\,ZL0mf<=f^]=>pd/a.-nGrRM!9EAErW2?crW2'["6JV*jjaA0
+jn\t-~>
+rW)oYeH#R0i;`iY_>sK7rW)lt\,ZL0mf<=f^]=>pd/a.-nGrRM!9EAErW2?crW2'["6JV*jjaA0
+jn\t-~>
+rW)oYeH#R0T`G#lr;ccs[f?C/o`+smr;Zp#!W`><!<)$,!!DBHk2u16rT38D!s&H(!UTjh!<N9&
+jT,8@eH#R0q>c$~>
+rW)oYeH#R0T`G#lr;ccs[f?C/o`+smr;Zp#!W`><!<)$,!!DBHk2u16rT38D!s&H(!UTjh!<N9&
+jT,8@eH#R0q>c$~>
+rW)oYeH#R0T`G#lr;ccs[f?C/o`+smr;Zp#!W`><!<)$,!!DBHk2u16rT38D!s&H(!UTjh!<N9&
+jT,8@eH#R0q>c$~>
+!W`9$rT2Q0"6JV*jlugG!P&4/!WE)r!N#kq!SdYT!TsI_jT4H(d/X1.roW_NrT38Dr;l9cquPp[
+rT2Q0rT3kUJ,~>
+!W`9$rT2Q0"6JV*jlugG!P&4/!WE)r!N#kq!SdYT!TsI_jT4H(d/X1.roW_NrT38Dr;l9cquPp[
+rT2Q0rT3kUJ,~>
+!W`9$rT2Q0"6JV*jlugG!P&4/!WE)r!N#kq!SdYT!TsI_jT4H(d/X1.roW_NrT38Dr;l9cquPp[
+rT2Q0rT3kUJ,~>
+rr<$"rT3hTp#Z/7m/[+Hm/["E!TjFV!;5FRjS%^2!;5IPk4&HIjk0Y4jo#2Xjo+?@jT+H=!!!*"
+!VPOSjSn9:!<2'\joP#Q!9X:Bqu?g"!!)0Xjo#2XjnSoLjo+?;!;urs!;urc!<)!Z!V-3jjSn9=
+!!30$!<)'YjT+B@jT+B@jm`?Hjm`?Djo#2XjnSoLjo+?/!<)$U!.Y~>
+rr<$"rT3hTp#Z/7m/[+Hm/["E!TjFV!;5FRjS%^2!;5IPk4&HIjk0Y4jo#2Xjo+?@jT+H=!!!*"
+!VPOSjSn9:!<2'\joP#Q!9X:Bqu?g"!!)0Xjo#2XjnSoLjo+?;!;urs!;urc!<)!Z!V-3jjSn9=
+!!30$!<)'YjT+B@jT+B@jm`?Hjm`?Djo#2XjnSoLjo+?/!<)$U!.Y~>
+rr<$"rT3hTp#Z/7m/[+Hm/["E!TjFV!;5FRjS%^2!;5IPk4&HIjk0Y4jo#2Xjo+?@jT+H=!!!*"
+!VPOSjSn9:!<2'\joP#Q!9X:Bqu?g"!!)0Xjo#2XjnSoLjo+?;!;urs!;urc!<)!Z!V-3jjSn9=
+!!30$!<)'YjT+B@jT+B@jm`?Hjm`?Djo#2XjnSoLjo+?/!<)$U!.Y~>
+rW)oY!<</t!;5IPk3W0Ijm<'JjT+HBjT4H(o`4=>"6S\F!W)lijo+??!!!&n!;Ya0!<)$X!<)$X
+k5FE;!<3'#!!2WOq#LHV!T`A4!<2'[k4o#Qjo#2XjnSlVk4[p8k4o#U!W<#s!UTmcjm`?LjnSoT
+k4Rj7!!!&n!;YaO!!!&s!;5IP!<)$X!!!'!!;5IPk3W0Ijn\t-~>
+rW)oY!<</t!;5IPk3W0Ijm<'JjT+HBjT4H(o`4=>"6S\F!W)lijo+??!!!&n!;Ya0!<)$X!<)$X
+k5FE;!<3'#!!2WOq#LHV!T`A4!<2'[k4o#Qjo#2XjnSlVk4[p8k4o#U!W<#s!UTmcjm`?LjnSoT
+k4Rj7!!!&n!;YaO!!!&s!;5IP!<)$X!!!'!!;5IPk3W0Ijn\t-~>
+rW)oY!<</t!;5IPk3W0Ijm<'JjT+HBjT4H(o`4=>"6S\F!W)lijo+??!!!&n!;Ya0!<)$X!<)$X
+k5FE;!<3'#!!2WOq#LHV!T`A4!<2'[k4o#Qjo#2XjnSlVk4[p8k4o#U!W<#s!UTmcjm`?LjnSoT
+k4Rj7!!!&n!;YaO!!!&s!;5IP!<)$X!!!'!!;5IPk3W0Ijn\t-~>
+rW)oYq#L'Ks5j=Em/[+Hm/ZtDo`4RE!9X1?!T`A<!;,CQjoFT;!!!'!!!;<Ek5=>o!<)$X!<)$X
+k5FE;!!!*"!VPOSjSn9?!!!&u!<)$L!!DBFjlZC>!!2oWr;cfXq#LEU!p8V,qrRe=q#L?or;ccs
+m/[+HnGrOLq#LEVr8dq>roF.@roNYMq;q,Hp#Z,P!9X:Bq#L*LrT<JIrT3kUJ,~>
+rW)oYq#L'Ks5j=Em/[+Hm/ZtDo`4RE!9X1?!T`A<!;,CQjoFT;!!!'!!!;<Ek5=>o!<)$X!<)$X
+k5FE;!!!*"!VPOSjSn9?!!!&u!<)$L!!DBFjlZC>!!2oWr;cfXq#LEU!p8V,qrRe=q#L?or;ccs
+m/[+HnGrOLq#LEVr8dq>roF.@roNYMq;q,Hp#Z,P!9X:Bq#L*LrT<JIrT3kUJ,~>
+rW)oYq#L'Ks5j=Em/[+Hm/ZtDo`4RE!9X1?!T`A<!;,CQjoFT;!!!'!!!;<Ek5=>o!<)$X!<)$X
+k5FE;!!!*"!VPOSjSn9?!!!&u!<)$L!!DBFjlZC>!!2oWr;cfXq#LEU!p8V,qrRe=q#L?or;ccs
+m/[+HnGrOLq#LEVr8dq>roF.@roNYMq;q,Hp#Z,P!9X:Bq#L*LrT<JIrT3kUJ,~>
+rW)oYq#L3O!p8V+rT<JIrT3DH#Nk.0k2k^cjo,5[!Vl]qk4Rg9jSIs>k2k_#!;PXWk2k_'k5,,Y
+!VcZjjk0V6k5OK@!<)$Xk5FE;!;urhjT+B;!<;-]jQ6@@!!2lq!!3'!rT3hTq;qPTrT3hTrT+%A
+qW7\<q#L?or;ccsm/[+HnGrOLq#LBUp>l;8nGiROqW75Ip#Z,PrT3hT!TiJ<jo+?/!<)$U!.Y~>
+rW)oYq#L3O!p8V+rT<JIrT3DH#Nk.0k2k^cjo,5[!Vl]qk4Rg9jSIs>k2k_#!;PXWk2k_'k5,,Y
+!VcZjjk0V6k5OK@!<)$Xk5FE;!;urhjT+B;!<;-]jQ6@@!!2lq!!3'!rT3hTq;qPTrT3hTrT+%A
+qW7\<q#L?or;ccsm/[+HnGrOLq#LBUp>l;8nGiROqW75Ip#Z,PrT3hT!TiJ<jo+?/!<)$U!.Y~>
+rW)oYq#L3O!p8V+rT<JIrT3DH#Nk.0k2k^cjo,5[!Vl]qk4Rg9jSIs>k2k_#!;PXWk2k_'k5,,Y
+!VcZjjk0V6k5OK@!<)$Xk5FE;!;urhjT+B;!<;-]jQ6@@!!2lq!!3'!rT3hTq;qPTrT3hTrT+%A
+qW7\<q#L?or;ccsm/[+HnGrOLq#LBUp>l;8nGiROqW75Ip#Z,PrT3hT!TiJ<jo+?/!<)$U!.Y~>
+roNqUs5a:Bjm`?MjT+H5!<)'F!!E>ajlGOb!!)3]k4o#WjT4H(nGrOLnGrOLquH]sh#RE8q>^Kr
+r;cfYkl:hJjlPY'!<;-]jQ6%7r;llYq#LBTrr<*$!9X:Br;cfXr;cft"9@QGjlQ"4!!2'Zmc=H2
+rT3tXs5a:Bjm`<Qk2bXcnGrOLo`5$R!T`A8!;Y^]!!*'"jlPXdo`+smrW)oYnGrOLq>c$~>
+roNqUs5a:Bjm`?MjT+H5!<)'F!!E>ajlGOb!!)3]k4o#WjT4H(nGrOLnGrOLquH]sh#RE8q>^Kr
+r;cfYkl:hJjlPY'!<;-]jQ6%7r;llYq#LBTrr<*$!9X:Br;cfXr;cft"9@QGjlQ"4!!2'Zmc=H2
+rT3tXs5a:Bjm`<Qk2bXcnGrOLo`5$R!T`A8!;Y^]!!*'"jlPXdo`+smrW)oYnGrOLq>c$~>
+roNqUs5a:Bjm`?MjT+H5!<)'F!!E>ajlGOb!!)3]k4o#WjT4H(nGrOLnGrOLquH]sh#RE8q>^Kr
+r;cfYkl:hJjlPY'!<;-]jQ6%7r;llYq#LBTrr<*$!9X:Br;cfXr;cft"9@QGjlQ"4!!2'Zmc=H2
+rT3tXs5a:Bjm`<Qk2bXcnGrOLo`5$R!T`A8!;Y^]!!*'"jlPXdo`+smrW)oYnGrOLq>c$~>
+roNqUrT3PLrT3PLrT<>EroF.Bk5YM`!<)'U!<)$L!!D?DjlQ"4rT3tXr;k^SrT3\PrT<>ErT3tX
+roF.Bo`4pk"6J\,jnSlVk5OKA!!!&ujo#2Xjo#2X!WD-M!!!&Z!;tpYk4Rg9jS\-<!<;-]k2l+5
+rT3PLrT3\PrT3\Pq;qPTrT3PLrT3PLrT3kUJ,~>
+roNqUrT3PLrT3PLrT<>EroF.Bk5YM`!<)'U!<)$L!!D?DjlQ"4rT3tXr;k^SrT3\PrT<>ErT3tX
+roF.Bo`4pk"6J\,jnSlVk5OKA!!!&ujo#2Xjo#2X!WD-M!!!&Z!;tpYk4Rg9jS\-<!<;-]k2l+5
+rT3PLrT3\PrT3\Pq;qPTrT3PLrT3PLrT3kUJ,~>
+roNqUrT3PLrT3PLrT<>EroF.Bk5YM`!<)'U!<)$L!!D?DjlQ"4rT3tXr;k^SrT3\PrT<>ErT3tX
+roF.Bo`4pk"6J\,jnSlVk5OKA!!!&ujo#2Xjo#2X!WD-M!!!&Z!;tpYk4Rg9jS\-<!<;-]k2l+5
+rT3PLrT3\PrT3\Pq;qPTrT3PLrT3PLrT3kUJ,~>
+roNqUrT3PL!9F.@nGrOMn,NFhqZ-TVjT,;B!9a.XrT3PL"6AS)jm`?Ljo#2X!T3q^!<<,]jQ5Lr
+!<)'G!!**#rT3tXrT3\P!s&H(!WD-U!!)0\jo#2ZjT"??!<;-ajQ-@B!!)rurT3>F!!29`qrInA
+jlZ0r!9X4[rT3VN!<E3!jm`?Ljn/WPjn/WLjo,5[!WD-Y!!!&n!<)$L!<)$U!.Y~>
+roNqUrT3PL!9F.@nGrOMn,NFhqZ-TVjT,;B!9a.XrT3PL"6AS)jm`?Ljo#2X!T3q^!<<,]jQ5Lr
+!<)'G!!**#rT3tXrT3\P!s&H(!WD-U!!)0\jo#2ZjT"??!<;-ajQ-@B!!)rurT3>F!!29`qrInA
+jlZ0r!9X4[rT3VN!<E3!jm`?Ljn/WPjn/WLjo,5[!WD-Y!!!&n!<)$L!<)$U!.Y~>
+roNqUrT3PL!9F.@nGrOMn,NFhqZ-TVjT,;B!9a.XrT3PL"6AS)jm`?Ljo#2X!T3q^!<<,]jQ5Lr
+!<)'G!!**#rT3tXrT3\P!s&H(!WD-U!!)0\jo#2ZjT"??!<;-ajQ-@B!!)rurT3>F!!29`qrInA
+jlZ0r!9X4[rT3VN!<E3!jm`?Ljn/WPjn/WLjo,5[!WD-Y!!!&n!<)$L!<)$U!.Y~>
+roNqU"6JV*jm`?LjmiBO!WD-\!U9[`jllaF!WE)tk4o#Ujn&NT!<<,^roNYMrT+"Zq#TFS!W`9$
+roF.Bo`4sQrVup!m/[+Hr;cfXoDnjk!9X:Bq#LBTr;cfXr;cfXquH]s!9X:Bd/`Lo!TrMB!<)$O
+!!<6%!9X:BnGi[QjQ5Lr!<)$P!!)0Xjo#2YjT+H5!<)$L!<)$U!.Y~>
+roNqU"6JV*jm`?LjmiBO!WD-\!U9[`jllaF!WE)tk4o#Ujn&NT!<<,^roNYMrT+"Zq#TFS!W`9$
+roF.Bo`4sQrVup!m/[+Hr;cfXoDnjk!9X:Bq#LBTr;cfXr;cfXquH]s!9X:Bd/`Lo!TrMB!<)$O
+!!<6%!9X:BnGi[QjQ5Lr!<)$P!!)0Xjo#2YjT+H5!<)$L!<)$U!.Y~>
+roNqU"6JV*jm`?LjmiBO!WD-\!U9[`jllaF!WE)tk4o#Ujn&NT!<<,^roNYMrT+"Zq#TFS!W`9$
+roF.Bo`4sQrVup!m/[+Hr;cfXoDnjk!9X:Bq#LBTr;cfXr;cfXquH]s!9X:Bd/`Lo!TrMB!<)$O
+!!<6%!9X:BnGi[QjQ5Lr!<)$P!!)0Xjo#2YjT+H5!<)$L!<)$U!.Y~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pkrT3\P"6JV*jo+??jT+B?jT+B@jT=N)jm`?LjjaA0k32m<
+jT=T+jo+9>!<<,ujm`?LjnSoTjo#2Xjo#2XjnSoTjnSoT!SmbSjn&NT!<<,\roF7_!<<,^n`9c3
+roF4BjlQ"4rT3\PrT3PLrT3tXl/hU=quQcXq>c$~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pkrT3\P"6JV*jo+??jT+B?jT+B@jT=N)jm`?LjjaA0k32m<
+jT=T+jo+9>!<<,ujm`?LjnSoTjo#2Xjo#2XjnSoTjnSoT!SmbSjn&NT!<<,\roF7_!<<,^n`9c3
+roF4BjlQ"4rT3\PrT3PLrT3tXl/hU=quQcXq>c$~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pkrT3\P"6JV*jo+??jT+B?jT+B@jT=N)jm`?LjjaA0k32m<
+jT=T+jo+9>!<<,ujm`?LjnSoTjo#2Xjo#2XjnSoTjnSoT!SmbSjn&NT!<<,\roF7_!<<,^n`9c3
+roF4BjlQ"4rT3\PrT3PLrT3tXl/hU=quQcXq>c$~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pk#3G"/jT#8]p](<TroO+@n`B9@rT2Q0rT<SL!!2rspuMM:
+qrItAjlGJ&rW2uZnGrOLq#LBTr;cfXr;cfXq#LBTq#L?oh#RE8o)SdkrT3tXl/hF8rT3\PrT3PL
+rT3tXr8dq>oAp):jlPXt!;ursjn\t-~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pk#3G"/jT#8]p](<TroO+@n`B9@rT2Q0rT<SL!!2rspuMM:
+qrItAjlGJ&rW2uZnGrOLq#LBTr;cfXr;cfXq#LBTq#L?oh#RE8o)SdkrT3tXl/hF8rT3\PrT3PL
+rT3tXr8dq>oAp):jlPXt!;ursjn\t-~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pk#3G"/jT#8]p](<TroO+@n`B9@rT2Q0rT<SL!!2rspuMM:
+qrItAjlGJ&rW2uZnGrOLq#LBTr;cfXr;cfXq#LBTq#L?oh#RE8o)SdkrT3tXl/hF8rT3\PrT3PL
+rT3tXr8dq>oAp):jlPXt!;ursjn\t-~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pk"6JV*jn/WPjo4E?jT+B=jT4H)roNYMrT2Q0"6Se/k4eoV
+!V6<]jo+9=!WD-M!<)$T!<)$X!<)$X!<)$T!<)$T!;urS!<)$M!!!&ujo#/Zk3qC4jQ?I'nGrOL
+o`4sPnGrOLr;c`V!p&J*o&]NEr;llYq>c$~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pk"6JV*jn/WPjo4E?jT+B=jT4H)roNYMrT2Q0"6Se/k4eoV
+!V6<]jo+9=!WD-M!<)$T!<)$X!<)$X!<)$T!<)$T!;urS!<)$M!!!&ujo#/Zk3qC4jQ?I'nGrOL
+o`4sPnGrOLr;c`V!p&J*o&]NEr;llYq>c$~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pk"6JV*jn/WPjo4E?jT+B=jT4H)roNYMrT2Q0"6Se/k4eoV
+!V6<]jo+9=!WD-M!<)$T!<)$X!<)$X!<)$T!<)$T!;urS!<)$M!!!&ujo#/Zk3qC4jQ?I'nGrOL
+o`4sPnGrOLr;c`V!p&J*o&]NEr;llYq>c$~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pkrT3\PrT4"?n`B9@rT2]4!!3'!!9O4Bp&G'no`4ODrT*tZ
+!<<0!jm`?LjnSoTjo#2Xjo#2XjnSoTjnSoT!Ta:]!VufrjT4H(nGrRM!9F(Yl/hF8rT3\PrT3SM
+!!3&[r;c`V!9We4o`4pkrT3kUJ,~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pkrT3\PrT4"?n`B9@rT2]4!!3'!!9O4Bp&G'no`4ODrT*tZ
+!<<0!jm`?LjnSoTjo#2Xjo#2XjnSoTjnSoT!Ta:]!VufrjT4H(nGrRM!9F(Yl/hF8rT3\PrT3SM
+!!3&[r;c`V!9We4o`4pkrT3kUJ,~>
+p&P'QnGrOLnGrOLklC\DquH]so`4pkrT3\PrT4"?n`B9@rT2]4!!3'!!9O4Bp&G'no`4ODrT*tZ
+!<<0!jm`?LjnSoTjo#2Xjo#2XjnSoTjnSoT!Ta:]!VufrjT4H(nGrRM!9F(Yl/hF8rT3\PrT3SM
+!!3&[r;c`V!9We4o`4pkrT3kUJ,~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/[1J!TrM6!!)0\jkTq8jk0V9!<N9%rT3DHs5j@Dk4&HMjo#2X
+jm`?LjnSoTjo#2Xjo#2XjnSoTjnSlV!TF+T!WM3]kOAQNjo#2XjkTq8k4J`Qjm`?Ljo#2Xjm<'J
+!V??l!WD-V!.Y~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/[1J!TrM6!!)0\jkTq8jk0V9!<N9%rT3DHs5j@Dk4&HMjo#2X
+jm`?LjnSoTjo#2Xjo#2XjnSoTjnSlV!TF+T!WM3]kOAQNjo#2XjkTq8k4J`Qjm`?Ljo#2Xjm<'J
+!V??l!WD-V!.Y~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/[1J!TrM6!!)0\jkTq8jk0V9!<N9%rT3DHs5j@Dk4&HMjo#2X
+jm`?LjnSoTjo#2Xjo#2XjnSoTjnSlV!TF+T!WM3]kOAQNjo#2XjkTq8k4J`Qjm`?Ljo#2Xjm<'J
+!V??l!WD-V!.Y~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/R.KroNYMrT2i8rT2]4rrE-#!WD-I!<)'M!<)$X!<)$L!<)$T
+!<)$X!<)$X!<)$T!<)$T!!!&Z!;QZok5>8[!VQNljo#2XjkTq8k4J`Qjm`?Ljo#2XjT#>L!<*#l
+!!!&ujn\t-~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/R.KroNYMrT2i8rT2]4rrE-#!WD-I!<)'M!<)$X!<)$L!<)$T
+!<)$X!<)$X!<)$T!<)$T!!!&Z!;QZok5>8[!VQNljo#2XjkTq8k4J`Qjm`?Ljo#2XjT#>L!<*#l
+!!!&ujn\t-~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/R.KroNYMrT2i8rT2]4rrE-#!WD-I!<)'M!<)$X!<)$L!<)$T
+!<)$X!<)$X!<)$T!<)$T!!!&Z!;QZok5>8[!VQNljo#2XjkTq8k4J`Qjm`?Ljo#2XjT#>L!<*#l
+!!!&ujn\t-~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/[+HnGi[Qk2bX[!<)$4!;urtjT+B/!<)'O!!**#rT3tXrT3PL
+rT3hTrT3tXrT3tXrT3hTrT2]4q#LT[jlY^q!<)!]!!*'#rT2i8rT<bQrT3PLrT3tXrT3DH!s&H(
+!VHHkjn\t-~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/[+HnGi[Qk2bX[!<)$4!;urtjT+B/!<)'O!!**#rT3tXrT3PL
+rT3hTrT3tXrT3tXrT3hTrT2]4q#LT[jlY^q!<)!]!!*'#rT2i8rT<bQrT3PLrT3tXrT3DH!s&H(
+!VHHkjn\t-~>
+rW)ltr;cfYnGrOLnGrOLklC\Dm/[+HnGi[Qk2bX[!<)$4!;urtjT+B/!<)'O!!**#rT3tXrT3PL
+rT3hTrT3tXrT3tXrT3hTrT2]4q#LT[jlY^q!<)!]!!*'#rT2i8rT<bQrT3PLrT3tXrT3DH!s&H(
+!VHHkjn\t-~>
+q#UHprT<VMrT3_Q!!3#urT38D!9X:Br;Zfunc8XMnGrOLp&G'nq#CBqpAb0or;cfXq#CBqi;iiX
+!9X:Bm/[+InGrOLr;cfXo`+smrVur\roNqUrT3tXrT3tXrT3hTrT2Z3q>pQW!!2WjrT3tXrT3/A
+!!2lqrT<bQrT3PL"6J\,jo#2Xjm<'H!VHEpk2k^eq>c$~>
+q#UHprT<VMrT3_Q!!3#urT38D!9X:Br;Zfunc8XMnGrOLp&G'nq#CBqpAb0or;cfXq#CBqi;iiX
+!9X:Bm/[+InGrOLr;cfXo`+smrVur\roNqUrT3tXrT3tXrT3hTrT2Z3q>pQW!!2WjrT3tXrT3/A
+!!2lqrT<bQrT3PL"6J\,jo#2Xjm<'H!VHEpk2k^eq>c$~>
+q#UHprT<VMrT3_Q!!3#urT38D!9X:Br;Zfunc8XMnGrOLp&G'nq#CBqpAb0or;cfXq#CBqi;iiX
+!9X:Bm/[+InGrOLr;cfXo`+smrVur\roNqUrT3tXrT3tXrT3hTrT2Z3q>pQW!!2WjrT3tXrT3/A
+!!2lqrT<bQrT3PL"6J\,jo#2Xjm<'H!VHEpk2k^eq>c$~>
+p](<q!<)$L!!D?DjlQ"4rT3tX!!2Kf"Qe_+jT5>\!!2cnrT+%[!VZQo!Vucuk2kaenGrOLnGrOL
+eH#R0mf3@h!<)$P!;YaT!<)$P!;YaP!<)!Z!WE*!jT=T+!WE)tjno,X!WD-Q!<)$<!<)$L!<)$X
+!!DBFk2l+5rT<bQr;llYr;Zfuq>^W[jlY[t!<)$Xk5G>\!WD-M!<2'[k4J]S!WE'$jlGObq>c$~>
+p](<q!<)$L!!D?DjlQ"4rT3tX!!2Kf"Qe_+jT5>\!!2cnrT+%[!VZQo!Vucuk2kaenGrOLnGrOL
+eH#R0mf3@h!<)$P!;YaT!<)$P!;YaP!<)!Z!WE*!jT=T+!WE)tjno,X!WD-Q!<)$<!<)$L!<)$X
+!!DBFk2l+5rT<bQr;llYr;Zfuq>^W[jlY[t!<)$Xk5G>\!WD-M!<2'[k4J]S!WE'$jlGObq>c$~>
+p](<q!<)$L!!D?DjlQ"4rT3tX!!2Kf"Qe_+jT5>\!!2cnrT+%[!VZQo!Vucuk2kaenGrOLnGrOL
+eH#R0mf3@h!<)$P!;YaT!<)$P!;YaP!<)!Z!WE*!jT=T+!WE)tjno,X!WD-Q!<)$<!<)$L!<)$X
+!!DBFk2l+5rT<bQr;llYr;Zfuq>^W[jlY[t!<)$Xk5G>\!WD-M!<2'[k4J]S!WE'$jlGObq>c$~>
+p&P-S!p&GDnc8XMnGrRM!9WeO!!2orrT3PLrT3DH!9X:BnGrOLnGrRM!9Vf3rT3DHs5a=CjT5&T
+!9X7A#3P%/!!!$"rT3\Pr8e"BjlQ:<rT3tX!9F.@r;cfXquH`t!!)uZo`,!SroN)="6JV*jm`?L
+jo#/Zk5OK4!<)'Q!;up#jlY[do`,!SroNeQ!TiDAjo4E@!!)0\jm`?Ljm`?Ljn\t-~>
+p&P-S!p&GDnc8XMnGrRM!9WeO!!2orrT3PLrT3DH!9X:BnGrOLnGrRM!9Vf3rT3DHs5a=CjT5&T
+!9X7A#3P%/!!!$"rT3\Pr8e"BjlQ:<rT3tX!9F.@r;cfXquH`t!!)uZo`,!SroN)="6JV*jm`?L
+jo#/Zk5OK4!<)'Q!;up#jlY[do`,!SroNeQ!TiDAjo4E@!!)0\jm`?Ljm`?Ljn\t-~>
+p&P-S!p&GDnc8XMnGrRM!9WeO!!2orrT3PLrT3DH!9X:BnGrOLnGrRM!9Vf3rT3DHs5a=CjT5&T
+!9X7A#3P%/!!!$"rT3\Pr8e"BjlQ:<rT3tX!9F.@r;cfXquH`t!!)uZo`,!SroN)="6JV*jm`?L
+jo#/Zk5OK4!<)'Q!;up#jlY[do`,!SroNeQ!TiDAjo4E@!!)0\jm`?Ljm`?Ljn\t-~>
+p&P'QnGrOLnGrOLklC\DoDepn!!)uZrW!$$!!!&l!<)$N!!**#rT4%Z!!2]lrT2Q0rT3DHrT3_Q
+!!2oWr;Zr]k2k^t!;YaP!<)$X!<)$X!<)$W!!30&!WD-R!!E>ak2k^`!<)$L!<)$X!<)$L!<;0^
+jlZ49r;llYo`4sPpAb3p!<)$Xk5PDb!<D9EjlQ%5!!3&[qZ$Tsp]19Sq>c$~>
+p&P'QnGrOLnGrOLklC\DoDepn!!)uZrW!$$!!!&l!<)$N!!**#rT4%Z!!2]lrT2Q0rT3DHrT3_Q
+!!2oWr;Zr]k2k^t!;YaP!<)$X!<)$X!<)$W!!30&!WD-R!!E>ak2k^`!<)$L!<)$X!<)$L!<;0^
+jlZ49r;llYo`4sPpAb3p!<)$Xk5PDb!<D9EjlQ%5!!3&[qZ$Tsp]19Sq>c$~>
+p&P'QnGrOLnGrOLklC\DoDepn!!)uZrW!$$!!!&l!<)$N!!**#rT4%Z!!2]lrT2Q0rT3DHrT3_Q
+!!2oWr;Zr]k2k^t!;YaP!<)$X!<)$X!<)$W!!30&!WD-R!!E>ak2k^`!<)$L!<)$X!<)$L!<;0^
+jlZ49r;llYo`4sPpAb3p!<)$Xk5PDb!<D9EjlQ%5!!3&[qZ$Tsp]19Sq>c$~>
+p&P'Qo)Jdl!<)$Q!!E<&!!*)ujn\rW!V??n!<<0!jo,5[!VHEmk5OKB!!!&m!!!&u!<)$T!!!&r
+!<)$Q!!E<&!!*)ujm`<N!TjC\jm<'Hjn/WLjo#/]jlY[do`,!Sr8dt?jnSoTjo#2Xjo#2Xjno,Y
+!<<3"jn/TRjSn9"!<)$L!<)$X!<)$L!<)'V!<3)u!<*#tjn\rW!W<#sjn/WQjT+B?k5>8^jlY[d
+nGrOLnGrOLq>c$~>
+p&P'Qo)Jdl!<)$Q!!E<&!!*)ujn\rW!V??n!<<0!jo,5[!VHEmk5OKB!!!&m!!!&u!<)$T!!!&r
+!<)$Q!!E<&!!*)ujm`<N!TjC\jm<'Hjn/WLjo#/]jlY[do`,!Sr8dt?jnSoTjo#2Xjo#2Xjno,Y
+!<<3"jn/TRjSn9"!<)$L!<)$X!<)$L!<)'V!<3)u!<*#tjn\rW!W<#sjn/WQjT+B?k5>8^jlY[d
+nGrOLnGrOLq>c$~>
+p&P'Qo)Jdl!<)$Q!!E<&!!*)ujn\rW!V??n!<<0!jo,5[!VHEmk5OKB!!!&m!!!&u!<)$T!!!&r
+!<)$Q!!E<&!!*)ujm`<N!TjC\jm<'Hjn/WLjo#/]jlY[do`,!Sr8dt?jnSoTjo#2Xjo#2Xjno,Y
+!<<3"jn/TRjSn9"!<)$L!<)$X!<)$L!<)'V!<3)u!<*#tjn\rW!W<#sjn/WQjT+B?k5>8^jlY[d
+nGrOLnGrOLq>c$~>
+q#CBqqZ-<N"6Se/k4J`KjT=T+k546?k555Z!<<,qjo+99jo#2Zk5XNCk3qC3k4o#Rjo"9@jT4N*
+o`4aJ!p8V,roO1Bs6'1Xr;lisrrMQgrT3MK!!2rsp#Z,PrT<nUpZ2G<jo#2XjnSoTjn/WPjn\rW
+!W<#ljT+HA!<3)[!<)$L!<)$T!;PXVk2cI%r;Zfuq>fsF!9X(WrT4"?rT3tXroF.@q#L$J"6S\F
+!VZTfjT+B?jT=T+ja[~>
+q#CBqqZ-<N"6Se/k4J`KjT=T+k546?k555Z!<<,qjo+99jo#2Zk5XNCk3qC3k4o#Rjo"9@jT4N*
+o`4aJ!p8V,roO1Bs6'1Xr;lisrrMQgrT3MK!!2rsp#Z,PrT<nUpZ2G<jo#2XjnSoTjn/WPjn\rW
+!W<#ljT+HA!<3)[!<)$L!<)$T!;PXVk2cI%r;Zfuq>fsF!9X(WrT4"?rT3tXroF.@q#L$J"6S\F
+!VZTfjT+B?jT=T+ja[~>
+q#CBqqZ-<N"6Se/k4J`KjT=T+k546?k555Z!<<,qjo+99jo#2Zk5XNCk3qC3k4o#Rjo"9@jT4N*
+o`4aJ!p8V,roO1Bs6'1Xr;lisrrMQgrT3MK!!2rsp#Z,PrT<nUpZ2G<jo#2XjnSoTjn/WPjn\rW
+!W<#ljT+HA!<3)[!<)$L!<)$T!;PXVk2cI%r;Zfuq>fsF!9X(WrT4"?rT3tXroF.@q#L$J"6S\F
+!VZTfjT+B?jT=T+ja[~>
+nc8@E"6S_-k4J`CjT4H)q#L?S#3P%0jQ,F`q;qPTlfA0.k5,,Z!<DrWrT=(?!!2or!!3'!o]6/:
+jlQI'q#L<nrW)oun,WFKklCG=!9X4[rT<nUp#Z,P!9F.@!!2orrT+%[!W;uu!W2rrjnJiU!<<,n
+jT+HA!<*#[!<)$L!<)$V!!**#n`BZK!!2rsn)XT2k5,,Z!<E)[rT44Dk2k_'!<)$T!:o4Ok4nuW
+!WE)ujo=E5ja[~>
+nc8@E"6S_-k4J`CjT4H)q#L?S#3P%0jQ,F`q;qPTlfA0.k5,,Z!<DrWrT=(?!!2or!!3'!o]6/:
+jlQI'q#L<nrW)oun,WFKklCG=!9X4[rT<nUp#Z,P!9F.@!!2orrT+%[!W;uu!W2rrjnJiU!<<,n
+jT+HA!<*#[!<)$L!<)$V!!**#n`BZK!!2rsn)XT2k5,,Z!<E)[rT44Dk2k_'!<)$T!:o4Ok4nuW
+!WE)ujo=E5ja[~>
+nc8@E"6S_-k4J`CjT4H)q#L?S#3P%0jQ,F`q;qPTlfA0.k5,,Z!<DrWrT=(?!!2or!!3'!o]6/:
+jlQI'q#L<nrW)oun,WFKklCG=!9X4[rT<nUp#Z,P!9F.@!!2orrT+%[!W;uu!W2rrjnJiU!<<,n
+jT+HA!<*#[!<)$L!<)$V!!**#n`BZK!!2rsn)XT2k5,,Z!<E)[rT44Dk2k_'!<)$T!:o4Ok4nuW
+!WE)ujo=E5ja[~>
+nc8@ErT<bQq;hV;p>u)MroF.BrT4"=roF:Dk2tder;c*Dq#L?S!p&J)rT=(?o`4gL!9F"<s5jCG
+joP;Yr;lis!s&H(!V$0gjlld<jo#2Xk4o#Wk549?k5XQA!<)$T!<)$P!<)$P!;5IP!!<6'!<M9^
+rT3PLrT3hTn`BEDs5a7CroF.Bo]>lKr8mq?"6J\,jo#2XjT#>\!!!'!!<;3Qjn/WNjT4N)qW._<
+roJY~>
+nc8@ErT<bQq;hV;p>u)MroF.BrT4"=roF:Dk2tder;c*Dq#L?S!p&J)rT=(?o`4gL!9F"<s5jCG
+joP;Yr;lis!s&H(!V$0gjlld<jo#2Xk4o#Wk549?k5XQA!<)$T!<)$P!<)$P!;5IP!!<6'!<M9^
+rT3PLrT3hTn`BEDs5a7CroF.Bo]>lKr8mq?"6J\,jo#2XjT#>\!!!'!!<;3Qjn/WNjT4N)qW._<
+roJY~>
+nc8@ErT<bQq;hV;p>u)MroF.BrT4"=roF:Dk2tder;c*Dq#L?S!p&J)rT=(?o`4gL!9F"<s5jCG
+joP;Yr;lis!s&H(!V$0gjlld<jo#2Xk4o#Wk549?k5XQA!<)$T!<)$P!<)$P!;5IP!!<6'!<M9^
+rT3PLrT3hTn`BEDs5a7CroF.Bo]>lKr8mq?"6J\,jo#2XjT#>\!!!'!!<;3Qjn/WNjT4N)qW._<
+roJY~>
+pAb?t!!*'"k4n$=k2lR(o`4sP!9Wk6rW!*&!!*'"k5"-<jS@p9!!)0Hjo,5`!<<-#!9X+=roX7B
+!TrM=!!NB'!9NA*p>l>;jo+?:!;-B`!!)0\jmE*P!<<-#!9X%;!9X4[!9a@Dq#LBT!9X.>r;Zi[
+roO+Z"T\T(!!)0\jo5;\!W)j$!<<,^jlY\$!!NB'!<<,^p>u5QquQ*`"T\T(!!)0\jo5;\!V??l
+k5OKA!!NB'!<<,^o&]NErT+%Ao&]iN"T\T(!!)0Tjo#/]k2k^equ?d!!!*#[!9Eh7q>^["!!*'"
+k3qD^~>
+pAb?t!!*'"k4n$=k2lR(o`4sP!9Wk6rW!*&!!*'"k5"-<jS@p9!!)0Hjo,5`!<<-#!9X+=roX7B
+!TrM=!!NB'!9NA*p>l>;jo+?:!;-B`!!)0\jmE*P!<<-#!9X%;!9X4[!9a@Dq#LBT!9X.>r;Zi[
+roO+Z"T\T(!!)0\jo5;\!W)j$!<<,^jlY\$!!NB'!<<,^p>u5QquQ*`"T\T(!!)0\jo5;\!V??l
+k5OKA!!NB'!<<,^o&]NErT+%Ao&]iN"T\T(!!)0Tjo#/]k2k^equ?d!!!*#[!9Eh7q>^["!!*'"
+k3qD^~>
+pAb?t!!*'"k4n$=k2lR(o`4sP!9Wk6rW!*&!!*'"k5"-<jS@p9!!)0Hjo,5`!<<-#!9X+=roX7B
+!TrM=!!NB'!9NA*p>l>;jo+?:!;-B`!!)0\jmE*P!<<-#!9X%;!9X4[!9a@Dq#LBT!9X.>r;Zi[
+roO+Z"T\T(!!)0\jo5;\!W)j$!<<,^jlY\$!!NB'!<<,^p>u5QquQ*`"T\T(!!)0\jo5;\!V??l
+k5OKA!!NB'!<<,^o&]NErT+%Ao&]iN"T\T(!!)0Tjo#/]k2k^equ?d!!!*#[!9Eh7q>^["!!*'"
+k3qD^~>
+`;fl=aoDDBl2UebP5tO^li7"dJH56@!!2'Z!!1sWrW*!#dK"d~>
+`;fl=aoDDBl2UebP5tO^li7"dJH56@!!2'Z!!1sWrW*!#dK"d~>
+`;fl=aoDDBl2UebP5tO^li7"dJH56@!!2'Z!!1sWrW*!#dK"d~>
+kPtS`o)JakTE"rmirB&[YQ4V&rr<$"qZ$TshuE`XnGiOirVup!`rH)?bQ%VDb5hJAdK"d~>
+kPtS`o)JakTE"rmirB&[YQ4V&rr<$"qZ$TshuE`XnGiOirVup!`rH)?bQ%VDb5hJAdK"d~>
+kPtS`o)JakTE"rmirB&[YQ4V&rr<$"qZ$TshuE`XnGiOirVup!`rH)?bQ%VDb5hJAdK"d~>
+nc/Xjo`+smo`+smm/R+eq#CBqdf9@Kq#CBqq#CBqqu?]tj8]/\^An67p&P$lpAb0oo`+smnGiXl
+!!!&l!!!&k!!!&q!!!&S!!<6%!!20]!!2Zk!!2fo!!2He!!2lq!!2?b!s&B&!Ta:]!Ug#=~>
+nc/Xjo`+smo`+smm/R+eq#CBqdf9@Kq#CBqq#CBqqu?]tj8]/\^An67p&P$lpAb0oo`+smnGiXl
+!!!&l!!!&k!!!&q!!!&S!!<6%!!20]!!2Zk!!2fo!!2He!!2lq!!2?b!s&B&!Ta:]!Ug#=~>
+nc/Xjo`+smo`+smm/R+eq#CBqdf9@Kq#CBqq#CBqqu?]tj8]/\^An67p&P$lpAb0oo`+smnGiXl
+!!!&l!!!&k!!!&q!!!&S!!<6%!!20]!!2Zk!!2fo!!2He!!2lq!!2?b!s&B&!Ta:]!Ug#=~>
+df9@KJH3(Xr;lHh!!.WNg&M*Rd/X7L!W`>M!.Y~>
+df9@KJH3(Xr;lHh!!.WNg&M*Rd/X7L!W`>M!.Y~>
+df9@KJH3(Xr;lHh!!.WNg&M*Rd/X7L!W`>M!.Y~>
+!!.WNk5bG]JH4p7r;hHLdf9@Kn,WCfoDnjkp&KU~>
+!!.WNk5bG]JH4p7r;hHLdf9@Kn,WCfoDnjkp&KU~>
+!!.WNk5bG]JH4p7r;hHLdf9@Kn,WCfoDnjkp&KU~>
+rrIZNkQ(P^JH50>rrN#tr;hHLcN!qGoDngjoDnjkp&KU~>
+rrIZNkQ(P^JH50>rrN#tr;hHLcN!qGoDngjoDnjkp&KU~>
+rrIZNkQ(P^JH50>rrN#tr;hHLcN!qGoDngjoDnjkp&KU~>
+!WiB'kl:\a^&S-6`;oi;p&G'n[/^1-_Z9W9li7"dJH59A!!2ip!!2Qhr;lQkr;lTlJ,~>
+!WiB'kl:\a^&S-6`;oi;p&G'n[/^1-_Z9W9li7"dJH59A!!2ip!!2Qhr;lQkr;lTlJ,~>
+!WiB'kl:\a^&S-6`;oi;p&G'n[/^1-_Z9W9li7"dJH59A!!2ip!!2Qhr;lQkr;lTlJ,~>
+rW.QMklCY_JH4p7r;hHL_#XE7o`4pkp&KU~>
+rW.QMklCY_JH4p7r;hHL_#XE7o`4pkp&KU~>
+rW.QMklCY_JH4p7r;hHL_#XE7o`4pkp&KU~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docs/GPN-2009-06-27/xft.jpg b/docs/GPN-2009-06-27/xft.jpg
new file mode 100644 (file)
index 0000000..fb93a90
Binary files /dev/null and b/docs/GPN-2009-06-27/xft.jpg differ
diff --git a/docs/GPN-2009-06-27/xserver_konzept.dia b/docs/GPN-2009-06-27/xserver_konzept.dia
new file mode 100644 (file)
index 0000000..5ff30fd
Binary files /dev/null and b/docs/GPN-2009-06-27/xserver_konzept.dia differ
diff --git a/docs/GPN-2009-06-27/xserver_konzept.eps b/docs/GPN-2009-06-27/xserver_konzept.eps
new file mode 100644 (file)
index 0000000..7336291
--- /dev/null
@@ -0,0 +1,1340 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/michael/i3/docs/GPN-2009-06-27/xserver_konzept.dia
+%%Creator: Dia v0.96.1
+%%CreationDate: Mon Jun 15 22:27:54 2009
+%%For: michael
+%%Orientation: Portrait
+%%Magnification: 1.0000
+%%BoundingBox: 0 0 937 517
+%%BeginSetup
+%%EndSetup
+%%EndComments
+%%BeginProlog
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+   /endangle exch def
+   /startangle exch def
+   /yrad exch def
+   /xrad exch def
+   /y exch def
+   /x exch def   /savematrix mtrx currentmatrix def
+   x y tr xrad yrad sc
+   0 0 1 startangle endangle arc
+   savematrix setmatrix
+   end
+} def
+
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/dpi_x 300 def
+/dpi_y 300 def
+/conicto {
+    /to_y exch def
+    /to_x exch def
+    /conic_cntrl_y exch def
+    /conic_cntrl_x exch def
+    currentpoint
+    /p0_y exch def
+    /p0_x exch def
+    /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def
+    /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def
+    /p2_x p1_x to_x p0_x sub 1 3 div mul add def
+    /p2_y p1_y to_y p0_y sub 1 3 div mul add def
+    p1_x p1_y p2_x p2_y to_x to_y curveto
+} bind def
+/start_ol { gsave 1.1 dpi_x div dup scale} bind def
+/end_ol { closepath fill grestore } bind def
+28.346000 -28.346000 scale
+-3.500000 -22.300000 translate
+%%EndProlog
+
+
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 7.300000 4.112500 m 7.300000 9.862500 l 24.300000 9.862500 l 24.300000 4.112500 l f
+n 7.300000 4.362500 m 7.300000 4.362500 0.250000 0.250000 180.000000 270.000000 ellipse f
+n 24.300000 4.362500 m 24.300000 4.362500 0.250000 0.250000 270.000000 360.000000 ellipse f
+n 7.050000 4.362500 m 7.050000 9.612500 l 24.550000 9.612500 l 24.550000 4.362500 l f
+n 7.300000 9.612500 m 7.300000 9.612500 0.250000 0.250000 90.000000 180.000000 ellipse f
+n 24.300000 9.612500 m 24.300000 9.612500 0.250000 0.250000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 7.300000 4.112500 m 24.300000 4.112500 l s
+n 7.300000 9.862500 m 24.300000 9.862500 l s
+n 7.300000 4.362500 0.250000 0.250000 180.000000 270.000000 ellipse s
+n 24.300000 4.362500 0.250000 0.250000 270.000000 360.000000 ellipse s
+n 7.050000 4.362500 m 7.050000 9.612500 l s
+n 24.550000 4.362500 m 24.550000 9.612500 l s
+n 7.300000 9.612500 0.250000 0.250000 90.000000 180.000000 ellipse s
+n 24.300000 9.612500 0.250000 0.250000 0.000000 90.000000 ellipse s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.945098 0.247059 0.247059 srgb
+n 3.800000 17.250000 m 3.800000 22.250000 l 9.500000 22.250000 l 9.500000 17.250000 l f
+n 3.800000 17.500000 m 3.800000 17.500000 0.250000 0.250000 180.000000 270.000000 ellipse f
+n 9.500000 17.500000 m 9.500000 17.500000 0.250000 0.250000 270.000000 360.000000 ellipse f
+n 3.550000 17.500000 m 3.550000 22.000000 l 9.750000 22.000000 l 9.750000 17.500000 l f
+n 3.800000 22.000000 m 3.800000 22.000000 0.250000 0.250000 90.000000 180.000000 ellipse f
+n 9.500000 22.000000 m 9.500000 22.000000 0.250000 0.250000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 3.800000 17.250000 m 9.500000 17.250000 l s
+n 3.800000 22.250000 m 9.500000 22.250000 l s
+n 3.800000 17.500000 0.250000 0.250000 180.000000 270.000000 ellipse s
+n 9.500000 17.500000 0.250000 0.250000 270.000000 360.000000 ellipse s
+n 3.550000 17.500000 m 3.550000 22.000000 l s
+n 9.750000 17.500000 m 9.750000 22.000000 l s
+n 3.800000 22.000000 0.250000 0.250000 90.000000 180.000000 ellipse s
+n 9.500000 22.000000 0.250000 0.250000 0.000000 90.000000 ellipse s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 11.355000 17.250000 m 11.355000 22.250000 l 17.055000 22.250000 l 17.055000 17.250000 l f
+n 11.355000 17.500000 m 11.355000 17.500000 0.250000 0.250000 180.000000 270.000000 ellipse f
+n 17.055000 17.500000 m 17.055000 17.500000 0.250000 0.250000 270.000000 360.000000 ellipse f
+n 11.105000 17.500000 m 11.105000 22.000000 l 17.305000 22.000000 l 17.305000 17.500000 l f
+n 11.355000 22.000000 m 11.355000 22.000000 0.250000 0.250000 90.000000 180.000000 ellipse f
+n 17.055000 22.000000 m 17.055000 22.000000 0.250000 0.250000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 11.355000 17.250000 m 17.055000 17.250000 l s
+n 11.355000 22.250000 m 17.055000 22.250000 l s
+n 11.355000 17.500000 0.250000 0.250000 180.000000 270.000000 ellipse s
+n 17.055000 17.500000 0.250000 0.250000 270.000000 360.000000 ellipse s
+n 11.105000 17.500000 m 11.105000 22.000000 l s
+n 17.305000 17.500000 m 17.305000 22.000000 l s
+n 11.355000 22.000000 0.250000 0.250000 90.000000 180.000000 ellipse s
+n 17.055000 22.000000 0.250000 0.250000 0.000000 90.000000 ellipse s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 21.555000 17.250000 m 21.555000 22.250000 l 27.255000 22.250000 l 27.255000 17.250000 l f
+n 21.555000 17.500000 m 21.555000 17.500000 0.250000 0.250000 180.000000 270.000000 ellipse f
+n 27.255000 17.500000 m 27.255000 17.500000 0.250000 0.250000 270.000000 360.000000 ellipse f
+n 21.305000 17.500000 m 21.305000 22.000000 l 27.505000 22.000000 l 27.505000 17.500000 l f
+n 21.555000 22.000000 m 21.555000 22.000000 0.250000 0.250000 90.000000 180.000000 ellipse f
+n 27.255000 22.000000 m 27.255000 22.000000 0.250000 0.250000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 21.555000 17.250000 m 27.255000 17.250000 l s
+n 21.555000 22.250000 m 27.255000 22.250000 l s
+n 21.555000 17.500000 0.250000 0.250000 180.000000 270.000000 ellipse s
+n 27.255000 17.500000 0.250000 0.250000 270.000000 360.000000 ellipse s
+n 21.305000 17.500000 m 21.305000 22.000000 l s
+n 27.505000 17.500000 m 27.505000 22.000000 l s
+n 21.555000 22.000000 0.250000 0.250000 90.000000 180.000000 ellipse s
+n 27.255000 22.000000 0.250000 0.250000 0.000000 90.000000 ellipse s
+gsave 18.350000 20.562500 translate 0.035278 -0.035278 scale
+start_ol
+1664 1920 moveto
+3264 1920 lineto
+3264 0 lineto
+1664 0 lineto
+1664 1920 lineto
+end_ol grestore 
+gsave 18.999387 20.562500 translate 0.035278 -0.035278 scale
+start_ol
+1664 1920 moveto
+3264 1920 lineto
+3264 0 lineto
+1664 0 lineto
+1664 1920 lineto
+end_ol grestore 
+gsave 19.648773 20.562500 translate 0.035278 -0.035278 scale
+start_ol
+1664 1920 moveto
+3264 1920 lineto
+3264 0 lineto
+1664 0 lineto
+1664 1920 lineto
+end_ol grestore 
+gsave 13.024625 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+640 7232 moveto
+1701 7232 lineto
+3515 4544 lineto
+5339 7232 lineto
+6400 7232 lineto
+4053 3759 lineto
+6528 0 lineto
+5477 0 lineto
+3442 3076 lineto
+1382 0 lineto
+320 0 lineto
+2914 3861 lineto
+640 7232 lineto
+end_ol grestore 
+gsave 13.858840 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+512 3072 moveto
+3136 3072 lineto
+3136 2304 lineto
+512 2304 lineto
+512 3072 lineto
+end_ol grestore 
+gsave 14.330898 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+5312 6976 moveto
+5312 6016 lineto
+4759 6307 4268 6449 conicto
+3777 6592 3320 6592 conicto
+2525 6592 2094 6277 conicto
+1664 5963 1664 5384 conicto
+1664 4897 1951 4649 conicto
+2238 4401 3038 4249 conicto
+3627 4129 lineto
+4720 3922 5240 3399 conicto
+5760 2876 5760 1998 conicto
+5760 952 5047 412 conicto
+4334 -128 2957 -128 conicto
+2438 -128 1852 -15 conicto
+1267 98 640 320 conicto
+640 1344 lineto
+1244 995 1823 817 conicto
+2403 640 2963 640 conicto
+3813 640 4274 971 conicto
+4736 1302 4736 1916 conicto
+4736 2452 4410 2754 conicto
+4085 3056 3342 3207 conicto
+2749 3322 lineto
+1635 3540 1137 4004 conicto
+640 4469 640 5297 conicto
+640 6256 1318 6808 conicto
+1996 7360 3187 7360 conicto
+3698 7360 4228 7264 conicto
+4758 7168 5312 6976 conicto
+end_ol grestore 
+gsave 15.162615 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+5632 2936 moveto
+5632 2496 lineto
+1536 2496 lineto
+1594 1589 2092 1114 conicto
+2591 640 3481 640 conicto
+3996 640 4480 768 conicto
+4964 896 5440 1152 conicto
+5440 320 lineto
+4956 101 4447 -13 conicto
+3939 -128 3416 -128 conicto
+2106 -128 1341 627 conicto
+576 1383 576 2672 conicto
+576 4004 1299 4786 conicto
+2023 5568 3250 5568 conicto
+4351 5568 4991 4860 conicto
+5632 4152 5632 2936 conicto
+4736 3200 moveto
+4726 3930 4327 4365 conicto
+3929 4800 3271 4800 conicto
+2527 4800 2080 4379 conicto
+1633 3959 1565 3195 conicto
+4736 3200 lineto
+end_ol grestore 
+gsave 15.969355 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+4096 4608 moveto
+3944 4707 3765 4753 conicto
+3587 4800 3372 4800 conicto
+2609 4800 2200 4302 conicto
+1792 3805 1792 2874 conicto
+1792 0 lineto
+896 0 lineto
+896 5440 lineto
+1792 5440 lineto
+1792 4608 lineto
+2076 5095 2531 5331 conicto
+2986 5568 3636 5568 conicto
+3729 5568 3841 5552 conicto
+3954 5536 4091 5504 conicto
+4096 4608 lineto
+end_ol grestore 
+gsave 16.508849 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+320 5440 moveto
+1270 5440 lineto
+2976 874 lineto
+4682 5440 lineto
+5632 5440 lineto
+3585 0 lineto
+2367 0 lineto
+320 5440 lineto
+end_ol grestore 
+gsave 17.285616 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+5632 2936 moveto
+5632 2496 lineto
+1536 2496 lineto
+1594 1589 2092 1114 conicto
+2591 640 3481 640 conicto
+3996 640 4480 768 conicto
+4964 896 5440 1152 conicto
+5440 320 lineto
+4956 101 4447 -13 conicto
+3939 -128 3416 -128 conicto
+2106 -128 1341 627 conicto
+576 1383 576 2672 conicto
+576 4004 1299 4786 conicto
+2023 5568 3250 5568 conicto
+4351 5568 4991 4860 conicto
+5632 4152 5632 2936 conicto
+4736 3200 moveto
+4726 3930 4327 4365 conicto
+3929 4800 3271 4800 conicto
+2527 4800 2080 4379 conicto
+1633 3959 1565 3195 conicto
+4736 3200 lineto
+end_ol grestore 
+gsave 18.092355 6.975000 translate 0.035278 -0.035278 scale
+start_ol
+4096 4608 moveto
+3944 4707 3765 4753 conicto
+3587 4800 3372 4800 conicto
+2609 4800 2200 4302 conicto
+1792 3805 1792 2874 conicto
+1792 0 lineto
+896 0 lineto
+896 5440 lineto
+1792 5440 lineto
+1792 4608 lineto
+2076 5095 2531 5331 conicto
+2986 5568 3636 5568 conicto
+3729 5568 3841 5552 conicto
+3954 5536 4091 5504 conicto
+4096 4608 lineto
+end_ol grestore 
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 6.966054 16.879747 m 12.383946 10.532753 l s
+[] 0 sd
+0 slj
+0 slc
+n 6.722588 17.164964 m 6.857064 16.622363 l 6.966054 16.879747 l 7.237355 16.946985 l ef
+n 6.722588 17.164964 m 6.857064 16.622363 l 6.966054 16.879747 l 7.237355 16.946985 l cp s
+[] 0 sd
+0 slj
+0 slc
+n 12.627412 10.247536 m 12.492936 10.790137 l 12.383946 10.532753 l 12.112645 10.465515 l ef
+n 12.627412 10.247536 m 12.492936 10.790137 l 12.383946 10.532753 l 12.112645 10.465515 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 14.307736 16.774161 m 15.697264 10.338339 l s
+[] 0 sd
+0 slj
+0 slc
+n 14.228595 17.140715 m 14.089747 16.599216 l 14.307736 16.774161 l 14.578486 16.704737 l ef
+n 14.228595 17.140715 m 14.089747 16.599216 l 14.307736 16.774161 l 14.578486 16.704737 l cp s
+[] 0 sd
+0 slj
+0 slc
+n 15.776405 9.971785 m 15.915253 10.513284 l 15.697264 10.338339 l 15.426514 10.407763 l ef
+n 15.776405 9.971785 m 15.915253 10.513284 l 15.697264 10.338339 l 15.426514 10.407763 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 24.105642 16.866122 m 19.099358 10.446378 l s
+[] 0 sd
+0 slj
+0 slc
+n 24.336247 17.161835 m 23.831631 16.921288 l 24.105642 16.866122 l 24.225916 16.613814 l ef
+n 24.336247 17.161835 m 23.831631 16.921288 l 24.105642 16.866122 l 24.225916 16.613814 l cp s
+[] 0 sd
+0 slj
+0 slc
+n 18.868753 10.150665 m 19.373369 10.391212 l 19.099358 10.446378 l 18.979084 10.698686 l ef
+n 18.868753 10.150665 m 19.373369 10.391212 l 19.099358 10.446378 l 18.979084 10.698686 l cp s
+gsave 13.450000 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+576 4992 moveto
+1152 4992 lineto
+1152 0 lineto
+576 0 lineto
+576 4992 lineto
+end_ol grestore 
+gsave 13.692267 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+2050 3200 moveto
+1575 3200 1299 2832 conicto
+1024 2464 1024 1824 conicto
+1024 1184 1298 816 conicto
+1572 448 2050 448 conicto
+2521 448 2796 817 conicto
+3072 1187 3072 1824 conicto
+3072 2458 2796 2829 conicto
+2521 3200 2050 3200 conicto
+2048 3712 moveto
+2825 3712 3268 3211 conicto
+3712 2710 3712 1824 conicto
+3712 941 3268 438 conicto
+2825 -64 2048 -64 conicto
+1268 -64 826 438 conicto
+384 941 384 1824 conicto
+384 2710 826 3211 conicto
+1268 3712 2048 3712 conicto
+end_ol grestore 
+gsave 14.226767 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+3264 3520 moveto
+3264 2944 lineto
+3012 3072 2757 3136 conicto
+2503 3200 2244 3200 conicto
+1665 3200 1344 2838 conicto
+1024 2477 1024 1824 conicto
+1024 1171 1344 809 conicto
+1665 448 2244 448 conicto
+2503 448 2757 512 conicto
+3012 576 3264 704 conicto
+3264 128 lineto
+3014 32 2745 -16 conicto
+2477 -64 2175 -64 conicto
+1353 -64 868 446 conicto
+384 957 384 1824 conicto
+384 2704 873 3208 conicto
+1362 3712 2214 3712 conicto
+2490 3712 2753 3664 conicto
+3017 3616 3264 3520 conicto
+end_ol grestore 
+gsave 14.706316 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+2272 1856 moveto
+1531 1856 1245 1692 conicto
+960 1528 960 1133 conicto
+960 818 1174 633 conicto
+1389 448 1757 448 conicto
+2265 448 2572 796 conicto
+2880 1144 2880 1722 conicto
+2880 1856 lineto
+2272 1856 lineto
+3456 2092 moveto
+3456 0 lineto
+2880 0 lineto
+2880 576 lineto
+2674 248 2366 92 conicto
+2058 -64 1612 -64 conicto
+1049 -64 716 246 conicto
+384 557 384 1078 conicto
+384 1686 795 1995 conicto
+1207 2304 2023 2304 conicto
+2880 2304 lineto
+2880 2358 lineto
+2880 2760 2605 2980 conicto
+2330 3200 1832 3200 conicto
+1516 3200 1216 3120 conicto
+917 3040 640 2880 conicto
+640 3456 lineto
+969 3584 1278 3648 conicto
+1588 3712 1882 3712 conicto
+2674 3712 3065 3310 conicto
+3456 2908 3456 2092 conicto
+end_ol grestore 
+gsave 15.240816 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+576 4992 moveto
+1152 4992 lineto
+1152 0 lineto
+576 0 lineto
+576 4992 lineto
+end_ol grestore 
+gsave 15.483083 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+3584 2195 moveto
+3584 0 lineto
+3008 0 lineto
+3008 2176 lineto
+3008 2690 2806 2945 conicto
+2604 3200 2199 3200 conicto
+1713 3200 1432 2893 conicto
+1152 2586 1152 2056 conicto
+1152 0 lineto
+576 0 lineto
+576 4992 lineto
+1152 4992 lineto
+1152 3072 lineto
+1365 3394 1654 3553 conicto
+1943 3712 2321 3712 conicto
+2945 3712 3264 3327 conicto
+3584 2942 3584 2195 conicto
+end_ol grestore 
+gsave 16.037559 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+2050 3200 moveto
+1575 3200 1299 2832 conicto
+1024 2464 1024 1824 conicto
+1024 1184 1298 816 conicto
+1572 448 2050 448 conicto
+2521 448 2796 817 conicto
+3072 1187 3072 1824 conicto
+3072 2458 2796 2829 conicto
+2521 3200 2050 3200 conicto
+2048 3712 moveto
+2825 3712 3268 3211 conicto
+3712 2710 3712 1824 conicto
+3712 941 3268 438 conicto
+2825 -64 2048 -64 conicto
+1268 -64 826 438 conicto
+384 941 384 1824 conicto
+384 2710 826 3211 conicto
+1268 3712 2048 3712 conicto
+end_ol grestore 
+gsave 16.572059 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+gsave 17.026629 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+1152 4608 moveto
+1152 3584 lineto
+2368 3584 lineto
+2368 3136 lineto
+1152 3136 lineto
+1152 1197 lineto
+1152 761 1272 636 conicto
+1393 512 1762 512 conicto
+2368 512 lineto
+2368 0 lineto
+1762 0 lineto
+1088 0 832 258 conicto
+576 516 576 1197 conicto
+576 3136 lineto
+128 3136 lineto
+128 3584 lineto
+576 3584 lineto
+576 4608 lineto
+1152 4608 lineto
+end_ol grestore 
+gsave 17.368802 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+768 832 moveto
+1408 832 lineto
+1408 0 lineto
+768 0 lineto
+768 832 lineto
+768 3392 moveto
+1408 3392 lineto
+1408 2560 lineto
+768 2560 lineto
+768 3392 lineto
+end_ol grestore 
+gsave 17.663523 9.125000 translate 0.035278 -0.035278 scale
+start_ol
+2110 4416 moveto
+1601 4416 1344 3920 conicto
+1088 3425 1088 2430 conicto
+1088 1439 1344 943 conicto
+1601 448 2110 448 conicto
+2623 448 2879 943 conicto
+3136 1439 3136 2430 conicto
+3136 3425 2879 3920 conicto
+2623 4416 2110 4416 conicto
+2112 4928 moveto
+2921 4928 3348 4288 conicto
+3776 3649 3776 2430 conicto
+3776 1215 3348 575 conicto
+2921 -64 2112 -64 conicto
+1303 -64 875 575 conicto
+448 1215 448 2430 conicto
+448 3649 875 4288 conicto
+1303 4928 2112 4928 conicto
+end_ol grestore 
+gsave 5.180219 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+1664 3328 moveto
+1664 3008 lineto
+1268 3008 lineto
+1059 3008 977 2926 conicto
+896 2845 896 2633 conicto
+896 2432 lineto
+1536 2432 lineto
+1536 2112 lineto
+896 2112 lineto
+896 0 lineto
+512 0 lineto
+512 2112 lineto
+128 2112 lineto
+128 2432 lineto
+512 2432 lineto
+512 2591 lineto
+512 2976 694 3152 conicto
+876 3328 1272 3328 conicto
+1664 3328 lineto
+end_ol grestore 
+gsave 5.385023 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+384 2432 moveto
+768 2432 lineto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+384 3328 moveto
+768 3328 lineto
+768 2816 lineto
+384 2816 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 5.547369 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+1792 2112 moveto
+1725 2145 1645 2160 conicto
+1566 2176 1470 2176 conicto
+1131 2176 949 1944 conicto
+768 1712 768 1277 conicto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+894 2275 1096 2385 conicto
+1298 2496 1588 2496 conicto
+1629 2496 1679 2496 conicto
+1729 2496 1790 2496 conicto
+1792 2112 lineto
+end_ol grestore 
+gsave 5.787140 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+1984 2368 moveto
+1984 1984 lineto
+1812 2080 1627 2128 conicto
+1442 2176 1244 2176 conicto
+942 2176 791 2083 conicto
+640 1990 640 1804 conicto
+640 1662 750 1581 conicto
+861 1500 1196 1427 conicto
+1339 1397 lineto
+1759 1305 1935 1138 conicto
+2112 972 2112 673 conicto
+2112 333 1844 134 conicto
+1576 -64 1108 -64 conicto
+913 -64 701 -16 conicto
+490 32 256 128 conicto
+256 512 lineto
+481 384 699 320 conicto
+918 256 1132 256 conicto
+1419 256 1573 355 conicto
+1728 455 1728 636 conicto
+1728 804 1614 893 conicto
+1500 982 1113 1065 conicto
+968 1097 lineto
+591 1175 423 1336 conicto
+256 1498 256 1780 conicto
+256 2123 501 2309 conicto
+747 2496 1199 2496 conicto
+1423 2496 1620 2464 conicto
+1817 2432 1984 2368 conicto
+end_ol grestore 
+gsave 6.089352 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+768 3136 moveto
+768 2432 lineto
+1600 2432 lineto
+1600 2112 lineto
+768 2112 lineto
+768 788 lineto
+768 490 850 405 conicto
+933 320 1185 320 conicto
+1600 320 lineto
+1600 0 lineto
+1185 0 lineto
+730 0 557 170 conicto
+384 340 384 788 conicto
+384 2112 lineto
+64 2112 lineto
+64 2432 lineto
+384 2432 lineto
+384 3136 lineto
+768 3136 lineto
+end_ol grestore 
+gsave 6.316637 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+end_ol grestore 
+gsave 6.501457 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+2176 2368 moveto
+2176 1984 lineto
+2010 2080 1843 2128 conicto
+1676 2176 1506 2176 conicto
+1125 2176 914 1924 conicto
+704 1672 704 1216 conicto
+704 760 914 508 conicto
+1125 256 1506 256 conicto
+1676 256 1843 304 conicto
+2010 352 2176 448 conicto
+2176 64 lineto
+2009 0 1830 -32 conicto
+1652 -64 1450 -64 conicto
+902 -64 579 282 conicto
+256 628 256 1216 conicto
+256 1812 582 2154 conicto
+908 2496 1476 2496 conicto
+1660 2496 1835 2464 conicto
+2011 2432 2176 2368 conicto
+end_ol grestore 
+gsave 6.821156 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+384 3328 moveto
+768 3328 lineto
+768 0 lineto
+384 0 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 6.983503 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+384 2432 moveto
+768 2432 lineto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+384 3328 moveto
+768 3328 lineto
+768 2816 lineto
+384 2816 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 7.145850 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+2496 1352 moveto
+2496 1152 lineto
+704 1152 lineto
+730 714 950 485 conicto
+1171 256 1565 256 conicto
+1793 256 2007 320 conicto
+2221 384 2432 512 conicto
+2432 128 lineto
+2215 34 1988 -15 conicto
+1761 -64 1527 -64 conicto
+941 -64 598 275 conicto
+256 615 256 1194 conicto
+256 1793 576 2144 conicto
+897 2496 1441 2496 conicto
+1928 2496 2212 2188 conicto
+2496 1881 2496 1352 conicto
+2112 1472 moveto
+2108 1793 1932 1984 conicto
+1757 2176 1468 2176 conicto
+1140 2176 943 1991 conicto
+747 1806 717 1470 conicto
+2112 1472 lineto
+end_ol grestore 
+gsave 7.503012 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+2432 1463 moveto
+2432 0 lineto
+2048 0 lineto
+2048 1450 lineto
+2048 1814 1908 1995 conicto
+1769 2176 1490 2176 conicto
+1155 2176 961 1959 conicto
+768 1743 768 1370 conicto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+914 2273 1111 2384 conicto
+1309 2496 1568 2496 conicto
+1994 2496 2213 2234 conicto
+2432 1972 2432 1463 conicto
+end_ol grestore 
+gsave 7.872660 19.900000 translate 0.035278 -0.035278 scale
+start_ol
+768 3136 moveto
+768 2432 lineto
+1600 2432 lineto
+1600 2112 lineto
+768 2112 lineto
+768 788 lineto
+768 490 850 405 conicto
+933 320 1185 320 conicto
+1600 320 lineto
+1600 0 lineto
+1185 0 lineto
+730 0 557 170 conicto
+384 340 384 788 conicto
+384 2112 lineto
+64 2112 lineto
+64 2432 lineto
+384 2432 lineto
+384 3136 lineto
+768 3136 lineto
+end_ol grestore 
+gsave 13.396469 19.950000 translate 0.035278 -0.035278 scale
+start_ol
+2176 2368 moveto
+2176 1984 lineto
+2010 2080 1843 2128 conicto
+1676 2176 1506 2176 conicto
+1125 2176 914 1924 conicto
+704 1672 704 1216 conicto
+704 760 914 508 conicto
+1125 256 1506 256 conicto
+1676 256 1843 304 conicto
+2010 352 2176 448 conicto
+2176 64 lineto
+2009 0 1830 -32 conicto
+1652 -64 1450 -64 conicto
+902 -64 579 282 conicto
+256 628 256 1216 conicto
+256 1812 582 2154 conicto
+908 2496 1476 2496 conicto
+1660 2496 1835 2464 conicto
+2011 2432 2176 2368 conicto
+end_ol grestore 
+gsave 13.716168 19.950000 translate 0.035278 -0.035278 scale
+start_ol
+384 3328 moveto
+768 3328 lineto
+768 0 lineto
+384 0 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 13.878515 19.950000 translate 0.035278 -0.035278 scale
+start_ol
+384 2432 moveto
+768 2432 lineto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+384 3328 moveto
+768 3328 lineto
+768 2816 lineto
+384 2816 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 14.040861 19.950000 translate 0.035278 -0.035278 scale
+start_ol
+2496 1352 moveto
+2496 1152 lineto
+704 1152 lineto
+730 714 950 485 conicto
+1171 256 1565 256 conicto
+1793 256 2007 320 conicto
+2221 384 2432 512 conicto
+2432 128 lineto
+2215 34 1988 -15 conicto
+1761 -64 1527 -64 conicto
+941 -64 598 275 conicto
+256 615 256 1194 conicto
+256 1793 576 2144 conicto
+897 2496 1441 2496 conicto
+1928 2496 2212 2188 conicto
+2496 1881 2496 1352 conicto
+2112 1472 moveto
+2108 1793 1932 1984 conicto
+1757 2176 1468 2176 conicto
+1140 2176 943 1991 conicto
+747 1806 717 1470 conicto
+2112 1472 lineto
+end_ol grestore 
+gsave 14.398024 19.950000 translate 0.035278 -0.035278 scale
+start_ol
+2432 1463 moveto
+2432 0 lineto
+2048 0 lineto
+2048 1450 lineto
+2048 1814 1908 1995 conicto
+1769 2176 1490 2176 conicto
+1155 2176 961 1959 conicto
+768 1743 768 1370 conicto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+914 2273 1111 2384 conicto
+1309 2496 1568 2496 conicto
+1994 2496 2213 2234 conicto
+2432 1972 2432 1463 conicto
+end_ol grestore 
+gsave 14.767672 19.950000 translate 0.035278 -0.035278 scale
+start_ol
+768 3136 moveto
+768 2432 lineto
+1600 2432 lineto
+1600 2112 lineto
+768 2112 lineto
+768 788 lineto
+768 490 850 405 conicto
+933 320 1185 320 conicto
+1600 320 lineto
+1600 0 lineto
+1185 0 lineto
+730 0 557 170 conicto
+384 340 384 788 conicto
+384 2112 lineto
+64 2112 lineto
+64 2432 lineto
+384 2432 lineto
+384 3136 lineto
+768 3136 lineto
+end_ol grestore 
+gsave 23.596469 20.050000 translate 0.035278 -0.035278 scale
+start_ol
+2176 2368 moveto
+2176 1984 lineto
+2010 2080 1843 2128 conicto
+1676 2176 1506 2176 conicto
+1125 2176 914 1924 conicto
+704 1672 704 1216 conicto
+704 760 914 508 conicto
+1125 256 1506 256 conicto
+1676 256 1843 304 conicto
+2010 352 2176 448 conicto
+2176 64 lineto
+2009 0 1830 -32 conicto
+1652 -64 1450 -64 conicto
+902 -64 579 282 conicto
+256 628 256 1216 conicto
+256 1812 582 2154 conicto
+908 2496 1476 2496 conicto
+1660 2496 1835 2464 conicto
+2011 2432 2176 2368 conicto
+end_ol grestore 
+gsave 23.916168 20.050000 translate 0.035278 -0.035278 scale
+start_ol
+384 3328 moveto
+768 3328 lineto
+768 0 lineto
+384 0 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 24.078515 20.050000 translate 0.035278 -0.035278 scale
+start_ol
+384 2432 moveto
+768 2432 lineto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+384 3328 moveto
+768 3328 lineto
+768 2816 lineto
+384 2816 lineto
+384 3328 lineto
+end_ol grestore 
+gsave 24.240861 20.050000 translate 0.035278 -0.035278 scale
+start_ol
+2496 1352 moveto
+2496 1152 lineto
+704 1152 lineto
+730 714 950 485 conicto
+1171 256 1565 256 conicto
+1793 256 2007 320 conicto
+2221 384 2432 512 conicto
+2432 128 lineto
+2215 34 1988 -15 conicto
+1761 -64 1527 -64 conicto
+941 -64 598 275 conicto
+256 615 256 1194 conicto
+256 1793 576 2144 conicto
+897 2496 1441 2496 conicto
+1928 2496 2212 2188 conicto
+2496 1881 2496 1352 conicto
+2112 1472 moveto
+2108 1793 1932 1984 conicto
+1757 2176 1468 2176 conicto
+1140 2176 943 1991 conicto
+747 1806 717 1470 conicto
+2112 1472 lineto
+end_ol grestore 
+gsave 24.598024 20.050000 translate 0.035278 -0.035278 scale
+start_ol
+2432 1463 moveto
+2432 0 lineto
+2048 0 lineto
+2048 1450 lineto
+2048 1814 1908 1995 conicto
+1769 2176 1490 2176 conicto
+1155 2176 961 1959 conicto
+768 1743 768 1370 conicto
+768 0 lineto
+384 0 lineto
+384 2432 lineto
+768 2432 lineto
+768 2048 lineto
+914 2273 1111 2384 conicto
+1309 2496 1568 2496 conicto
+1994 2496 2213 2234 conicto
+2432 1972 2432 1463 conicto
+end_ol grestore 
+gsave 24.967672 20.050000 translate 0.035278 -0.035278 scale
+start_ol
+768 3136 moveto
+768 2432 lineto
+1600 2432 lineto
+1600 2112 lineto
+768 2112 lineto
+768 788 lineto
+768 490 850 405 conicto
+933 320 1185 320 conicto
+1600 320 lineto
+1600 0 lineto
+1185 0 lineto
+730 0 557 170 conicto
+384 340 384 788 conicto
+384 2112 lineto
+64 2112 lineto
+64 2432 lineto
+384 2432 lineto
+384 3136 lineto
+768 3136 lineto
+end_ol grestore 
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+1.000000 1.000000 1.000000 srgb
+n 29.650000 4.112500 m 29.650000 9.912500 l 36.250000 9.912500 l 36.250000 4.112500 l f
+n 29.650000 4.362500 m 29.650000 4.362500 0.250000 0.250000 180.000000 270.000000 ellipse f
+n 36.250000 4.362500 m 36.250000 4.362500 0.250000 0.250000 270.000000 360.000000 ellipse f
+n 29.400000 4.362500 m 29.400000 9.662500 l 36.500000 9.662500 l 36.500000 4.362500 l f
+n 29.650000 9.662500 m 29.650000 9.662500 0.250000 0.250000 90.000000 180.000000 ellipse f
+n 36.250000 9.662500 m 36.250000 9.662500 0.250000 0.250000 0.000000 90.000000 ellipse f
+0.000000 0.000000 0.000000 srgb
+n 29.650000 4.112500 m 36.250000 4.112500 l s
+n 29.650000 9.912500 m 36.250000 9.912500 l s
+n 29.650000 4.362500 0.250000 0.250000 180.000000 270.000000 ellipse s
+n 36.250000 4.362500 0.250000 0.250000 270.000000 360.000000 ellipse s
+n 29.400000 4.362500 m 29.400000 9.662500 l s
+n 36.500000 4.362500 m 36.500000 9.662500 l s
+n 29.650000 9.662500 0.250000 0.250000 90.000000 180.000000 ellipse s
+n 36.250000 9.662500 0.250000 0.250000 0.000000 90.000000 ellipse s
+gsave 30.563500 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+640 4800 moveto
+3648 4800 lineto
+3648 4288 lineto
+1280 4288 lineto
+1280 2816 lineto
+3584 2816 lineto
+3584 2304 lineto
+1280 2304 lineto
+1280 512 lineto
+3712 512 lineto
+3712 0 lineto
+640 0 lineto
+640 4800 lineto
+end_ol grestore 
+gsave 31.115479 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+3648 3584 moveto
+2337 1840 lineto
+3712 0 lineto
+3011 0 lineto
+1958 1408 lineto
+898 0 lineto
+192 0 lineto
+1608 1875 lineto
+320 3584 lineto
+1023 3584 lineto
+1984 2307 lineto
+2945 3584 lineto
+3648 3584 lineto
+end_ol grestore 
+gsave 31.632491 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+1152 4608 moveto
+1152 3584 lineto
+2368 3584 lineto
+2368 3136 lineto
+1152 3136 lineto
+1152 1197 lineto
+1152 761 1272 636 conicto
+1393 512 1762 512 conicto
+2368 512 lineto
+2368 0 lineto
+1762 0 lineto
+1088 0 832 258 conicto
+576 516 576 1197 conicto
+576 3136 lineto
+128 3136 lineto
+128 3584 lineto
+576 3584 lineto
+576 4608 lineto
+1152 4608 lineto
+end_ol grestore 
+gsave 31.974663 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+3712 1944 moveto
+3712 1664 lineto
+1024 1664 lineto
+1062 1070 1389 759 conicto
+1716 448 2299 448 conicto
+2637 448 2954 528 conicto
+3272 608 3584 768 conicto
+3584 192 lineto
+3266 67 2931 1 conicto
+2597 -64 2253 -64 conicto
+1391 -64 887 437 conicto
+384 938 384 1792 conicto
+384 2675 860 3193 conicto
+1336 3712 2144 3712 conicto
+2869 3712 3290 3236 conicto
+3712 2761 3712 1944 conicto
+3136 2112 moveto
+3130 2608 2866 2904 conicto
+2603 3200 2169 3200 conicto
+1678 3200 1383 2914 conicto
+1088 2628 1043 2109 conicto
+3136 2112 lineto
+end_ol grestore 
+gsave 32.511660 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+3584 2195 moveto
+3584 0 lineto
+3008 0 lineto
+3008 2176 lineto
+3008 2690 2806 2945 conicto
+2604 3200 2199 3200 conicto
+1713 3200 1432 2893 conicto
+1152 2586 1152 2056 conicto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+1152 3584 lineto
+1152 3072 lineto
+1365 3394 1654 3553 conicto
+1943 3712 2321 3712 conicto
+2945 3712 3264 3327 conicto
+3584 2942 3584 2195 conicto
+end_ol grestore 
+gsave 33.066136 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+gsave 33.520707 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+576 3584 moveto
+1152 3584 lineto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+576 4992 moveto
+1152 4992 lineto
+1152 4224 lineto
+576 4224 lineto
+576 4992 lineto
+end_ol grestore 
+gsave 33.762974 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+2050 3200 moveto
+1575 3200 1299 2832 conicto
+1024 2464 1024 1824 conicto
+1024 1184 1298 816 conicto
+1572 448 2050 448 conicto
+2521 448 2796 817 conicto
+3072 1187 3072 1824 conicto
+3072 2458 2796 2829 conicto
+2521 3200 2050 3200 conicto
+2048 3712 moveto
+2825 3712 3268 3211 conicto
+3712 2710 3712 1824 conicto
+3712 941 3268 438 conicto
+2825 -64 2048 -64 conicto
+1268 -64 826 438 conicto
+384 941 384 1824 conicto
+384 2710 826 3211 conicto
+1268 3712 2048 3712 conicto
+end_ol grestore 
+gsave 34.297474 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+3584 2195 moveto
+3584 0 lineto
+3008 0 lineto
+3008 2176 lineto
+3008 2690 2806 2945 conicto
+2604 3200 2199 3200 conicto
+1713 3200 1432 2893 conicto
+1152 2586 1152 2056 conicto
+1152 0 lineto
+576 0 lineto
+576 3584 lineto
+1152 3584 lineto
+1152 3072 lineto
+1365 3394 1654 3553 conicto
+1943 3712 2321 3712 conicto
+2945 3712 3264 3327 conicto
+3584 2942 3584 2195 conicto
+end_ol grestore 
+gsave 34.851949 7.412500 translate 0.035278 -0.035278 scale
+start_ol
+2944 3520 moveto
+2944 2944 lineto
+2690 3072 2417 3136 conicto
+2144 3200 1851 3200 conicto
+1406 3200 1183 3066 conicto
+960 2932 960 2664 conicto
+960 2459 1123 2342 conicto
+1286 2226 1778 2121 conicto
+1988 2076 lineto
+2611 1942 2873 1697 conicto
+3136 1453 3136 1016 conicto
+3136 517 2739 226 conicto
+2342 -64 1647 -64 conicto
+1358 -64 1044 -16 conicto
+731 32 384 128 conicto
+384 768 lineto
+717 608 1040 528 conicto
+1363 448 1679 448 conicto
+2103 448 2331 588 conicto
+2560 728 2560 982 conicto
+2560 1218 2392 1343 conicto
+2224 1469 1655 1585 conicto
+1442 1633 lineto
+882 1749 633 1989 conicto
+384 2229 384 2648 conicto
+384 3158 748 3435 conicto
+1112 3712 1781 3712 conicto
+2112 3712 2404 3664 conicto
+2697 3616 2944 3520 conicto
+end_ol grestore 
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 25.036797 6.990009 m 28.913203 7.009991 l s
+[] 0 sd
+0 slj
+0 slc
+n 24.661802 6.988076 m 25.163084 6.740657 l 25.036797 6.990009 l 25.160507 7.240650 l ef
+n 24.661802 6.988076 m 25.163084 6.740657 l 25.036797 6.990009 l 25.160507 7.240650 l cp s
+[] 0 sd
+0 slj
+0 slc
+n 29.288198 7.011924 m 28.786916 7.259343 l 28.913203 7.009991 l 28.789493 6.759350 l ef
+n 29.288198 7.011924 m 28.786916 7.259343 l 28.913203 7.009991 l 28.789493 6.759350 l cp s
+showpage
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644 (file)
index 0000000..9d70243
--- /dev/null
@@ -0,0 +1,26 @@
+
+all: hacking-howto.html debugging.html userguide.html ipc.html multi-monitor.html wsbar.html refcard.pdf
+
+hacking-howto.html: hacking-howto
+       asciidoc -a toc -n $<
+
+debugging.html: debugging
+       asciidoc -n $<
+
+userguide.html: userguide
+       asciidoc -a toc -n $<
+
+ipc.html: ipc
+       asciidoc -a toc -n $<
+
+multi-monitor.html: multi-monitor
+       asciidoc -a toc -n $<
+
+wsbar.html: wsbar
+       asciidoc -a toc -n $<
+
+refcard.pdf: refcard.tex
+       pdflatex refcard.tex && pdflatex refcard.tex
+
+clean:
+       find . -regex ".*\.\(aux\|out\|log\|toc\|bm\|pdf\|dvi\|log\|html\)" -exec rm '{}' \;
diff --git a/docs/NoName-2009-03-12/i3.tex b/docs/NoName-2009-03-12/i3.tex
new file mode 100644 (file)
index 0000000..85c6442
--- /dev/null
@@ -0,0 +1,223 @@
+%
+% © 2009 Michael Stapelberg
+%
+% 2009-03-12
+%
+\documentclass[mode=print,paper=screen,style=jefka]{powerdot}
+\usepackage[utf8]{inputenc}
+\usepackage{graphicx}
+\usepackage{ngerman}
+\usepackage{url}
+\usepackage{listings}
+\newcommand{\bs}{\textbackslash}
+\pdsetup{palette=white}
+\definecolor{darkblue}{rgb}{0,0,.6}
+\definecolor{darkred}{rgb}{.6,0,0}
+\definecolor{darkgreen}{rgb}{0,.6,0}
+\definecolor{darkgray}{gray}{.3}
+\definecolor{lightblue}{rgb}{0.97,0.99,1}
+
+\lstloadlanguages{C}
+\lstdefinestyle{colors}{keywordstyle={\bf\color{darkblue}}, commentstyle={\em\color{magenta}}, stringstyle={\color{darkred}},%
+                       emphstyle={\color{darkgray}}}
+\lstnewenvironment{code}{%
+       \lstset{frame=single, basicstyle=\footnotesize\ttfamily, language=C, showstringspaces=false,%
+               style=colors, numbers=left, morekeywords={xcb_get_window_attributes_cookie_t, xcb_map_request_event_t,%
+               xcb_connection_t, xcb_get_window_attributes_reply_t, window_attributes_t, xcb_intern_atom_cookie_t,%
+               xcb_intern_atom_reply_t, xcb_atom_t},%
+               moreemph={xcb_get_window_attributes_reply, xcb_get_window_attributes_unchecked, manage_window,%
+               add_ignore_event, xcb_intern_atom, xcb_intern_atom_reply, fprintf, printf, free, load_configuration,%
+               XInternAtom, exit, strlen}}
+}{}
+\title{i3 - an improved dynamic tiling window manager}
+\author{sECuRE beim NoName e.V.\\
+~\\
+powered by \LaTeX, of course}
+\begin{document}
+\maketitle
+
+\begin{slide}{Geschichte}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> „All window managers suck, this one just sucks less”?
+       \item<2-> Desktop environment vs. window manager (GNOME, KDE, Xfce, …)
+       \item<3-> Stacking (e17, fluxbox, IceWM, fvwm, …) vs Tiling (dwm, wmii, xmonad, …)
+       \item<4-> dwm, awesome, xmonad, …: statisches Layout
+       \item<5-> wmii, ion: dynamisches layout
+       \item<6-> Problem an ion: tuomov (Lizenz, Kommunikation), Config, Look and feel
+       \item<7-> Probleme an wmii: Xinerama-support, Xlib, undokumentierter code, nur Spalten, keine Reihen, Kleinigkeiten (titellose Fenster)
+\end{list}
+\end{slide}
+
+\begin{slide}{Screenshots!}
+\centering
+Drücken Sie Mod1+2 um diese Demo zu starten.
+\end{slide}
+
+\begin{slide}{Merkmale}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> gut lesbarer, dokumentierter Code. Dokumentation.
+       \item<2-> XCB anstelle von Xlib
+       \item<3-> Xinerama done right™
+       \item<4-> Spalten und Zeilen
+       \item<5-> command-mode, wie in vim
+       \item<6-> UTF-8 clean
+       \item<7-> kein Antialiasing, schlank und schnell bleiben
+\end{list}
+\end{slide}
+
+\begin{slide}{Typische Kommunikation mit X}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> Verbindung aufbauen
+       \item<2-> Requests über die Leitung schicken (Fenster erzeugen)
+       \item<3-> Eventloop starten, reagieren (Fenster zeichnen, Eingaben, …)
+\end{list}
+\end{slide}
+
+\begin{slide}{Was genau macht ein WM?}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> Events umlenken
+       \item<2-> Neue Fenster anzeigen/positionieren (MapRequest)
+       \item<3-> Titelleisten malen (reparenting)
+       \item<4-> Den Fokus verwalten
+       \item<5-> Mit Hints umgehen (Fenstertitel, Fullscreen, Dock, …)
+       \item<6-> Auf Benutzereingaben reagieren
+\end{list}
+\end{slide}
+
+\begin{slide}{Was an X toll ist}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> Man hat an Window Manager gedacht (Mac OS X *hust*)
+       \item<2-> Netzwerk-transparent (debugging, xtrace)
+       \item<3-> Das Protokoll ist gut designed (Extensions möglich, simpel)
+\end{list}
+\end{slide}
+
+\begin{slide}[method=direct]{Protokoll, Beispielcode}
+\begin{code}
+int handle_map_request(void *prophs, xcb_connection_t *conn,
+                      xcb_map_request_event_t *event) {
+  xcb_get_window_attributes_cookie_t cookie;
+  xcb_get_window_attributes_reply_t *reply;
+
+  cookie = xcb_get_window_attributes_unchecked(conn, event->window);
+
+  if ((reply = xcb_get_window_attributes_reply(conn, cookie, NULL))
+      == NULL) {
+          LOG("Could not get window attributes\n");
+          return -1;
+  }
+
+  window_attributes_t wa = { TAG_VALUE };
+  wa.u.override_redirect = reply->override_redirect;
+
+  add_ignore_event(event->sequence);
+
+  manage_window(prophs, conn, event->window, wa);
+
+  return 1;
+}
+\end{code}
+\end{slide}
+
+\begin{slide}{Was an X nicht so toll ist}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> Einige race conditions vorhanden
+       \item<2-> Man kann nicht fein genug angeben, welche Events man gerne hätte
+       \item<3-> Xlib ist ziemlich eklig, aber es gibt ja xcb
+       \item<4-> Bugs: Keyboard state wird nicht richtig übermittelt
+       \item<5-> Ich empfehle auch: „Why X is not our ideal window system” \url{http://www.std.org/~msm/common/WhyX.pdf}
+\end{list}
+\end{slide}
+
+\begin{slide}{XCB}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item \url{http://xcb.freedesktop.org/}
+       \item<1-> „X-protocol C-language Binding”
+       \item<2-> Klein, wartbar (aus einer Protokollbeschreibung auto-generiert)
+       \item<3-> Sinnvoll benannte Funktionsnamen und Datentypen
+       \item<4-> Threadsafe (nicht dass wir das bräuchten, aber…)
+       \item<5-> Nutzt die Asynchronität von X aus
+       \item<6-> Dokumentation? Ne, das ist was für Anfänger.
+       \item<7-> xcb-util: XCB noch mal ein bisschen gekapselt, nützliche Funktionen abstrahiert
+\end{list}
+\end{slide}
+
+\begin{slide}[method=direct]{Xlib-Beispielcode}
+\begin{code}
+  char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE",
+  "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */};
+  Atom atoms[10];
+
+  /* Get atoms */
+  for (int i = 0; i < 10; i++) {
+    atoms[i] = XInternAtom(display, names[i], 0);
+  }
+\end{code}
+\end{slide}
+
+\begin{slide}[method=direct]{XCB-Beispielcode}
+\begin{code}
+char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE",
+  "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */};
+xcb_intern_atom_cookie_t cookies[10];
+
+/* Place requests for atoms as soon as possible */
+for (int c = 0; c < 10; c++)
+  xcb_intern_atom(connection, 0, strlen(names[c]), names[c]);
+
+/* Do other stuff here */
+load_configuration();
+
+/* Get atoms */
+for (int c = 0; c < 10; c++) {
+  xcb_intern_atom_reply_t *reply =
+    xcb_intern_atom_reply(connection, cookies[c], NULL);
+  if (!reply) {
+    fprintf(stderr, "Could not get atom\n");
+    exit(-1);
+  }
+  printf("atom has ID %d\n", reply->atom);
+  free(reply);
+}
+\end{code}
+\end{slide}
+
+\begin{slide}{Xft}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> „X FreeType”, library um antialiased fonts zu benutzen
+       \item<2-> Benutzt man am besten mit Pango (rendert fonts) und Cairo
+       \item<3-> Keine Möglichkeit, pixel fonts zu benutzen („x core fonts”)
+       \item<4-> Was macht man (urxvt) also? Beide APIs benutzen, fallback fonts
+       \item<5-> Was machen wir (i3)? misc-fixed-*-iso10646!\\
+               ISO 10646 = Universal Character Set, selbe Zeichen wie Unicode
+       \item<6-> Fontconfig/xft soll wohl x core fonts ablösen :-(
+\end{list}
+\end{slide}
+
+\begin{slide}{Ein paar Zahlen}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item<1-> 6118 Zeilen Code, Dokumentation, Website, READMEs
+       \item<2-> \~{} 2800 Zeilen Sourcecode
+       \item<3-> 73 KB groß (ohne debug symbols)
+\end{list}
+\end{slide}
+
+\begin{slide}{Benutzen}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item git clone \url{git://code.stapelberg.de/i3}
+       \item Debian: cd i3; dpkg-buildpackage; sudo dpkg -i ../i3-wm*deb
+       \item non-Debian: cd i3; cat DEPENDS; make; sudo make install
+       \item in \~{}/.xsession: exec /usr/bin/i3
+       \item Siehe manpage i3(1)
+\end{list}
+\end{slide}
+
+\begin{slide}{Mehr infos}
+\begin{list}{$\bullet$}{\itemsep=1em}
+       \item git-webinterface: \url{http://code.stapelberg.de/git/i3}
+       \item Website: \url{http://i3.zekjur.net}
+       \item IRC: \#i3 auf irc.twice-irc.de
+\end{list}
+\end{slide}
+
+\end{document}
diff --git a/docs/bigpicture.png b/docs/bigpicture.png
new file mode 100644 (file)
index 0000000..fc3c8db
Binary files /dev/null and b/docs/bigpicture.png differ
diff --git a/docs/bigpicture.xcf b/docs/bigpicture.xcf
new file mode 100644 (file)
index 0000000..ead0071
Binary files /dev/null and b/docs/bigpicture.xcf differ
diff --git a/docs/debugging b/docs/debugging
new file mode 100644 (file)
index 0000000..5e71ecf
--- /dev/null
@@ -0,0 +1,111 @@
+Debugging i3: How To
+====================
+Michael Stapelberg <michael+i3@stapelberg.de>
+July 2011
+
+This document describes how to debug i3 suitably for sending us useful bug
+reports, even if you have no clue of C programming.
+
+First of all: Thank you for being interested in debugging i3. It really means
+something to us to get your bug fixed. If you have any questions about the
+debugging and/or need further help, do not hesitate to contact us!
+
+== Enabling logging
+
+i3 logs useful information to stdout. To have a clearly defined place where log
+files will be saved, you should redirect stdout and stderr in your
++~/.xsession+. While you’re at it, putting each run of i3 in a separate log
+file with date/time in its filename is a good idea to not get confused about
+the different log files later on.
+
+--------------------------------------------------------------------
+exec /usr/bin/i3 >~/i3log-$(date +'%F-%k-%M-%S') 2>&1
+--------------------------------------------------------------------
+
+To enable verbose output and all levels of debug output (required when
+attaching logfiles to bugreports), add the parameters +-V -d all+, like this:
+
+--------------------------------------------------------------------
+exec /usr/bin/i3 -V -d all >~/i3log-$(date +'%F-%k-%M-%S') 2>&1
+--------------------------------------------------------------------
+
+== Enabling core dumps
+
+When i3 crashes, often you have the chance of getting a 'core dump' (an image
+of the memory of the i3 process which can be loaded into a debugger). To get a
+core dump, you have to make sure that the user limit for core dump files is set
+high enough. Many systems ship with a default value which even forbids core
+dumps completely. To disable the limit completely and thus enable core dumps,
+use the following command (in your +~/.xsession+, before starting i3):
+
+-------------------
+ulimit -c unlimited
+-------------------
+
+Furthermore, to easily recognize core dumps and allow multiple of them, you
+should set a custom core dump filename pattern, using a command like the
+following:
+
+---------------------------------------------
+sudo sysctl -w kernel.core_pattern=core.%e.%p
+---------------------------------------------
+
+This will generate files which have the executable’s file name (%e) and the
+process id (%p) in it. You can save this setting across reboots using
++/etc/sysctl.conf+.
+
+== Compiling with debug symbols
+
+To actually get useful core dumps, you should make sure that your version of i3
+is compiled with debug symbols, that is, that the symbols are not stripped
+during the build process. You can check whether your executable contains
+symbols by issuing the following command:
+
+----------------
+file $(which i3)
+----------------
+
+You should get an output like this:
+------------------------------------------------------------------------------
+/usr/bin/i3: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
+linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
+------------------------------------------------------------------------------
+
+Notice the +not stripped+, which is the important part. If you have a version
+which is stripped, please have a look if your distribution provides debug
+symbols (package +i3-wm-dbg+ on Debian for example) or if you can turn off
+stripping. If nothing helps, please build i3 from source.
+
+== Generating a backtrace
+
+Once you have made sure that your i3 is compiled with debug symbols and that
+core dumps are enabled, you can start making sense out of the core dumps.
+
+Because the core dump depends on the original executable (and its debug
+symbols), please do this as soon as you encounter the problem. If you
+re-compile i3, your core dump might be useless afterwards.
+
+Please install +gdb+, a debugger for C. No worries, you don’t need to learn it
+now.  Start gdb using the following command (replacing the actual name of the
+core dump of course):
+
+----------------------------
+gdb $(which i3) core.i3.3849
+----------------------------
+
+Then, generate a backtrace using:
+
+--------------
+backtrace full
+--------------
+
+== Sending bug reports/debugging on IRC
+
+When sending bug reports, please paste the relevant part of the log (if in
+doubt, please send us rather too much information than too less) and the whole
+backtrace (if there was a core dump).
+
+When debugging with us in IRC, be prepared to use a so called nopaste service
+such as http://nopaste.info or http://pastebin.com because pasting large
+amounts of text in IRC sometimes leads to incomplete lines (servers have line
+length limitations) or flood kicks.
diff --git a/docs/hacking-howto b/docs/hacking-howto
new file mode 100644 (file)
index 0000000..9a7ec9d
--- /dev/null
@@ -0,0 +1,782 @@
+Hacking i3: How To
+==================
+Michael Stapelberg <michael+i3@stapelberg.de>
+July 2011
+
+This document is intended to be the first thing you read before looking and/or
+touching i3’s source code. It should contain all important information to help
+you understand why things are like they are. If it does not mention something
+you find necessary, please do not hesitate to contact me.
+
+== Window Managers
+
+A window manager is not necessarily needed to run X, but it is usually used in
+combination with X to facilitate some things. The window manager's job is to
+take care of the placement of windows, to provide the user with some mechanisms
+to change the position/size of windows and to communicate with clients to a
+certain extent (for example handle fullscreen requests of clients such as
+MPlayer).
+
+There are no different contexts in which X11 clients run, so a window manager
+is just another client, like all other X11 applications. However, it handles
+some events which normal clients usually don’t handle.
+
+In the case of i3, the tasks (and order of them) are the following:
+
+. Grab the key bindings (events will be sent upon keypress/keyrelease)
+. Iterate through all existing windows (if the window manager is not started as
+  the first client of X) and manage them (reparent them, create window
+  decorations, etc.)
+. When new windows are created, manage them
+. Handle the client’s `_WM_STATE` property, but only the `_WM_STATE_FULLSCREEN`
+. Handle the client’s `WM_NAME` property
+. Handle the client’s size hints to display them proportionally
+. Handle the client’s urgency hint
+. Handle enter notifications (focus follows mouse)
+. Handle button (as in mouse buttons) presses for focus/raise on click
+. Handle expose events to re-draw own windows such as decorations
+. React to the user’s commands: Change focus, Move windows, Switch workspaces,
+  Change the layout mode of a container (default/stacking/tabbed), start a new
+  application, restart the window manager
+
+In the following chapters, each of these tasks and their implementation details
+will be discussed.
+
+=== Tiling window managers
+
+Traditionally, there are two approaches to managing windows: The most common
+one nowadays is floating, which means the user can freely move/resize the
+windows. The other approach is called tiling, which means that your window
+manager distributes windows to use as much space as possible while not
+overlapping each other.
+
+The idea behind tiling is that you should not need to waste your time
+moving/resizing windows while you usually want to get some work done. After
+all, most users sooner or later tend to lay out their windows in a way which
+corresponds to tiling or stacking mode in i3. Therefore, why not let i3 do this
+for you? Certainly, it’s faster than you could ever do it.
+
+The problem with most tiling window managers is that they are too unflexible.
+In my opinion, a window manager is just another tool, and similar to vim which
+can edit all kinds of text files (like source code, HTML, …) and is not limited
+to a specific file type, a window manager should not limit itself to a certain
+layout (like dwm, awesome, …) but provide mechanisms for you to easily create
+the layout you need at the moment.
+
+=== The layout table
+
+*********************************************************************************
+This section has not been updated for v4.0 yet, sorry! We wanted to release on
+time, but we will update this soon. Please talk to us on IRC if you need to
+know stuff *NOW* :).
+*********************************************************************************
+
+/////////////////////////////////////////////////////////////////////////////////
+To accomplish flexible layouts, we decided to simply use a table. The table
+grows and shrinks as you need it. Each cell holds a container which then holds
+windows (see picture below). You can use different layouts for each container
+(default layout and stacking layout).
+
+So, when you open a terminal and immediately open another one, they reside in
+the same container, in default layout. The layout table has exactly one column,
+one row and therefore one cell. When you move one of the terminals to the
+right, the table needs to grow. It will be expanded to two columns and one row.
+This enables you to have different layouts for each container. The table then
+looks like this:
+
+[width="15%",cols="^,^"]
+|========
+| T1 | T2
+|========
+
+When moving terminal 2 to the bottom, the table will be expanded again.
+
+[width="15%",cols="^,^"]
+|========
+| T1 |
+|    | T2
+|========
+
+You can really think of the layout table like a traditional HTML table, if
+you’ve ever designed one. Especially col- and rowspan work similarly. Below,
+you see an example of colspan=2 for the first container (which has T1 as
+window).
+
+[width="15%",cols="^asciidoc"]
+|========
+| T1
+|
+[cols="^,^",frame="none"]
+!========
+! T2 ! T3
+!========
+|========
+
+Furthermore, you can freely resize table cells.
+/////////////////////////////////////////////////////////////////////////////////
+
+== Files
+
+include/atoms.xmacro::
+A file containing all X11 atoms which i3 uses. This file will be included
+various times (for defining, requesting and receiving the atoms), each time
+with a different definition of xmacro().
+
+include/data.h::
+Contains data definitions used by nearly all files. You really need to read
+this first.
+
+include/*.h::
+Contains forward definitions for all public functions, as well as
+doxygen-compatible comments (so if you want to get a bit more of the big
+picture, either browse all header files or use doxygen if you prefer that).
+
+src/cfgparse.l::
+Contains the lexer for i3’s configuration file, written for +flex(1)+.
+
+src/cfgparse.y::
+Contains the parser for i3’s configuration file, written for +bison(1)+.
+
+src/click.c::
+Contains all functions which handle mouse button clicks (right mouse button
+clicks initiate resizing and thus are relatively complex).
+
+src/cmdparse.l::
+Contains the lexer for i3 commands, written for +flex(1)+.
+
+src/cmdparse.y::
+Contains the parser for i3 commands, written for +bison(1)+.
+
+src/con.c::
+Contains all functions which deal with containers directly (creating
+containers, searching containers, getting specific properties from containers,
+…).
+
+src/config.c::
+Contains all functions handling the configuration file (calling the parser
+(src/cfgparse.y) with the correct path, switching key bindings mode).
+
+src/debug.c::
+Contains debugging functions to print unhandled X events.
+
+src/ewmh.c::
+iFunctions to get/set certain EWMH properties easily.
+
+src/floating.c::
+Contains functions for floating mode (mostly resizing/dragging).
+
+src/handlers.c::
+Contains all handlers for all kinds of X events (new window title, new hints,
+unmapping, key presses, button presses, …).
+
+src/ipc.c::
+Contains code for the IPC interface.
+
+src/load_layout.c::
+Contains code for loading layouts from JSON files.
+
+src/log.c::
+Handles the setting of loglevels, contains the logging functions.
+
+src/main.c::
+Initializes the window manager.
+
+src/manage.c::
+Looks at existing or new windows and decides whether to manage them. If so, it
+reparents the window and inserts it into our data structures.
+
+src/match.c::
+A "match" is a data structure which acts like a mask or expression to match
+certain windows or not. For example, when using commands, you can specify a
+command like this: [title="*Firefox*"] kill. The title member of the match
+data structure will then be filled and i3 will check each window using
+match_matches_window() to find the windows affected by this command.
+
+src/move.c::
+Contains code to move a container in a specific direction.
+
+src/output.c::
+Functions to handle CT_OUTPUT cons.
+
+src/randr.c::
+The RandR API is used to get (and re-query) the configured outputs (monitors,
+…).
+
+src/render.c::
+Renders the tree data structure by assigning coordinates to every node. These
+values will later be pushed to X11 in +src/x.c+.
+
+src/resize.c::
+Contains the functions to resize containers.
+
+src/sighandler.c::
+Handles +SIGSEGV+, +SIGABRT+ and +SIGFPE+ by showing a dialog that i3 crashed.
+You can chose to let it dump core, to restart it in-place or to restart it
+in-place but forget about the layout.
+
+src/tree.c::
+Contains functions which open or close containers in the tree, change focus or
+cleanup ("flatten") the tree. See also +src/move.c+ for another similar
+function, which was moved into its own file because it is so long.
+
+src/util.c::
+Contains useful functions which are not really dependant on anything.
+
+src/window.c::
+Handlers to update X11 window properties like +WM_CLASS+, +_NET_WM_NAME+,
++CLIENT_LEADER+, etc.
+
+src/workspace.c::
+Contains all functions related to workspaces (displaying, hiding, renaming…)
+
+src/x.c::
+Transfers our in-memory tree (see +src/render.c+) to X11.
+
+src/xcb.c::
+Contains wrappers to use xcb more easily.
+
+src/xcursor.c::
+XCursor functions (for cursor themes).
+
+src/xinerama.c::
+Legacy support for Xinerama. See +src/randr.c+ for the preferred API.
+
+== Data structures
+
+*********************************************************************************
+This section has not been updated for v4.0 yet, sorry! We wanted to release on
+time, but we will update this soon. Please talk to us on IRC if you need to
+know stuff *NOW* :).
+*********************************************************************************
+
+/////////////////////////////////////////////////////////////////////////////////
+
+See include/data.h for documented data structures. The most important ones are
+explained right here.
+
+image:bigpicture.png[The Big Picture]
+
+/////////////////////////////////////////////////////////////////////////////////
+
+So, the hierarchy is:
+
+. *X11 root window*, the root container
+. *Virtual screens* (Screen 0 in this example)
+. *Content container* (there are also containers for dock windows)
+. *Workspaces* (Workspace 1 in this example, with horizontal orientation)
+. *Split container* (vertically split)
+. *X11 window containers*
+
+The data type is +Con+, in all cases.
+
+=== Virtual screens
+
+A virtual screen (type `i3Screen`) is generated from the connected outputs
+obtained through RandR. The difference to the raw RandR outputs as seen
+when using +xrandr(1)+ is that it falls back to the lowest common resolution of
+the actual enabled outputs.
+
+For example, if your notebook has a screen resolution of 1280x800 px and you
+connect a video projector with a resolution of 1024x768 px, set it up in clone
+mode (+xrandr \--output VGA1 \--mode 1024x768 \--same-as LVDS1+), i3 will have
+one virtual screen.
+
+However, if you configure it using +xrandr \--output VGA1 \--mode 1024x768
+\--right-of LVDS1+, i3 will generate two virtual screens. For each virtual
+screen, a new workspace will be assigned. New workspaces are created on the
+screen you are currently on.
+
+=== Workspace
+
+A workspace is identified by its name. Basically, you could think of
+workspaces as different desks in your office, if you like the desktop
+methaphor. They just contain different sets of windows and are completely
+separate of each other. Other window managers also call this ``Virtual
+desktops''.
+
+=== The layout table
+
+*********************************************************************************
+This section has not been updated for v4.0 yet, sorry! We wanted to release on
+time, but we will update this soon. Please talk to us on IRC if you need to
+know stuff *NOW* :).
+*********************************************************************************
+
+/////////////////////////////////////////////////////////////////////////////////
+
+Each workspace has a table, which is just a two-dimensional dynamic array
+containing Containers (see below). This table grows and shrinks as you need it
+(by moving windows to the right you can create a new column in the table, by
+moving them to the bottom you create a new row).
+
+/////////////////////////////////////////////////////////////////////////////////
+
+=== Container
+
+*********************************************************************************
+This section has not been updated for v4.0 yet, sorry! We wanted to release on
+time, but we will update this soon. Please talk to us on IRC if you need to
+know stuff *NOW* :).
+*********************************************************************************
+
+/////////////////////////////////////////////////////////////////////////////////
+
+A container is the content of a table’s cell. It holds an arbitrary amount of
+windows and has a specific layout (default layout, stack layout or tabbed
+layout). Containers can consume multiple table cells by modifying their
+colspan/rowspan attribute.
+
+/////////////////////////////////////////////////////////////////////////////////
+
+=== Client
+
+A client is x11-speak for a window.
+
+== List/queue macros
+
+i3 makes heavy use of the list macros defined in BSD operating systems. To
+ensure that the operating system on which i3 is compiled has all the expected
+features, i3 comes with `include/queue.h`. On BSD systems, you can use man
+`queue(3)`. On Linux, you have to use google (or read the source).
+
+The lists used are +SLIST+ (single linked lists), +CIRCLEQ+ (circular
+queues) and +TAILQ+ (tail queues). Usually, only forward traversal is necessary,
+so an `SLIST` works fine. If inserting elements at arbitrary positions or at
+the end of a list is necessary, a +TAILQ+ is used instead. However, for the
+windows inside a container, a +CIRCLEQ+ is necessary to go from the currently
+selected window to the window above/below.
+
+== Naming conventions
+
+There is a row of standard variables used in many events. The following names
+should be chosen for those:
+
+ * ``conn'' is the xcb_connection_t
+ * ``event'' is the event of the particular type
+ * ``con'' names a container
+ * ``current'' is a loop variable when using +TAILQ_FOREACH+ etc.
+
+== Startup (src/mainx.c, main())
+
+ * Establish the xcb connection
+ * Check for XKB extension on the separate X connection, load Xcursor
+ * Check for RandR screens (with a fall-back to Xinerama)
+ * Grab the keycodes for which bindings exist
+ * Manage all existing windows
+ * Enter the event loop
+
+== Keybindings
+
+=== Grabbing the bindings
+
+Grabbing the bindings is quite straight-forward. You pass X your combination of
+modifiers and the keycode you want to grab and whether you want to grab them
+actively or passively. Most bindings (everything except for bindings using
+Mode_switch) are grabbed passively, that is, just the window manager gets the
+event and cannot replay it.
+
+We need to grab bindings that use Mode_switch actively because of a bug in X.
+When the window manager receives the keypress/keyrelease event for an actively
+grabbed keycode, it has to decide what to do with this event: It can either
+replay it so that other applications get it or it can prevent other
+applications from receiving it.
+
+So, why do we need to grab keycodes actively? Because X does not set the
+state-property of keypress/keyrelease events properly. The Mode_switch bit is
+not set and we need to get it using XkbGetState. This means we cannot pass X
+our combination of modifiers containing Mode_switch when grabbing the key and
+therefore need to grab the keycode itself without any modifiers. This means,
+if you bind Mode_switch + keycode 38 ("a"), i3 will grab keycode 38 ("a") and
+check on each press of "a" if the Mode_switch bit is set using XKB. If yes, it
+will handle the event, if not, it will replay the event.
+
+=== Handling a keypress
+
+As mentioned in "Grabbing the bindings", upon a keypress event, i3 first gets
+the correct state.
+
+Then, it looks through all bindings and gets the one which matches the received
+event.
+
+The bound command is parsed by the cmdparse lexer/parser, see +parse_cmd+ in
++src/cmdparse.y+.
+
+== Manage windows (src/main.c, manage_window() and reparent_window())
+
+`manage_window()` does some checks to decide whether the window should be
+managed at all:
+
+ * Windows have to be mapped, that is, visible on screen
+ * The override_redirect must not be set. Windows with override_redirect shall
+   not be managed by a window manager
+
+Afterwards, i3 gets the intial geometry and reparents the window (see
+`reparent_window()`) if it wasn’t already managed.
+
+Reparenting means that for each window which is reparented, a new window,
+slightly larger than the original one, is created. The original window is then
+reparented to the bigger one (called "frame").
+
+After reparenting, the window type (`_NET_WM_WINDOW_TYPE`) is checked to see
+whether this window is a dock (`_NET_WM_WINDOW_TYPE_DOCK`), like dzen2 for
+example. Docks are handled differently, they don’t have decorations and are not
+assigned to a specific container. Instead, they are positioned at the bottom
+of the screen. To get the height which needs to be reserved for the window,
+the `_NET_WM_STRUT_PARTIAL` property is used.
+
+Furthermore, the list of assignments (to other workspaces, which may be on
+other screens) is checked. If the window matches one of the user’s criteria,
+it may either be put in floating mode or moved to a different workspace. If the
+target workspace is not visible, the window will not be mapped.
+
+== What happens when an application is started?
+
+i3 does not care for applications. All it notices is when new windows are
+mapped (see `src/handlers.c`, `handle_map_request()`). The window is then
+reparented (see section "Manage windows").
+
+After reparenting the window, `render_tree()` is called which renders the
+internal layout table. The new window has been placed in the currently focused
+container and therefore the new window and the old windows (if any) need to be
+moved/resized so that the currently active layout (default/stacking/tabbed mode)
+is rendered correctly. To move/resize windows, a window is ``configured'' in
+X11-speak.
+
+Some applications, such as MPlayer obviously assume the window manager is
+stupid and try to configure their windows by themselves. This generates an
+event called configurerequest. i3 handles these events and tells the window the
+size it had before the configurerequest (with the exception of not yet mapped
+windows, which get configured like they want to, and floating windows, which
+can reconfigure themselves).
+
+== _NET_WM_STATE
+
+Only the _NET_WM_STATE_FULLSCREEN atom is handled. It calls
+``toggle_fullscreen()'' for the specific client which just configures the
+client to use the whole screen on which it currently is. Also, it is set as
+fullscreen_client for the i3Screen.
+
+== WM_NAME
+
+When the WM_NAME property of a window changes, its decoration (containing the
+title) is re-rendered. Note that WM_NAME is in COMPOUND_TEXT encoding which is
+totally uncommon and cumbersome. Therefore, the _NET_WM_NAME atom will be used
+if present.
+
+== _NET_WM_NAME
+
+Like WM_NAME, this atom contains the title of a window. However, _NET_WM_NAME
+is encoded in UTF-8. i3 will recode it to UCS-2 in order to be able to pass it
+to X. Using an appropriate font (ISO-10646), you can see most special
+characters (every special character contained in your font).
+
+== Size hints
+
+Size hints specify the minimum/maximum size for a given window as well as its
+aspect ratio.  This is important for clients like mplayer, who only set the
+aspect ratio and resize their window to be as small as possible (but only with
+some video outputs, for example in Xv, while when using x11, mplayer does the
+necessary centering for itself).
+
+So, when an aspect ratio was specified, i3 adjusts the height of the window
+until the size maintains the correct aspect ratio. For the code to do this, see
+src/layout.c, function resize_client().
+
+== Rendering (src/layout.c, render_layout() and render_container())
+
+*********************************************************************************
+This section has not been updated for v4.0 yet, sorry! We wanted to release on
+time, but we will update this soon. Please talk to us on IRC if you need to
+know stuff *NOW* :).
+*********************************************************************************
+
+/////////////////////////////////////////////////////////////////////////////////
+
+
+There are several entry points to rendering: `render_layout()`,
+`render_workspace()` and `render_container()`. The former one calls
+`render_workspace()` for every screen, which in turn will call
+`render_container()` for every container inside its layout table. Therefore, if
+you need to render only a single container, for example because a window was
+removed, added or changed its title, you should directly call
+render_container().
+
+Rendering consists of two steps: In the first one, in `render_workspace()`, each
+container gets its position (screen offset + offset in the table) and size
+(container's width times colspan/rowspan). Then, `render_container()` is called,
+which takes different approaches, depending on the mode the container is in:
+
+=== Common parts
+
+On the frame (the window which was created around the client’s window for the
+decorations), a black rectangle is drawn as a background for windows like
+MPlayer, which do not completely fit into the frame.
+
+=== Default mode
+
+Each clients gets the container’s width and an equal amount of height.
+
+=== Stack mode
+
+In stack mode, a window containing the decorations of all windows inside the
+container is placed at the top. The currently focused window is then given the
+whole remaining space.
+
+=== Tabbed mode
+
+Tabbed mode is like stack mode, except that the window decorations are drawn
+in one single line at the top of the container.
+
+=== Window decorations
+
+The window decorations consist of a rectangle in the appropriate color (depends
+on whether this window is the currently focused one, the last focused one in a
+not focused container or not focused at all) forming the background.
+Afterwards, two lighter lines are drawn and the last step is drawing the
+window’s title (see WM_NAME) onto it.
+
+=== Fullscreen windows
+
+For fullscreen windows, the `rect` (x, y, width, height) is not changed to
+allow the client to easily go back to its previous position. Instead,
+fullscreen windows are skipped when rendering.
+
+=== Resizing containers
+
+By clicking and dragging the border of a container, you can resize the whole
+column (respectively row) which this container is in. This is necessary to keep
+the table layout working and consistent.
+
+The resizing works similarly to the resizing of floating windows or movement of
+floating windows:
+
+* A new, invisible window with the size of the root window is created
+  (+grabwin+)
+* Another window, 2px width and as high as your screen (or vice versa for
+  horizontal resizing) is created. Its background color is the border color and
+  it is only there to inform the user how big the container will be (it
+  creates the impression of dragging the border out of the container).
+* The +drag_pointer+ function of +src/floating.c+ is called to grab the pointer
+  and enter its own event loop which will pass all events (expose events) but
+  motion notify events. This function then calls the specified callback
+  (+resize_callback+) which does some boundary checking and moves the helper
+  window. As soon as the mouse button is released, this loop will be
+  terminated.
+* The new width_factor for each involved column (respectively row) will be
+  calculated.
+
+/////////////////////////////////////////////////////////////////////////////////
+
+== User commands / commandmode (src/cmdparse.{l,y})
+
+*********************************************************************************
+This section has not been updated for v4.0 yet, sorry! We wanted to release on
+time, but we will update this soon. Please talk to us on IRC if you need to
+know stuff *NOW* :).
+*********************************************************************************
+
+/////////////////////////////////////////////////////////////////////////////////
+
+
+Like in vim, you can control i3 using commands. They are intended to be a
+powerful alternative to lots of shortcuts, because they can be combined. There
+are a few special commands, which are the following:
+
+exec <command>::
+Starts the given command by passing it to `/bin/sh`.
+
+restart::
+Restarts i3 by executing `argv[0]` (the path with which you started i3) without
+forking.
+
+w::
+"With". This is used to select a bunch of windows. Currently, only selecting
+the whole container in which the window is in, is supported by specifying "w".
+
+f, s, d::
+Toggle fullscreen, stacking, default mode for the current window/container.
+
+The other commands are to be combined with a direction. The directions are h,
+j, k and l, like in vim (h = left, j = down, k = up, l = right). When you just
+specify the direction keys, i3 will move the focus in that direction. You can
+provide "m" or "s" before the direction to move a window respectively or snap.
+
+/////////////////////////////////////////////////////////////////////////////////
+
+== Moving containers
+
+The movement code is pretty delicate. You need to consider all cases before
+making any changes or before being able to fully understand how it works.
+
+=== Case 1: Moving inside the same container
+
+The reference layout for this case is a single workspace in horizontal
+orientation with two containers on it. Focus is on the left container (1).
+
+
+[width="15%",cols="^,^"]
+|========
+| 1 | 2
+|========
+
+When moving the left window to the right (command +move right+), tree_move will
+look for a container with horizontal orientation and finds the parent of the
+left container, that is, the workspace. Afterwards, it runs the code branch
+commented with "the easy case": it calls TAILQ_NEXT to get the container right
+of the current one and swaps both containers.
+
+=== Case 2: Move a container into a split container
+
+The reference layout for this case is a horizontal workspace with two
+containers. The right container is a v-split with two containers. Focus is on
+the left container (1).
+
+[width="15%",cols="^,^"]
+|========
+1.2+^.^| 1 | 2
+| 3
+|========
+
+When moving to the right (command +move right+), i3 will work like in case 1
+("the easy case"). However, as the right container is not a leaf container, but
+a v-split, the left container (1) will be inserted at the right position (below
+2, assuming that 2 is focused inside the v-split) by calling +insert_con_into+.
+
++insert_con_into+ detaches the container from its parent and inserts it
+before/after the given target container. Afterwards, the on_remove_child
+callback is called on the old parent container which will then be closed, if
+empty.
+
+Afterwards, +con_focus+ will be called to fix the focus stack and the tree will
+be flattened.
+
+=== Case 3: Moving to non-existant top/bottom
+
+Like in case 1, the reference layout for this case is a single workspace in
+horizontal orientation with two containers on it. Focus is on the left
+container:
+
+[width="15%",cols="^,^"]
+|========
+| 1 | 2
+|========
+
+This time however, the command is +move up+ or +move down+. tree_move will look
+for a container with vertical orientation. As it will not find any,
++same_orientation+ is NULL and therefore i3 will perform a forced orientation
+change on the workspace by creating a new h-split container, moving the
+workspace contents into it and then changing the workspace orientation to
+vertical. Now it will again search for parent containers with vertical
+orientation and it will find the workspace.
+
+This time, the easy case code path will not be run as we are not moving inside
+the same container. Instead, +insert_con_into+ will be called with the focused
+container and the container above/below the current one (on the level of
++same_orientation+).
+
+Now, +con_focus+ will be called to fix the focus stack and the tree will be
+flattened.
+
+=== Case 4: Moving to existant top/bottom
+
+The reference layout for this case is a vertical workspace with two containers.
+The bottom one is a h-split containing two containers (1 and 2). Focus is on
+the bottom left container (1).
+
+[width="15%",cols="^,^"]
+|========
+2+| 3
+| 1 | 2
+|========
+
+This case is very much like case 3, only this time the forced workspace
+orientation change does not need to be performed because the workspace already
+is in vertical orientation.
+
+=== Case 5: Moving in one-child h-split
+
+The reference layout for this case is a horizontal workspace with two
+containers having a v-split on the left side with a one-child h-split on the
+bottom. Focus is on the bottom left container (2(h)):
+
+[width="15%",cols="^,^"]
+|========
+| 1 1.2+^.^| 3
+| 2(h)
+|========
+
+In this case, +same_orientation+ will be set to the h-split container around
+the focused container. However, when trying the easy case, the next/previous
+container +swap+ will be NULL. Therefore, i3 will search again for a
++same_orientation+ container, this time starting from the parent of the h-split
+container.
+
+After determining a new +same_orientation+ container (if it is NULL, the
+orientation will be force-changed), this case is equivalent to case 2 or case
+4.
+
+
+=== Case 6: Floating containers
+
+The reference layout for this case is a horizontal workspace with two
+containers plus one floating h-split container. Focus is on the floating
+container.
+
+TODO: nice illustration. table not possible?
+
+When moving up/down, the container needs to leave the floating container and it
+needs to be placed on the workspace (at workspace level). This is accomplished
+by calling the function +attach_to_workspace+.
+
+== Click handling
+
+Without much ado, here is the list of cases which need to be considered:
+
+* click to focus (tiling + floating) and raise (floating)
+* click to focus/raise when in stacked/tabbed mode
+* floating_modifier + left mouse button to drag a floating con
+* floating_modifier + right mouse button to resize a floating con
+* click on decoration in a floating con to either initiate a resize (if there
+  is more than one child in the floating con) or to drag the
+  floating con (if it’s the one at the top).
+* click on border in a floating con to resize the floating con
+* floating_modifier + right mouse button to resize a tiling con
+* click on border/decoration to resize a tiling con
+
+== Gotchas
+
+* Forgetting to call `xcb_flush(conn);` after sending a request. This usually
+  leads to code which looks like it works fine but which does not work under
+  certain conditions.
+
+== Using git / sending patches
+
+For a short introduction into using git, see
+http://www.spheredev.org/wiki/Git_for_the_lazy or, for more documentation, see
+http://git-scm.com/documentation
+
+When you want to send a patch because you fixed a bug or implemented a cool
+feature (please talk to us before working on features to see whether they are
+maybe already implemented, not possible for some some reason, or don’t fit
+into the concept), please use git to create a patchfile.
+
+First of all, update your working copy to the latest version of the master
+branch:
+
+--------
+git pull
+--------
+
+Afterwards, make the necessary changes for your bugfix/feature. Then, review
+the changes using +git diff+ (you might want to enable colors in the diff using
++git config diff.color auto+).  When you are definitely done, use +git commit
+-a+ to commit all changes you’ve made.
+
+Then, use the following command to generate a patchfile which we can directly
+apply to the branch, preserving your commit message and name:
+
+-----------------------
+git format-patch origin
+-----------------------
+
+Just send us the generated file via email.
diff --git a/docs/ipc b/docs/ipc
new file mode 100644 (file)
index 0000000..7e71326
--- /dev/null
+++ b/docs/ipc
@@ -0,0 +1,519 @@
+IPC interface (interprocess communication)
+==========================================
+Michael Stapelberg <michael+i3@stapelberg.de>
+March 2010
+
+This document describes how to interface with i3 from a separate process. This
+is useful for example to remote-control i3 (to write test cases for example) or
+to get various information like the current workspaces to implement an external
+workspace bar.
+
+The method of choice for IPC in our case is a unix socket because it has very
+little overhead on both sides and is usually available without headaches in
+most languages. In the default configuration file, the ipc-socket gets created
+in +/tmp/i3-%u/ipc-socket.%p+ where +%u+ is your UNIX username and +%p+ is the
+PID of i3.
+
+All i3 utilities, like +i3-msg+ and +i3-input+ will read the +I3_SOCKET_PATH+
+X11 property, stored on the X11 root window.
+
+== Establishing a connection
+
+To establish a connection, simply open the IPC socket. The following code
+snippet illustrates this in Perl:
+
+-------------------------------------------------------------
+use IO::Socket::UNIX;
+my $sock = IO::Socket::UNIX->new(Peer => '/tmp/i3-ipc.sock');
+-------------------------------------------------------------
+
+== Sending messages to i3
+
+To send a message to i3, you have to format in the binary message format which
+i3 expects. This format specifies a magic string in the beginning to ensure
+the integrity of messages (to prevent follow-up errors). Following the magic
+string comes the length of the payload of the message as 32-bit integer, and
+the type of the message as 32-bit integer (the integers are not converted, so
+they are in native byte order).
+
+The magic string currently is "i3-ipc" and will only be changed when a change
+in the IPC API is done which breaks compatibility (we hope that we don’t need
+to do that).
+
+Currently implemented message types are the following:
+
+COMMAND (0)::
+       The payload of the message is a command for i3 (like the commands you
+       can bind to keys in the configuration file) and will be executed
+       directly after receiving it. There is no reply to this message.
+GET_WORKSPACES (1)::
+       Gets the current workspaces. The reply will be a JSON-encoded list of
+       workspaces (see the reply section).
+SUBSCRIBE (2)::
+       Subscribes your connection to certain events. See <<events>> for a
+       description of this message and the concept of events.
+GET_OUTPUTS (3)::
+       Gets the current outputs. The reply will be a JSON-encoded list of outputs
+       (see the reply section).
+GET_TREE (4)::
+       Gets the layout tree. i3 uses a tree as data structure which includes
+       every container. The reply will be the JSON-encoded tree (see the reply
+       section).
+
+So, a typical message could look like this:
+--------------------------------------------------
+"i3-ipc" <message length> <message type> <payload>
+--------------------------------------------------
+
+Or, as a hexdump:
+------------------------------------------------------------------------------
+00000000  69 33 2d 69 70 63 04 00  00 00 00 00 00 00 65 78  |i3-ipc........ex|
+00000010  69 74 0a                                          |it.|
+------------------------------------------------------------------------------
+
+To generate and send such a message, you could use the following code in Perl:
+------------------------------------------------------------
+sub format_ipc_command {
+    my ($msg) = @_;
+    my $len;
+    # Get the real byte count (vs. amount of characters)
+    { use bytes; $len = length($msg); }
+    return "i3-ipc" . pack("LL", $len, 0) . $msg;
+}
+
+$sock->write(format_ipc_command("exit"));
+------------------------------------------------------------------------------
+
+== Receiving replies from i3
+
+Replies from i3 usually consist of a simple string (the length of the string
+is the message_length, so you can consider them length-prefixed) which in turn
+contain the JSON serialization of a data structure. For example, the
+GET_WORKSPACES message returns an array of workspaces (each workspace is a map
+with certain attributes).
+
+=== Reply format
+
+The reply format is identical to the normal message format. There also is
+the magic string, then the message length, then the message type and the
+payload.
+
+The following reply types are implemented:
+
+COMMAND (0)::
+       Confirmation/Error code for the COMMAND message.
+GET_WORKSPACES (1)::
+       Reply to the GET_WORKSPACES message.
+SUBSCRIBE (2)::
+       Confirmation/Error code for the SUBSCRIBE message.
+GET_OUTPUTS (3)::
+       Reply to the GET_OUTPUTS message.
+GET_TREE (4)::
+       Reply to the GET_TREE message.
+
+=== COMMAND reply
+
+The reply consists of a single serialized map. At the moment, the only
+property is +success (bool)+, but this will be expanded in future versions.
+
+*Example:*
+-------------------
+{ "success": true }
+-------------------
+
+=== GET_WORKSPACES reply
+
+The reply consists of a serialized list of workspaces. Each workspace has the
+following properties:
+
+num (integer)::
+       The logical number of the workspace. Corresponds to the command
+       to switch to this workspace.
+name (string)::
+       The name of this workspace (by default num+1), as changed by the
+       user. Encoded in UTF-8.
+visible (boolean)::
+       Whether this workspace is currently visible on an output (multiple
+       workspaces can be visible at the same time).
+focused (boolean)::
+       Whether this workspace currently has the focus (only one workspace
+       can have the focus at the same time).
+urgent (boolean)::
+       Whether a window on this workspace has the "urgent" flag set.
+rect (map)::
+       The rectangle of this workspace (equals the rect of the output it
+       is on), consists of x, y, width, height.
+output (string)::
+       The video output this workspace is on (LVDS1, VGA1, …).
+
+*Example:*
+-------------------
+[
+ {
+  "num": 0,
+  "name": "1",
+  "visible": true,
+  "focused": true,
+  "urgent": false,
+  "rect": {
+   "x": 0,
+   "y": 0,
+   "width": 1280,
+   "height": 800
+  },
+  "output": "LVDS1"
+ },
+ {
+  "num": 1,
+  "name": "2",
+  "visible": false,
+  "focused": false,
+  "urgent": false,
+  "rect": {
+   "x": 0,
+   "y": 0,
+   "width": 1280,
+   "height": 800
+  },
+  "output": "LVDS1"
+ }
+]
+-------------------
+
+=== SUBSCRIBE reply
+
+The reply consists of a single serialized map. The only property is
++success (bool)+, indicating whether the subscription was successful (the
+default) or whether a JSON parse error occurred.
+
+*Example:*
+-------------------
+{ "success": true }
+-------------------
+
+=== GET_OUTPUTS reply
+
+The reply consists of a serialized list of outputs. Each output has the
+following properties:
+
+name (string)::
+       The name of this output (as seen in +xrandr(1)+). Encoded in UTF-8.
+active (boolean)::
+       Whether this output is currently active (has a valid mode).
+current_workspace (integer)::
+       The current workspace which is visible on this output. +null+ if the
+       output is not active.
+rect (map)::
+       The rectangle of this output (equals the rect of the output it
+       is on), consists of x, y, width, height.
+
+*Example:*
+-------------------
+[
+ {
+  "name": "LVDS1",
+  "active": true,
+  "current_workspace": 4,
+  "rect": {
+   "x": 0,
+   "y": 0,
+   "width": 1280,
+   "height": 800
+  }
+ },
+ {
+  "name": "VGA1",
+  "active": true,
+  "current_workspace": 1,
+  "rect": {
+   "x": 1280,
+   "y": 0,
+   "width": 1280,
+   "height": 1024
+  },
+ }
+]
+-------------------
+
+=== GET_TREE reply
+
+The reply consists of a serialized tree. Each node in the tree (representing
+one container) has at least the properties listed below. While the nodes might
+have more properties, please do not use any properties which are not documented
+here. They are not yet finalized and will probably change!
+
+id (integer)::
+       The internal ID (actually a C pointer value) of this container. Do not
+       make any assumptions about it. You can use it to (re-)identify and
+       address containers when talking to i3.
+name (string)::
+       The internal name of this container. For all containers which are part
+       of the tree structure down to the workspace contents, this is set to a
+       nice human-readable name of the container.
+       For all other containers, the content is not defined (yet).
+border (string)::
+       Can be either "normal", "none" or "1pixel", dependending on the
+       container’s border style.
+layout (string)::
+       Can be either "default", "stacked", "tabbed", "dockarea" or "output".
+       Other values might be possible in the future, should we add new
+       layouts.
+orientation (string)::
+       Can be either "none" (for non-split containers), "horizontal" or
+       "vertical".
+percent (float)::
+       The percentage which this container takes in its parent. A value of
+       +null+ means that the percent property does not make sense for this
+       container, for example for the root container.
+rect (map)::
+       The absolute display coordinates for this container. Display
+       coordinates means that when you have two 1600x1200 monitors on a single
+       X11 Display (the standard way), the coordinates of the first window on
+       the second monitor are +{ "x": 1600, "y": 0, "width": 1600, "height":
+       1200 }+.
+window_rect (map)::
+       The coordinates of the *actual client window* inside its container.
+       These coordinates are relative to the container and do not include the
+       window decoration (which is actually rendered on the parent container).
+       So, when using the +default+ layout, you will have a 2 pixel border on
+       each side, making the window_rect +{ "x": 2, "y": 0, "width": 632,
+       "height": 366 }+ (for example).
+geometry (map)::
+       The original geometry the window specified when i3 mapped it. Used when
+       switching a window to floating mode, for example.
+urgent (bool)::
+       Whether this container (window or workspace) has the urgency hint set.
+focused (bool)::
+       Whether this container is currently focused.
+
+Please note that in the following example, I have left out some keys/values
+which are not relevant for the type of the node. Otherwise, the example would
+be by far too long (it already is quite long, despite showing only 1 window and
+one dock window).
+
+It is useful to have an overview of the structure before taking a look at the
+JSON dump:
+
+* root
+** LVDS1
+*** topdock
+*** content
+**** workspace 1
+***** window 1
+*** bottomdock
+**** dock window 1
+** VGA1
+
+*Example:*
+-----------------------
+{
+ "id": 6875648,
+ "name": "root",
+ "rect": {
+   "x": 0,
+   "y": 0,
+   "width": 1280,
+   "height": 800
+ },
+ "nodes": [
+
+   {
+    "id": 6878320,
+    "name": "LVDS1",
+    "layout": "output",
+    "rect": {
+      "x": 0,
+      "y": 0,
+      "width": 1280,
+      "height": 800
+    },
+    "nodes": [
+
+      {
+       "id": 6878784,
+       "name": "topdock",
+       "layout": "dockarea",
+       "orientation": "vertical",
+       "rect": {
+         "x": 0,
+        "y": 0,
+        "width": 1280,
+        "height": 0
+       },
+      },
+
+      {
+       "id": 6879344,
+       "name": "content",
+       "rect": {
+         "x": 0,
+        "y": 0,
+        "width": 1280,
+        "height": 782
+       },
+       "nodes": [
+
+         {
+          "id": 6880464,
+         "name": "1",
+         "orientation": "horizontal",
+         "rect": {
+            "x": 0,
+           "y": 0,
+           "width": 1280,
+           "height": 782
+         },
+         "floating_nodes": [],
+         "nodes": [
+
+            {
+             "id": 6929968,
+            "name": "#aa0000",
+            "border": "normal",
+            "percent": 1,
+            "rect": {
+               "x": 0,
+              "y": 18,
+              "width": 1280,
+              "height": 782
+            }
+           }
+
+         ]
+        }
+
+       ]
+      },
+
+      {
+       "id": 6880208,
+       "name": "bottomdock",
+       "layout": "dockarea",
+       "orientation": "vertical",
+       "rect": {
+         "x": 0,
+        "y": 782,
+        "width": 1280,
+        "height": 18
+       },
+       "nodes": [
+
+         {
+          "id": 6931312,
+         "name": "#00aa00",
+         "percent": 1,
+         "rect": {
+            "x": 0,
+           "y": 782,
+           "width": 1280,
+           "height": 18
+         }
+        }
+
+       ]
+      }
+    ]
+   }
+ ]
+}
+------------------------
+
+
+== Events
+
+[[events]]
+
+To get informed when certain things happen in i3, clients can subscribe to
+events. Events consist of a name (like "workspace") and an event reply type
+(like I3_IPC_EVENT_WORKSPACE). The events sent by i3 are in the same format
+as replies to specific commands. However, the highest bit of the message type
+is set to 1 to indicate that this is an event reply instead of a normal reply.
+
+Caveat: As soon as you subscribe to an event, it is not guaranteed any longer
+that the requests to i3 are processed in order. This means, the following
+situation can happen: You send a GET_WORKSPACES request but you receive a
+"workspace" event before receiving the reply to GET_WORKSPACES. If your
+program does not want to cope which such kinds of race conditions (an
+event based library may not have a problem here), I suggest you create a
+separate connection to receive events.
+
+=== Subscribing to events
+
+By sending a message of type SUBSCRIBE with a JSON-encoded array as payload
+you can register to an event.
+
+*Example:*
+---------------------------------
+type: SUBSCRIBE
+payload: [ "workspace", "focus" ]
+---------------------------------
+
+
+=== Available events
+
+The numbers in parenthesis is the event type (keep in mind that you need to
+strip the highest bit first).
+
+workspace (0)::
+       Sent when the user switches to a different workspace, when a new
+       workspace is initialized or when a workspace is removed (because the
+       last client vanished).
+output (1)::
+       Sent when RandR issues a change notification (of either screens,
+       outputs, CRTCs or output properties).
+
+*Example:*
+--------------------------------------------------------------------
+# the appropriate 4 bytes read from the socket are stored in $input
+
+# unpack a 32-bit unsigned integer
+my $message_type = unpack("L", $input);
+
+# check if the highest bit is 1
+my $is_event = (($message_type >> 31) == 1);
+
+# use the other bits
+my $event_type = ($message_type & 0x7F);
+
+if ($is_event) {
+  say "Received event of type $event_type";
+}
+--------------------------------------------------------------------
+
+=== workspace event
+
+This event consists of a single serialized map containing a property
++change (string)+ which indicates the type of the change ("focus", "init",
+"empty", "urgent").
+
+*Example:*
+---------------------
+{ "change": "focus" }
+---------------------
+
+=== output event
+
+This event consists of a single serialized map containing a property
++change (string)+ which indicates the type of the change (currently only
+"unspecified").
+
+*Example:*
+---------------------------
+{ "change": "unspecified" }
+---------------------------
+
+== See also
+
+For some languages, libraries are available (so you don’t have to implement
+all this on your own). This list names some (if you wrote one, please let me
+know):
+
+C::
+       i3 includes a headerfile +i3/ipc.h+ which provides you all constants.
+       However, there is no library yet.
+Ruby::
+       http://github.com/badboy/i3-ipc
+Perl::
+       http://search.cpan.org/search?query=AnyEvent::I3
+Python::
+       http://github.com/thepub/i3ipc
diff --git a/docs/keyboard-layer1.png b/docs/keyboard-layer1.png
new file mode 100644 (file)
index 0000000..52ffae0
Binary files /dev/null and b/docs/keyboard-layer1.png differ
diff --git a/docs/keyboard-layer1.svg b/docs/keyboard-layer1.svg
new file mode 100644 (file)
index 0000000..109c19a
--- /dev/null
@@ -0,0 +1,969 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="900"
+   height="300"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   version="1.0"
+   sodipodi:docname="keyboard-layer1.svg"
+   inkscape:export-filename="/home/michael/i3/keyboard.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 150 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="900 : 150 : 1"
+       inkscape:persp3d-origin="450 : 100 : 1"
+       id="perspective174" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path5387"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5390"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="Tail"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Tail"
+       style="overflow:visible">
+      <g
+         id="g5342"
+         transform="scale(-1.2)">
+        <path
+           id="path5344"
+           d="M -3.8048674,-3.9585227 L 0.54352094,-0.00068114835"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5346"
+           d="M -1.2866832,-3.9585227 L 3.0617053,-0.00068114835"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5348"
+           d="M 1.3053582,-3.9585227 L 5.6537466,-0.00068114835"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5350"
+           d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5352"
+           d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5354"
+           d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path5363"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(-5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path5369"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(-5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Send"
+       style="overflow:visible;">
+      <path
+         id="path5375"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.2) rotate(180)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Send"
+       style="overflow:visible;">
+      <path
+         id="path5357"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.3) rotate(180) translate(-5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path5381"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path5372"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) translate(-5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0437869"
+     inkscape:cx="366.05395"
+     inkscape:cy="149.64675"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:grid-points="true"
+     showgrid="true"
+     gridtolerance="15px"
+     showborder="false"
+     inkscape:window-width="956"
+     inkscape:window-height="1126"
+     inkscape:window-x="1600"
+     inkscape:window-y="54"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-to-guides="false"
+     inkscape:snap-grids="false"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0px"
+       originy="0px"
+       spacingx="7.5px"
+       spacingy="7.5px"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.12156863"
+       empopacity="0.25098039"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,0 L 60,0 L 60,60 L 0,60 L 0,0 z "
+       id="rect2186" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 60,0 L 120,0 L 120,60 L 60,60 L 60,0 z "
+       id="rect2218" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 120,0 L 180,0 L 180,60 L 120,60 L 120,0 z "
+       id="rect2222" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 180,0 L 240,0 L 240,60 L 180,60 L 180,0 z "
+       id="rect2228" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 240,0 L 300,0 L 300,60 L 240,60 L 240,0 z "
+       id="rect2230" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 300,0 L 360,0 L 360,60 L 300,60 L 300,0 z "
+       id="rect2232" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 360,0 L 420,0 L 420,60 L 360,60 L 360,0 z "
+       id="rect2234" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 420,0 L 480,0 L 480,60 L 420,60 L 420,0 z "
+       id="rect2236" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 480,0 L 540,0 L 540,60 L 480,60 L 480,0 z "
+       id="rect2238" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 540,0 L 600,0 L 600,60 L 540,60 L 540,0 z "
+       id="rect2240" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 600,0 L 660,0 L 660,60 L 600,60 L 600,0 z "
+       id="rect2242" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 660,0 L 720,0 L 720,60 L 660,60 L 660,0 z "
+       id="rect2244" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 720,0 L 780,0 L 780,60 L 720,60 L 720,0 z "
+       id="rect2246" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 780,0 L 900,0 L 900,60 L 780,60 L 780,0 z "
+       id="rect2248" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,60 L 90,60 L 90,120 L 0,120 L 0,60 z "
+       id="rect2250" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 90,60 L 150,60 L 150,120 L 90,120 L 90,60 z "
+       id="rect2252" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 150,60 L 210,60 L 210,120 L 150,120 L 150,60 z "
+       id="rect2254" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 210,60 L 270,60 L 270,120 L 210,120 L 210,60 z "
+       id="rect2256" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 270,60 L 330,60 L 330,120 L 270,120 L 270,60 z "
+       id="rect2258" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 330,60 60,0 0,60 -60,0 0,-60 z"
+       id="rect2262" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 390,60 L 450,60 L 450,120 L 390,120 L 390,60 z "
+       id="rect2264" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 450,60 L 510,60 L 510,120 L 450,120 L 450,60 z "
+       id="rect2266" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 510,60 L 570,60 L 570,120 L 510,120 L 510,60 z "
+       id="rect2270" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 570,60 L 630,60 L 630,120 L 570,120 L 570,60 z "
+       id="rect2272" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 630,60 L 690,60 L 690,120 L 630,120 L 630,60 z "
+       id="rect2274" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 690,60 L 750,60 L 750,120 L 690,120 L 690,60 z "
+       id="rect2278" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 750,60 L 810,60 L 810,120 L 750,120 L 750,60 z "
+       id="rect2280" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 810,60 L 900,60 L 900,120 L 810,120 L 810,60 z "
+       id="rect2284" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,120 L 105,120 L 105,180 L 0,180 L 0,120 z "
+       id="rect2286" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 105,120 L 165,120 L 165,180 L 105,180 L 105,120 z "
+       id="rect2292" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 165,120 L 225,120 L 225,180 L 165,180 L 165,120 z "
+       id="rect2296" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 225,120 L 285,120 L 285,180 L 225,180 L 225,120 z "
+       id="rect2298" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 285,120 L 345,120 L 345,180 L 285,180 L 285,120 z "
+       id="rect2300" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 345,120 L 405,120 L 405,180 L 345,180 L 345,120 z "
+       id="rect2302" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 405,120 L 465,120 L 465,180 L 405,180 L 405,120 z "
+       id="rect2306" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 465,120 L 525,120 L 525,180 L 465,180 L 465,120 z "
+       id="rect2308" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 525,120 L 585,120 L 585,180 L 525,180 L 525,120 z "
+       id="rect2312" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 585,120 L 645,120 L 645,180 L 585,180 L 585,120 z "
+       id="rect2314" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 645,120 L 705,120 L 705,180 L 645,180 L 645,120 z "
+       id="rect2316" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 705,120 L 765,120 L 765,180 L 705,180 L 705,120 z "
+       id="rect2318" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 765,120 L 900,120 L 900,180 L 765,180 L 765,120 z "
+       id="rect2320" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,180 L 135,180 L 135,240 L 0,240 L 0,180 z "
+       id="rect2322" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 135,180 L 195,180 L 195,240 L 135,240 L 135,180 z "
+       id="rect2324" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 195,180 L 255,180 L 255,240 L 195,240 L 195,180 z "
+       id="rect2326" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 255,180 L 315,180 L 315,240 L 255,240 L 255,180 z "
+       id="rect2330" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 315,180 L 375,180 L 375,240 L 315,240 L 315,180 z "
+       id="rect2334" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 375,180 L 435,180 L 435,240 L 375,240 L 375,180 z "
+       id="rect2336" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 435,180 L 495,180 L 495,240 L 435,240 L 435,180 z "
+       id="rect2338" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 495,180 L 555,180 L 555,240 L 495,240 L 495,180 z "
+       id="rect2340" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 555,180 L 615,180 L 615,240 L 555,240 L 555,180 z "
+       id="rect2342" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 615,180 L 675,180 L 675,240 L 615,240 L 615,180 z "
+       id="rect2344" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 675,180 L 735,180 L 735,240 L 675,240 L 675,180 z "
+       id="rect2346" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 735,180 L 900,180 L 900,240 L 735,240 L 735,180 z "
+       id="rect2348" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,240 L 90,240 L 90,300 L 0,300 L 0,240 z "
+       id="rect2350" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 810,240 L 900,240 L 900,300 L 810,300 L 810,240 z "
+       id="rect2352" />
+    <path
+       style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 150,240 L 240,240 L 240,300 L 150,300 L 150,240 z "
+       id="rect2354" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 600,240 L 690,240 L 690,300 L 600,300 L 600,240 z "
+       id="rect2360" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 240,240 L 600,240 L 600,300 L 240,300 L 240,240 z "
+       id="rect2362" />
+    <path
+       style="fill:#efefef;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 90,240 L 150,240 L 150,300 L 90,300 L 90,240 z "
+       id="rect2364" />
+    <path
+       style="fill:#efefef;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 690,240 L 750,240 L 750,300 L 690,300 L 690,240 z "
+       id="rect2366" />
+    <path
+       style="fill:#efefef;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 750,240 L 810,240 L 810,300 L 750,300 L 750,240 z "
+       id="rect2368" />
+    <path
+       style=""
+       d=""
+       id="flowRoot4146" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 75.351563,18.826172 L 74.4375,11.056641 L 74.4375,6.3691406 L 78.046875,6.3691406 L 78.046875,11.056641 L 77.132813,18.826172 L 75.351563,18.826172 M 74.484375,23.630859 L 74.484375,20.173828 L 77.964844,20.173828 L 77.964844,23.630859 L 74.484375,23.630859 M 75.351563,53.630859 L 75.351563,42.158203 L 71.34375,42.158203 L 71.34375,39.802734 L 71.601563,39.802734 C 73.062496,39.802748 74.124995,39.576186 74.789063,39.123047 C 75.460931,38.669937 75.855462,37.912125 75.972656,36.849609 L 78.65625,36.849609 L 78.65625,53.630859 L 75.351563,53.630859"
+       id="text5091" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 23.34375,14.220703 L 23.34375,16.810547 C 22.531233,17.365241 21.761702,17.775396 21.035156,18.041016 C 20.316391,18.298833 19.605455,18.42774 18.902344,18.427734 C 18.542956,18.42774 18.183581,18.39649 17.824219,18.333984 C 17.464832,18.27149 17.105457,18.181646 16.746094,18.064453 C 16.558583,18.001959 16.281239,17.904303 15.914063,17.771484 C 14.203116,17.185553 12.902336,16.892585 12.011719,16.892578 C 11.34765,16.892585 10.652339,17.041022 9.9257813,17.337891 C 9.2070275,17.626959 8.3984345,18.091802 7.5,18.732422 L 7.5,16.142578 C 8.3359346,15.580086 9.1328088,15.162118 9.890625,14.888672 C 10.648432,14.607431 11.363275,14.466806 12.035156,14.466797 C 12.949211,14.466806 14.085929,14.693368 15.445313,15.146484 C 15.46874,15.154305 15.484365,15.158212 15.492188,15.158203 C 15.632802,15.205087 15.847646,15.279305 16.136719,15.380859 C 17.347644,15.810555 18.285143,16.025398 18.949219,16.025391 C 19.613267,16.025398 20.29686,15.880867 21,15.591797 C 21.703109,15.302743 22.484358,14.845712 23.34375,14.220703 M 11.988281,35.033203 L 15.011719,35.033203 L 17.320313,39.369141 L 15.65625,39.369141 L 11.988281,35.033203"
+       id="text5103" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 136.47578,20.443359 C 136.04608,21.099612 135.54999,21.583986 134.9875,21.896484 C 134.42499,22.201173 133.76093,22.353517 132.99532,22.353516 C 131.76093,22.353517 130.81953,22.01758 130.1711,21.345703 C 129.53047,20.673831 129.21015,19.681645 129.21016,18.369141 C 129.21015,16.50196 129.75312,14.935556 130.83907,13.669922 C 131.93281,12.404308 133.27656,11.771496 134.87032,11.771484 C 135.4953,11.771496 136.03827,11.900402 136.49922,12.158203 C 136.96015,12.416027 137.33905,12.798839 137.63594,13.306641 L 138.25703,12.158203 L 140.34297,12.158203 L 138.62032,19.166016 C 138.59686,19.251958 138.57733,19.341801 138.56172,19.435547 C 138.54608,19.521488 138.53827,19.591801 138.53828,19.646484 C 138.53827,19.919926 138.63202,20.126957 138.81953,20.267578 C 139.00702,20.400394 139.28436,20.4668 139.65157,20.466797 C 139.95624,20.4668 140.27264,20.388675 140.60078,20.232422 C 140.9367,20.076175 141.2492,19.857426 141.53828,19.576172 C 142.21014,18.951177 142.71795,18.220709 143.06172,17.384766 C 143.41326,16.548835 143.58904,15.630867 143.58907,14.630859 C 143.58904,12.75587 142.86248,11.216809 141.40938,10.013672 C 139.96405,8.8027492 138.09686,8.1972811 135.80782,8.1972656 C 134.70624,8.1972811 133.6789,8.3300934 132.72578,8.5957031 C 131.78046,8.8613429 130.92109,9.2558737 130.14766,9.7792969 C 128.81953,10.669935 127.79609,11.783215 127.07735,13.119141 C 126.36641,14.455087 126.01094,15.91993 126.01094,17.513672 C 126.01094,19.912113 126.81953,21.83008 128.43672,23.267578 C 130.0539,24.697265 132.21406,25.412108 134.91719,25.412109 C 136.1828,25.412108 137.41718,25.220702 138.62032,24.837891 C 139.83124,24.455077 140.95623,23.90039 141.99532,23.173828 L 142.95625,24.544922 C 141.76092,25.443358 140.49139,26.119138 139.14766,26.572266 C 137.81171,27.025387 136.41718,27.25195 134.96407,27.251953 C 133.46405,27.25195 132.08515,27.060543 130.82735,26.677734 C 129.56953,26.302732 128.45234,25.744139 127.47578,25.001953 C 126.26484,24.05664 125.35859,22.966798 124.75703,21.732422 C 124.15547,20.49805 123.85469,19.099614 123.85469,17.537109 C 123.85469,16.232429 124.05781,14.990243 124.46407,13.810547 C 124.87813,12.623058 125.48359,11.544934 126.28047,10.576172 C 127.43672,9.1621238 128.82734,8.0918124 130.45235,7.3652344 C 132.07734,6.6386889 133.88593,6.275408 135.87813,6.2753906 C 137.19843,6.275408 138.43671,6.4550953 139.59297,6.8144531 C 140.75702,7.1660321 141.76873,7.6660316 142.62813,8.3144531 C 143.68279,9.1347801 144.46795,10.072279 144.9836,11.126953 C 145.50701,12.17384 145.76873,13.357432 145.76875,14.677734 C 145.76873,15.966805 145.51092,17.15821 144.99532,18.251953 C 144.48748,19.337895 143.75311,20.267581 142.79219,21.041016 C 142.2453,21.478518 141.64764,21.814455 140.99922,22.048828 C 140.35858,22.275392 139.69061,22.388673 138.99532,22.388672 C 138.16718,22.388673 137.54218,22.224611 137.12032,21.896484 C 136.70624,21.568361 136.4914,21.083987 136.47578,20.443359 M 137.06172,15.427734 C 136.96015,14.794931 136.73358,14.314462 136.38203,13.986328 C 136.03827,13.650401 135.58124,13.482432 135.01094,13.482422 C 134.1203,13.482432 133.34687,13.966807 132.69063,14.935547 C 132.03437,15.904305 131.70624,17.068366 131.70625,18.427734 C 131.70624,19.146489 131.86249,19.693363 132.175,20.068359 C 132.49531,20.443363 132.95624,20.630862 133.55782,20.630859 C 134.20624,20.630862 134.79608,20.384769 135.32735,19.892578 C 135.8664,19.400395 136.23358,18.75977 136.42891,17.970703 L 137.06172,15.427734 M 128.56563,53.630859 C 128.58125,52.130861 128.90156,50.861331 129.52657,49.822266 C 130.15156,48.775395 131.26094,47.716803 132.85469,46.646484 C 133.09687,46.482429 133.44844,46.255867 133.90938,45.966797 C 136.01875,44.615243 137.07343,43.314463 137.07344,42.064453 C 137.07343,41.322278 136.85078,40.736341 136.40547,40.306641 C 135.96015,39.876967 135.35078,39.662123 134.57735,39.662109 C 133.73359,39.662123 133.08125,39.927748 132.62032,40.458984 C 132.16719,40.982435 131.94062,41.732434 131.94063,42.708984 L 131.94063,42.849609 L 128.84688,42.849609 C 128.84688,40.927747 129.3625,39.44728 130.39375,38.408203 C 131.425,37.369157 132.89375,36.849626 134.8,36.849609 C 136.52656,36.849626 137.90546,37.322282 138.93672,38.267578 C 139.96796,39.205093 140.48358,40.455091 140.4836,42.017578 C 140.48358,43.134776 140.21405,44.103525 139.675,44.923828 C 139.13593,45.744149 138.09296,46.677741 136.5461,47.724609 C 136.21796,47.951178 135.76484,48.248052 135.18672,48.615234 C 133.71797,49.560551 132.88984,50.2793 132.70235,50.771484 L 140.31953,50.771484 L 140.31953,53.630859 L 128.56563,53.630859"
+       id="text5127" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 195.28125,13.693359 L 194.25,16.552734 L 197.19141,16.552734 L 198.19922,13.693359 L 195.28125,13.693359 M 195.28125,6.4746094 L 197.87109,6.4746094 L 196.16016,11.337891 L 198.99609,11.337891 L 200.73047,6.4746094 L 203.32031,6.4746094 L 201.58594,11.337891 L 204.90234,11.337891 L 204.03516,13.693359 L 200.75391,13.693359 L 199.76953,16.529297 L 203.16797,16.529297 L 202.33594,18.873047 L 198.92578,18.873047 L 197.19141,23.748047 L 194.60156,23.748047 L 196.33594,18.873047 L 193.47656,18.873047 L 191.73047,23.748047 L 189.15234,23.748047 L 190.86328,18.873047 L 187.5,18.873047 L 188.39063,16.529297 L 191.69531,16.529297 L 192.70313,13.693359 L 189.19922,13.693359 L 190.06641,11.337891 L 193.54688,11.337891 L 195.28125,6.4746094 M 190.07813,48.521484 L 193.30078,48.521484 C 193.30859,49.458989 193.53515,50.166019 193.98047,50.642578 C 194.42578,51.111331 195.08593,51.345705 195.96094,51.345703 C 196.80468,51.345705 197.45312,51.126956 197.90625,50.689453 C 198.36718,50.244144 198.59765,49.607426 198.59766,48.779297 C 198.59765,47.951178 198.32812,47.326178 197.78906,46.904297 C 197.2578,46.474617 196.46484,46.259773 195.41016,46.259766 C 195.35546,46.259773 195.26953,46.263679 195.15234,46.271484 C 195.04296,46.279304 194.96093,46.28321 194.90625,46.283203 L 194.90625,43.962891 L 195.26953,43.962891 C 196.23827,43.9629 196.95312,43.7754 197.41406,43.400391 C 197.8828,43.017589 198.11718,42.435558 198.11719,41.654297 C 198.11718,41.005872 197.91796,40.494154 197.51953,40.119141 C 197.1289,39.736342 196.59374,39.544936 195.91406,39.544922 C 195.17187,39.544936 194.59765,39.763686 194.19141,40.201172 C 193.78515,40.638685 193.58203,41.259778 193.58203,42.064453 L 193.58203,42.205078 L 190.41797,42.205078 C 190.45703,40.486341 190.96094,39.169936 191.92969,38.255859 C 192.90625,37.334001 194.28125,36.873064 196.05469,36.873047 C 197.73437,36.873064 199.0664,37.283219 200.05078,38.103516 C 201.03514,38.923843 201.52733,40.02931 201.52734,41.419922 C 201.52733,42.154308 201.35936,42.798839 201.02344,43.353516 C 200.68749,43.908213 200.18358,44.365244 199.51172,44.724609 C 200.37108,45.099618 201.01952,45.619149 201.45703,46.283203 C 201.90233,46.93946 202.12499,47.724615 202.125,48.638672 C 202.12499,50.318363 201.57421,51.650393 200.47266,52.634766 C 199.37108,53.619141 197.86718,54.111328 195.96094,54.111328 C 194.07812,54.111328 192.625,53.634766 191.60156,52.681641 C 190.58594,51.720705 190.07812,50.357425 190.07813,48.591797 L 190.07813,48.521484"
+       id="text5139" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 254.46094,21.451172 C 255.10155,21.365237 255.58984,21.134768 255.92578,20.759766 C 256.26171,20.384769 256.42968,19.884769 256.42969,19.259766 C 256.42968,18.705083 256.26952,18.248052 255.94922,17.888672 C 255.63671,17.52149 255.14062,17.236335 254.46094,17.033203 L 254.46094,21.451172 M 253.06641,13.435547 L 253.06641,9.4511719 C 252.45703,9.529311 251.99218,9.7402483 251.67188,10.083984 C 251.35156,10.419935 251.1914,10.87306 251.19141,11.443359 C 251.1914,11.919934 251.33984,12.318371 251.63672,12.638672 C 251.9414,12.958995 252.41796,13.22462 253.06641,13.435547 M 253.06641,26.267578 L 253.06641,24.017578 C 251.30078,23.908203 249.98047,23.396485 249.10547,22.482422 C 248.23047,21.568361 247.79297,20.24805 247.79297,18.521484 L 250.93359,18.521484 C 250.97265,19.365239 251.16796,20.033207 251.51953,20.525391 C 251.8789,21.009768 252.39453,21.318362 253.06641,21.451172 L 253.06641,16.599609 C 251.2539,16.138679 249.96484,15.537117 249.19922,14.794922 C 248.43359,14.052744 248.05078,13.03712 248.05078,11.748047 C 248.05078,10.318373 248.5039,9.1660301 249.41016,8.2910156 C 250.32422,7.4160318 251.54296,6.959001 253.06641,6.9199219 L 253.06641,5.4199219 L 254.46094,5.4199219 L 254.46094,6.9199219 C 255.98437,6.9980635 257.17186,7.4590005 258.02344,8.3027344 C 258.87499,9.1386864 259.34374,10.318373 259.42969,11.841797 L 256.24219,11.841797 C 256.18749,11.115247 256.01171,10.56056 255.71484,10.177734 C 255.42577,9.7871232 255.0078,9.5683734 254.46094,9.5214844 L 254.46094,13.787109 C 256.39062,14.388681 257.74999,15.07618 258.53906,15.849609 C 259.32811,16.623054 259.72264,17.642584 259.72266,18.908203 C 259.72264,20.400394 259.26171,21.591799 258.33984,22.482422 C 257.42577,23.373047 256.1328,23.892578 254.46094,24.041016 L 254.46094,26.267578 L 253.06641,26.267578 M 254.64844,47.419922 L 254.64844,40.236328 L 250.08984,47.419922 L 254.64844,47.419922 M 254.57813,53.630859 L 254.57813,50.009766 L 247.5,50.009766 L 247.5,47.056641 L 253.6875,37.330078 L 257.84766,37.330078 L 257.84766,47.337891 L 259.79297,47.337891 L 259.79297,50.009766 L 257.84766,50.009766 L 257.84766,53.630859 L 254.57813,53.630859"
+       id="text5145" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 320.42578,19.740234 C 320.42577,20.263675 320.60155,20.705081 320.95313,21.064453 C 321.30467,21.416018 321.73827,21.591799 322.25391,21.591797 C 322.75389,21.591799 323.18358,21.412112 323.54297,21.052734 C 323.90233,20.68555 324.08201,20.24805 324.08203,19.740234 C 324.08201,19.240239 323.90233,18.814458 323.54297,18.462891 C 323.19139,18.103521 322.7617,17.923834 322.25391,17.923828 C 321.73827,17.923834 321.30467,18.099615 320.95313,18.451172 C 320.60155,18.794927 320.42577,19.224614 320.42578,19.740234 M 317.88281,19.740234 C 317.8828,18.521489 318.30468,17.494147 319.14844,16.658203 C 319.99217,15.822273 321.02733,15.404305 322.25391,15.404297 C 323.45701,15.404305 324.48045,15.830086 325.32422,16.681641 C 326.17576,17.525397 326.60154,18.544927 326.60156,19.740234 C 326.60154,20.943362 326.17576,21.974611 325.32422,22.833984 C 324.47264,23.685547 323.4492,24.111328 322.25391,24.111328 C 321.02733,24.111328 319.99217,23.689453 319.14844,22.845703 C 318.30468,22.001955 317.8828,20.9668 317.88281,19.740234 M 311.07422,24.111328 L 321.08203,6.8496094 L 322.96875,6.8496094 L 312.96094,24.111328 L 311.07422,24.111328 M 310.04297,11.220703 C 310.04297,11.73634 310.21484,12.169933 310.55859,12.521484 C 310.91015,12.873058 311.34375,13.048839 311.85938,13.048828 C 312.36718,13.048839 312.79687,12.873058 313.14844,12.521484 C 313.50781,12.162121 313.68749,11.728528 313.6875,11.220703 C 313.68749,10.720716 313.50781,10.294935 313.14844,9.9433594 C 312.79687,9.5839984 312.36718,9.4043111 311.85938,9.4042969 C 311.34375,9.4043111 310.91015,9.5800922 310.55859,9.9316406 C 310.21484,10.275404 310.04297,10.705091 310.04297,11.220703 M 307.5,11.220703 C 307.5,10.001967 307.92187,8.9707178 308.76563,8.1269531 C 309.60937,7.275407 310.64062,6.8496262 311.85938,6.8496094 C 313.06249,6.8496262 314.08593,7.2793132 314.92969,8.1386719 C 315.78124,8.990249 316.20702,10.017592 316.20703,11.220703 C 316.20702,12.423839 315.78124,13.451182 314.92969,14.302734 C 314.08593,15.146493 313.06249,15.568367 311.85938,15.568359 C 310.63281,15.568367 309.59765,15.150399 308.75391,14.314453 C 307.91797,13.478526 307.5,12.447277 307.5,11.220703 M 310.85156,49.119141 L 314.13281,49.119141 C 314.1875,49.853519 314.43359,50.423831 314.87109,50.830078 C 315.30859,51.228518 315.89453,51.427737 316.62891,51.427734 C 317.53515,51.427737 318.22655,51.162112 318.70313,50.630859 C 319.18749,50.099613 319.42968,49.337895 319.42969,48.345703 C 319.42968,47.416022 319.18358,46.685554 318.69141,46.154297 C 318.19921,45.615242 317.51952,45.345711 316.65234,45.345703 C 316.16796,45.345711 315.74218,45.443368 315.375,45.638672 C 315.00781,45.833992 314.69531,46.123054 314.4375,46.505859 L 311.41406,46.330078 L 312.50391,37.330078 L 322.14844,37.330078 L 322.14844,40.166016 L 314.87109,40.166016 L 314.4375,43.529297 C 314.80468,43.240245 315.22656,43.025401 315.70313,42.884766 C 316.17968,42.736339 316.71093,42.66212 317.29688,42.662109 C 318.96874,42.66212 320.3164,43.169932 321.33984,44.185547 C 322.37108,45.20118 322.88671,46.53321 322.88672,48.181641 C 322.88671,49.986332 322.3203,51.427737 321.1875,52.505859 C 320.05468,53.576172 318.53515,54.111328 316.62891,54.111328 C 314.89453,54.111328 313.51172,53.669922 312.48047,52.787109 C 311.45703,51.896486 310.91406,50.673831 310.85156,49.119141"
+       id="text5151" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 373.13672,6.5214844 L 376.08984,6.5214844 L 381.72656,13.095703 L 378.97266,13.095703 L 374.625,8.7480469 L 370.25391,13.095703 L 367.5,13.095703 L 373.13672,6.5214844 M 372.15234,48.298828 C 372.15234,49.25977 372.39062,50.021488 372.86719,50.583984 C 373.35156,51.146487 374.00781,51.427737 374.83594,51.427734 C 375.60937,51.427737 376.21484,51.154299 376.65234,50.607422 C 377.08983,50.06055 377.30858,49.298832 377.30859,48.322266 C 377.30858,47.423834 377.08202,46.724616 376.62891,46.224609 C 376.17577,45.724617 375.53905,45.474618 374.71875,45.474609 C 373.91406,45.474618 373.28515,45.724617 372.83203,46.224609 C 372.3789,46.724616 372.15234,47.416022 372.15234,48.298828 M 372.10547,43.916016 C 372.48828,43.525401 372.94921,43.232432 373.48828,43.037109 C 374.02734,42.833995 374.6289,42.732433 375.29297,42.732422 C 376.93358,42.732433 378.24608,43.232432 379.23047,44.232422 C 380.22264,45.23243 380.71874,46.56446 380.71875,48.228516 C 380.71874,49.994144 380.17968,51.419924 379.10156,52.505859 C 378.02343,53.591797 376.60155,54.134765 374.83594,54.134766 C 372.79687,54.134765 371.24609,53.431641 370.18359,52.025391 C 369.1289,50.619144 368.60156,48.560552 368.60156,45.849609 C 368.60156,42.935558 369.16797,40.708997 370.30078,39.169922 C 371.43359,37.623063 373.0664,36.849626 375.19922,36.849609 C 376.68358,36.849626 377.8789,37.236345 378.78516,38.009766 C 379.69921,38.783218 380.19921,39.830092 380.28516,41.150391 L 376.88672,41.150391 C 376.80858,40.611341 376.59765,40.205092 376.25391,39.931641 C 375.91015,39.658217 375.42968,39.521498 374.8125,39.521484 C 373.96874,39.521498 373.32031,39.888686 372.86719,40.623047 C 372.41406,41.349622 372.16015,42.447277 372.10547,43.916016"
+       id="text5157" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 432.85547,16.095703 L 431.96484,16.740234 C 431.60546,16.990241 431.33593,17.291022 431.15625,17.642578 C 430.97656,17.994146 430.88671,18.388677 430.88672,18.826172 C 430.88671,19.490239 431.11328,20.048832 431.56641,20.501953 C 432.01953,20.955081 432.58593,21.181643 433.26563,21.181641 C 433.76562,21.181643 434.24218,21.080081 434.69531,20.876953 C 435.15624,20.666019 435.58202,20.361331 435.97266,19.962891 L 432.85547,16.095703 M 433.79297,12.404297 L 434.20313,12.111328 C 434.57812,11.853527 434.85546,11.564465 435.03516,11.244141 C 435.21483,10.923841 435.30468,10.556654 435.30469,10.142578 C 435.30468,9.7441545 435.17968,9.4277486 434.92969,9.1933594 C 434.68749,8.958999 434.35546,8.8418117 433.93359,8.8417969 C 433.5039,8.8418117 433.16406,8.9629053 432.91406,9.2050781 C 432.66406,9.4394673 432.53906,9.7597795 432.53906,10.166016 C 432.53906,10.384779 432.59765,10.62306 432.71484,10.880859 C 432.83984,11.138684 433.01562,11.412122 433.24219,11.701172 L 433.79297,12.404297 M 431.15625,13.962891 L 430.47656,13.072266 C 430.125,12.603527 429.87109,12.166027 429.71484,11.759766 C 429.5664,11.345715 429.49218,10.912122 429.49219,10.458984 C 429.49218,9.2089988 429.89062,8.2168123 430.6875,7.4824219 C 431.49218,6.7402513 432.58203,6.3691579 433.95703,6.3691406 C 435.27733,6.3691579 436.3203,6.7090013 437.08594,7.3886719 C 437.85155,8.0683749 438.23436,8.9863428 438.23438,10.142578 C 438.23436,11.017591 438.0078,11.802746 437.55469,12.498047 C 437.10936,13.185557 436.40624,13.833994 435.44531,14.443359 L 437.91797,17.490234 C 438.15233,17.107428 438.33593,16.677741 438.46875,16.201172 C 438.60936,15.724617 438.70702,15.193368 438.76172,14.607422 L 441.80859,14.607422 C 441.72264,15.623055 441.5117,16.56446 441.17578,17.431641 C 440.83983,18.298833 440.37889,19.091801 439.79297,19.810547 L 442.93359,23.630859 L 438.94922,23.630859 L 437.77734,22.189453 C 437.08983,22.822266 436.33202,23.302735 435.50391,23.630859 C 434.68359,23.951172 433.82421,24.111328 432.92578,24.111328 C 431.33203,24.111328 430.02734,23.638672 429.01172,22.693359 C 428.0039,21.748049 427.5,20.541019 427.5,19.072266 C 427.5,17.978521 427.78125,17.037116 428.34375,16.248047 C 428.90625,15.458993 429.84375,14.697275 431.15625,13.962891 M 434.66016,53.630859 L 431.15625,53.630859 C 431.28125,51.341799 431.83203,49.07227 432.80859,46.822266 C 433.79296,44.572275 435.19531,42.361339 437.01563,40.189453 L 428.76563,40.189453 L 428.76563,37.330078 L 440.66016,37.330078 L 440.66016,39.849609 C 438.8164,41.880871 437.39843,44.029306 436.40625,46.294922 C 435.42187,48.560552 434.83984,51.005862 434.66016,53.630859"
+       id="text5163" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 493.5,13.212891 L 491.4375,16.119141 L 489.44531,14.724609 L 491.69531,11.900391 L 488.41406,10.986328 L 489.17578,8.6074219 L 492.32813,9.7324219 L 492.32813,6.3691406 L 494.64844,6.3691406 L 494.64844,9.7324219 L 497.80078,8.6308594 L 498.58594,11.009766 L 495.30469,11.900391 L 497.53125,14.701172 L 495.49219,16.166016 L 493.5,13.212891 M 490.875,48.755859 C 490.875,49.576176 491.10156,50.208988 491.55469,50.654297 C 492.01562,51.099612 492.67187,51.322268 493.52344,51.322266 C 494.33593,51.322268 494.97265,51.095706 495.43359,50.642578 C 495.90233,50.189457 496.13671,49.560551 496.13672,48.755859 C 496.13671,47.982428 495.89843,47.361334 495.42188,46.892578 C 494.9453,46.423835 494.31249,46.189461 493.52344,46.189453 C 492.73437,46.189461 492.09374,46.427742 491.60156,46.904297 C 491.11718,47.380866 490.875,47.998053 490.875,48.755859 M 491.14453,41.560547 C 491.14453,42.208996 491.34765,42.708995 491.75391,43.060547 C 492.16015,43.404307 492.74218,43.576182 493.5,43.576172 C 494.2578,43.576182 494.83984,43.400401 495.24609,43.048828 C 495.66015,42.697277 495.86718,42.201183 495.86719,41.560547 C 495.86718,40.93556 495.65624,40.443373 495.23438,40.083984 C 494.81249,39.724623 494.23437,39.544936 493.5,39.544922 C 492.78124,39.544936 492.20703,39.72853 491.77734,40.095703 C 491.35546,40.462904 491.14453,40.951185 491.14453,41.560547 M 489.9375,44.818359 C 489.23437,44.427744 488.72656,43.970713 488.41406,43.447266 C 488.10156,42.923839 487.94531,42.255871 487.94531,41.443359 C 487.94531,40.005873 488.4375,38.876968 489.42188,38.056641 C 490.40625,37.236345 491.76562,36.826189 493.5,36.826172 C 495.24999,36.826189 496.61718,37.236345 497.60156,38.056641 C 498.59374,38.869155 499.08983,39.998061 499.08984,41.443359 C 499.08983,42.216808 498.92186,42.888683 498.58594,43.458984 C 498.24999,44.021494 497.74608,44.474619 497.07422,44.818359 C 497.89452,45.20118 498.51171,45.73243 498.92578,46.412109 C 499.33983,47.083991 499.54686,47.904303 499.54688,48.873047 C 499.54686,50.505862 499.0078,51.787111 497.92969,52.716797 C 496.85936,53.646484 495.3828,54.111328 493.5,54.111328 C 491.59375,54.111328 490.11328,53.650391 489.05859,52.728516 C 488.0039,51.806642 487.47656,50.521487 487.47656,48.873047 C 487.47656,47.912115 487.67187,47.107428 488.0625,46.458984 C 488.46094,45.802742 489.08594,45.255868 489.9375,44.818359"
+       id="text5169" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 557.85938,6.3691406 C 556.78124,8.1347811 555.98046,9.9316543 555.45703,11.759766 C 554.93359,13.587901 554.67187,15.505868 554.67188,17.513672 C 554.67187,19.513676 554.93359,21.427737 555.45703,23.255859 C 555.98046,25.083983 556.78124,26.880856 557.85938,28.646484 L 555.38672,28.646484 C 554.01953,26.779294 552.98046,24.904296 552.26953,23.021484 C 551.5664,21.130862 551.21484,19.294926 551.21484,17.513672 C 551.21484,15.73243 551.5664,13.896494 552.26953,12.005859 C 552.98046,10.115248 554.01953,8.2363435 555.38672,6.3691406 L 557.85938,6.3691406 M 556.06641,42.685547 C 556.0664,41.724621 555.82421,40.96681 555.33984,40.412109 C 554.86327,39.849623 554.21093,39.568373 553.38281,39.568359 C 552.60156,39.568373 551.99218,39.837904 551.55469,40.376953 C 551.125,40.916028 550.91015,41.669934 550.91016,42.638672 C 550.91015,43.544932 551.13671,44.251963 551.58984,44.759766 C 552.04296,45.267586 552.67968,45.521492 553.5,45.521484 C 554.30468,45.521492 554.93359,45.271493 555.38672,44.771484 C 555.83983,44.271494 556.0664,43.576182 556.06641,42.685547 M 556.125,47.056641 C 555.73437,47.447272 555.27343,47.74024 554.74219,47.935547 C 554.21093,48.130865 553.61327,48.228521 552.94922,48.228516 C 551.30078,48.228521 549.98047,47.732428 548.98828,46.740234 C 547.99609,45.748055 547.5,44.419931 547.5,42.755859 C 547.5,40.990247 548.03906,39.564467 549.11719,38.478516 C 550.19531,37.392594 551.61718,36.849626 553.38281,36.849609 C 555.42968,36.849626 556.98436,37.556657 558.04688,38.970703 C 559.11718,40.376966 559.65233,42.431652 559.65234,45.134766 C 559.65233,48.041021 559.08202,50.267581 557.94141,51.814453 C 556.80077,53.361328 555.16015,54.134765 553.01953,54.134766 C 551.54296,54.134765 550.35156,53.751953 549.44531,52.986328 C 548.53906,52.212892 548.04297,51.162112 547.95703,49.833984 L 551.34375,49.845703 C 551.42187,50.384769 551.63281,50.787112 551.97656,51.052734 C 552.32031,51.318362 552.80468,51.451174 553.42969,51.451172 C 554.27343,51.451174 554.91796,51.083987 555.36328,50.349609 C 555.80858,49.615238 556.06249,48.517583 556.125,47.056641"
+       id="text5175" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 609.375,6.3691406 L 611.87109,6.3691406 C 613.23046,8.228531 614.26171,10.103529 614.96484,11.994141 C 615.66796,13.876963 616.01952,15.716805 616.01953,17.513672 C 616.01952,19.302739 615.66796,21.142581 614.96484,23.033203 C 614.26171,24.923827 613.23046,26.794919 611.87109,28.646484 L 609.375,28.646484 C 610.46094,26.873044 611.26562,25.072264 611.78906,23.244141 C 612.32031,21.408205 612.58593,19.498051 612.58594,17.513672 C 612.58593,15.521492 612.32031,13.611338 611.78906,11.783203 C 611.26562,9.9550918 610.46094,8.1504061 609.375,6.3691406 M 610.98047,45.474609 C 610.98046,47.513678 611.18359,48.994145 611.58984,49.916016 C 612.0039,50.837893 612.66015,51.29883 613.55859,51.298828 C 614.45702,51.29883 615.11327,50.833987 615.52734,49.904297 C 615.9414,48.974614 616.14843,47.498053 616.14844,45.474609 C 616.14843,43.44337 615.9414,41.966809 615.52734,41.044922 C 615.11327,40.12306 614.45702,39.662123 613.55859,39.662109 C 612.66015,39.662123 612.0039,40.12306 611.58984,41.044922 C 611.18359,41.958996 610.98046,43.435557 610.98047,45.474609 M 607.5,45.474609 C 607.5,42.591808 608,40.43556 609,39.005859 C 610.00781,37.568375 611.52734,36.849626 613.55859,36.849609 C 615.58202,36.849626 617.09765,37.572282 618.10547,39.017578 C 619.12108,40.455091 619.62889,42.615245 619.62891,45.498047 C 619.62889,48.380865 619.12499,50.533206 618.11719,51.955078 C 617.11718,53.376953 615.59765,54.08789 613.55859,54.087891 C 611.52734,54.08789 610.00781,53.373047 609,51.943359 C 608,50.513675 607.5,48.357427 607.5,45.474609"
+       id="text5181" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 667.5,26.900391 L 679.5,26.900391 L 679.5,29.291016 L 667.5,29.291016 L 667.5,26.900391 M 670.20703,48.849609 L 670.20703,45.638672 L 676.79297,45.638672 L 676.79297,48.849609 L 670.20703,48.849609"
+       id="text5187" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 733.33594,9.3222656 L 735.70313,9.3222656 L 735.70313,15.298828 L 741.53906,15.298828 L 741.53906,17.630859 L 735.70313,17.630859 L 735.70313,23.630859 L 733.33594,23.630859 L 733.33594,17.630859 L 727.5,17.630859 L 727.5,15.298828 L 733.33594,15.298828 L 733.33594,9.3222656 M 727.5,47.818359 L 741.53906,47.818359 L 741.53906,50.150391 L 727.5,50.150391 L 727.5,47.818359 M 727.5,42.779297 L 741.53906,42.779297 L 741.53906,45.111328 L 727.5,45.111328 L 727.5,42.779297"
+       id="text5201" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 11.070313,95.601563 L 11.070313,86.148438 L 7.65625,86.148438 L 7.65625,84.09375 L 16.828125,84.09375 L 16.828125,86.148438 L 13.4375,86.148438 L 13.4375,95.601563 L 11.070313,95.601563 M 22.859375,94.546875 C 22.572911,94.989584 22.197911,95.328125 21.734375,95.5625 C 21.270829,95.791666 20.731767,95.90625 20.117188,95.90625 C 19.294269,95.90625 18.658853,95.671875 18.210938,95.203125 C 17.768228,94.734376 17.546874,94.06771 17.546875,93.203125 C 17.546874,92.401045 17.768228,91.789066 18.210938,91.367188 C 18.658853,90.945317 19.395831,90.656255 20.421875,90.5 C 20.656246,90.463547 20.963538,90.42188 21.34375,90.375 C 22.307286,90.250005 22.789057,89.97136 22.789063,89.539063 C 22.789057,89.195319 22.682286,88.950527 22.46875,88.804688 C 22.255203,88.653653 21.898433,88.578132 21.398438,88.578125 C 20.9401,88.578132 20.588538,88.669278 20.34375,88.851563 C 20.098955,89.033861 19.97656,89.294277 19.976563,89.632813 L 19.976563,89.757813 L 17.851563,89.757813 L 17.851563,89.601563 C 17.851562,88.731778 18.158853,88.049487 18.773438,87.554688 C 19.388018,87.054696 20.236976,86.804696 21.320313,86.804688 C 22.507807,86.804696 23.41666,87.010425 24.046875,87.421875 C 24.682284,87.833341 24.999992,88.427091 25,89.203125 L 25,94.03125 C 24.999992,94.385418 25.03645,94.651043 25.109375,94.828125 C 25.182283,95.000001 25.304679,95.130209 25.476563,95.21875 L 25.476563,95.601563 L 23.109375,95.601563 C 23.031244,95.455729 22.971348,95.294271 22.929688,95.117188 C 22.888015,94.940105 22.864577,94.750001 22.859375,94.546875 M 22.820313,91.421875 C 22.450515,91.593754 22.023432,91.731775 21.539063,91.835938 C 21.059892,91.940108 20.812496,91.994795 20.796875,92 C 20.39583,92.114587 20.11458,92.257816 19.953125,92.429688 C 19.796872,92.601566 19.718747,92.838544 19.71875,93.140625 C 19.718747,93.453127 19.82031,93.703127 20.023438,93.890625 C 20.226559,94.072918 20.499997,94.164064 20.84375,94.164063 C 21.458329,94.164064 21.940099,93.992189 22.289063,93.648438 C 22.643224,93.299481 22.820307,92.825524 22.820313,92.226563 L 22.820313,91.421875 M 27.039063,84.09375 L 29.25,84.09375 L 29.25,88.164063 C 29.531246,87.721362 29.882809,87.388029 30.304688,87.164063 C 30.731766,86.934905 31.216141,86.820321 31.757813,86.820313 C 32.783847,86.820321 33.622388,87.2448 34.273438,88.09375 C 34.92447,88.937507 35.249991,90.036464 35.25,91.390625 C 35.249991,92.734378 34.92447,93.820314 34.273438,94.648438 C 33.622388,95.476563 32.773431,95.890625 31.726563,95.890625 C 31.179682,95.890625 30.70312,95.776041 30.296875,95.546875 C 29.895829,95.317709 29.531246,94.953126 29.203125,94.453125 L 29.203125,95.601563 L 27.039063,95.601563 L 27.039063,84.09375 M 32.992188,91.296875 C 32.992181,90.51563 32.828118,89.903652 32.5,89.460938 C 32.171869,89.013027 31.721348,88.789069 31.148438,88.789063 C 30.544266,88.789069 30.075517,89.007819 29.742188,89.445313 C 29.414059,89.87761 29.249997,90.494797 29.25,91.296875 C 29.249997,92.161462 29.406247,92.817711 29.71875,93.265625 C 30.036454,93.713544 30.497391,93.937502 31.101563,93.9375 C 31.71614,93.937502 32.18489,93.713544 32.507813,93.265625 C 32.830722,92.812503 32.992181,92.156253 32.992188,91.296875"
+       id="text5427" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 789.76563,44.369141 L 792.57031,44.369141 C 793.23176,44.369143 793.71353,44.249351 794.01563,44.009766 C 794.3177,43.770185 794.46874,43.392581 794.46875,42.876953 C 794.46874,42.340499 794.3203,41.955083 794.02344,41.720703 C 793.72656,41.481125 793.23697,41.361333 792.55469,41.361328 L 789.76563,41.361328 L 789.76563,44.369141 M 789.76563,39.392578 L 792.46875,39.392578 C 793.05208,39.392585 793.47916,39.293627 793.75,39.095703 C 794.02083,38.892586 794.15624,38.574878 794.15625,38.142578 C 794.15624,37.720712 794.02343,37.416025 793.75781,37.228516 C 793.49739,37.035817 793.06249,36.939463 792.45313,36.939453 L 789.76563,36.939453 L 789.76563,39.392578 M 787.5,46.447266 L 787.5,34.939453 L 792.92188,34.939453 C 794.09895,34.939465 794.99478,35.189464 795.60938,35.689453 C 796.22916,36.184255 796.53905,36.905609 796.53906,37.853516 C 796.53905,38.436857 796.42447,38.923836 796.19531,39.314453 C 795.96614,39.705085 795.62239,40.007168 795.16406,40.220703 C 795.7578,40.460292 796.20051,40.806646 796.49219,41.259766 C 796.78905,41.707687 796.93749,42.267582 796.9375,42.939453 C 796.93749,44.059247 796.57291,44.92383 795.84375,45.533203 C 795.11457,46.142578 794.08072,46.447266 792.74219,46.447266 L 787.5,46.447266 M 803.45313,45.392578 C 803.16666,45.835287 802.79166,46.173828 802.32813,46.408203 C 801.86458,46.63737 801.32552,46.751953 800.71094,46.751953 C 799.88802,46.751953 799.2526,46.517578 798.80469,46.048828 C 798.36198,45.580079 798.14062,44.913413 798.14063,44.048828 C 798.14062,43.246748 798.36198,42.634769 798.80469,42.212891 C 799.2526,41.79102 799.98958,41.501958 801.01563,41.345703 C 801.25,41.30925 801.55729,41.267583 801.9375,41.220703 C 802.90104,41.095708 803.38281,40.817063 803.38281,40.384766 C 803.38281,40.041022 803.27604,39.796231 803.0625,39.650391 C 802.84895,39.499356 802.49218,39.423835 801.99219,39.423828 C 801.53385,39.423835 801.18229,39.514981 800.9375,39.697266 C 800.69271,39.879564 800.57031,40.13998 800.57031,40.478516 L 800.57031,40.603516 L 798.44531,40.603516 L 798.44531,40.447266 C 798.44531,39.577481 798.7526,38.89519 799.36719,38.400391 C 799.98177,37.900399 800.83073,37.650399 801.91406,37.650391 C 803.10156,37.650399 804.01041,37.856128 804.64063,38.267578 C 805.27603,38.679044 805.59374,39.272794 805.59375,40.048828 L 805.59375,44.876953 C 805.59374,45.231121 805.6302,45.496746 805.70313,45.673828 C 805.77603,45.845704 805.89843,45.975912 806.07031,46.064453 L 806.07031,46.447266 L 803.70313,46.447266 C 803.62499,46.301432 803.5651,46.139974 803.52344,45.962891 C 803.48176,45.785808 803.45833,45.595704 803.45313,45.392578 M 803.41406,42.267578 C 803.04427,42.439457 802.61718,42.577478 802.13281,42.681641 C 801.65364,42.785811 801.40625,42.840498 801.39063,42.845703 C 800.98958,42.96029 800.70833,43.103519 800.54688,43.275391 C 800.39062,43.447269 800.3125,43.684248 800.3125,43.986328 C 800.3125,44.29883 800.41406,44.54883 800.61719,44.736328 C 800.82031,44.918621 801.09375,45.009767 801.4375,45.009766 C 802.05208,45.009767 802.53385,44.837892 802.88281,44.494141 C 803.23697,44.145185 803.41406,43.671227 803.41406,43.072266 L 803.41406,42.267578 M 812.71875,43.244141 L 814.96094,43.244141 C 814.86718,44.322268 814.47395,45.173829 813.78125,45.798828 C 813.08854,46.423828 812.19791,46.736328 811.10938,46.736328 C 809.875,46.736328 808.90625,46.335287 808.20313,45.533203 C 807.50521,44.725913 807.15625,43.611331 807.15625,42.189453 C 807.15625,40.772792 807.51302,39.663418 808.22656,38.861328 C 808.94531,38.054045 809.93229,37.650399 811.1875,37.650391 C 812.28645,37.650399 813.16666,37.942066 813.82813,38.525391 C 814.49478,39.108731 814.86718,39.92123 814.94531,40.962891 L 812.6875,40.962891 C 812.62499,40.509772 812.46614,40.163418 812.21094,39.923828 C 811.95572,39.684252 811.61979,39.56446 811.20313,39.564453 C 810.64062,39.56446 810.21875,39.785814 809.9375,40.228516 C 809.66146,40.67123 809.52343,41.335292 809.52344,42.220703 C 809.52343,43.038415 809.66666,43.668623 809.95313,44.111328 C 810.24479,44.54883 810.66145,44.76758 811.20313,44.767578 C 811.62499,44.76758 811.96354,44.639976 812.21875,44.384766 C 812.47395,44.12956 812.64062,43.749352 812.71875,43.244141 M 816.44531,46.447266 L 816.44531,34.939453 L 818.65625,34.939453 L 818.65625,40.978516 L 821.35938,37.955078 L 824.09375,37.955078 L 821.13281,41.103516 L 824.27344,46.447266 L 821.54688,46.447266 L 819.51563,42.830078 L 818.65625,43.759766 L 818.65625,46.447266 L 816.44531,46.447266 M 824.79688,43.681641 L 827.0625,43.681641 C 827.08333,44.113935 827.23958,44.436851 827.53125,44.650391 C 827.82291,44.858726 828.26041,44.962892 828.84375,44.962891 C 829.28645,44.962892 829.6276,44.889976 829.86719,44.744141 C 830.11197,44.593101 830.23437,44.382164 830.23438,44.111328 C 830.23437,43.725914 829.78124,43.436852 828.875,43.244141 C 828.5052,43.166019 828.21093,43.098311 827.99219,43.041016 C 826.88802,42.759769 826.11979,42.426436 825.6875,42.041016 C 825.26042,41.655604 825.04687,41.134771 825.04688,40.478516 C 825.04687,39.608731 825.35937,38.921231 825.98438,38.416016 C 826.61458,37.905608 827.46614,37.650399 828.53906,37.650391 C 829.67447,37.650399 830.5651,37.903003 831.21094,38.408203 C 831.86197,38.913419 832.20833,39.624356 832.25,40.541016 L 830.03906,40.541016 C 830.02343,40.181647 829.88541,39.903001 829.625,39.705078 C 829.36979,39.507168 829.01302,39.40821 828.55469,39.408203 C 828.12239,39.40821 827.79948,39.473314 827.58594,39.603516 C 827.3776,39.733731 827.27343,39.929043 827.27344,40.189453 C 827.27343,40.528001 827.83854,40.82748 828.96875,41.087891 C 829.22916,41.145188 829.43489,41.192063 829.58594,41.228516 C 830.71614,41.494146 831.48697,41.814458 831.89844,42.189453 C 832.3151,42.564457 832.52343,43.093102 832.52344,43.775391 C 832.52343,44.738934 832.18228,45.473308 831.5,45.978516 C 830.82291,46.483724 829.83593,46.736328 828.53906,46.736328 C 827.36718,46.736328 826.45052,46.473307 825.78906,45.947266 C 825.1276,45.421225 824.79687,44.697267 824.79688,43.775391 L 824.79688,43.681641 M 840.02344,42.251953 C 840.02343,41.397792 839.86197,40.74675 839.53906,40.298828 C 839.21614,39.84571 838.74739,39.619147 838.13281,39.619141 C 837.52864,39.619147 837.0677,39.843106 836.75,40.291016 C 836.4375,40.738938 836.28125,41.392583 836.28125,42.251953 C 836.28125,43.05404 836.44531,43.673831 836.77344,44.111328 C 837.10677,44.54883 837.57552,44.76758 838.17969,44.767578 C 838.7526,44.76758 839.20312,44.543622 839.53125,44.095703 C 839.85937,43.647789 840.02343,43.033207 840.02344,42.251953 M 834.07031,49.853516 L 834.07031,37.955078 L 836.23438,37.955078 L 836.23438,39.103516 C 836.5625,38.603523 836.92708,38.23894 837.32813,38.009766 C 837.73437,37.780608 838.21093,37.666024 838.75781,37.666016 C 839.80468,37.666024 840.65364,38.080086 841.30469,38.908203 C 841.95572,39.731127 842.28124,40.814459 842.28125,42.158203 C 842.28124,43.517581 841.95572,44.621747 841.30469,45.470703 C 840.65364,46.314453 839.8151,46.736328 838.78906,46.736328 C 838.24739,46.736328 837.76302,46.621745 837.33594,46.392578 C 836.91406,46.163412 836.5625,45.830079 836.28125,45.392578 L 836.28125,49.853516 L 834.07031,49.853516 M 848.70313,45.392578 C 848.41666,45.835287 848.04166,46.173828 847.57813,46.408203 C 847.11458,46.63737 846.57552,46.751953 845.96094,46.751953 C 845.13802,46.751953 844.5026,46.517578 844.05469,46.048828 C 843.61198,45.580079 843.39062,44.913413 843.39063,44.048828 C 843.39062,43.246748 843.61198,42.634769 844.05469,42.212891 C 844.5026,41.79102 845.23958,41.501958 846.26563,41.345703 C 846.5,41.30925 846.80729,41.267583 847.1875,41.220703 C 848.15104,41.095708 848.63281,40.817063 848.63281,40.384766 C 848.63281,40.041022 848.52604,39.796231 848.3125,39.650391 C 848.09895,39.499356 847.74218,39.423835 847.24219,39.423828 C 846.78385,39.423835 846.43229,39.514981 846.1875,39.697266 C 845.94271,39.879564 845.82031,40.13998 845.82031,40.478516 L 845.82031,40.603516 L 843.69531,40.603516 L 843.69531,40.447266 C 843.69531,39.577481 844.0026,38.89519 844.61719,38.400391 C 845.23177,37.900399 846.08073,37.650399 847.16406,37.650391 C 848.35156,37.650399 849.26041,37.856128 849.89063,38.267578 C 850.52603,38.679044 850.84374,39.272794 850.84375,40.048828 L 850.84375,44.876953 C 850.84374,45.231121 850.8802,45.496746 850.95313,45.673828 C 851.02603,45.845704 851.14843,45.975912 851.32031,46.064453 L 851.32031,46.447266 L 848.95313,46.447266 C 848.87499,46.301432 848.8151,46.139974 848.77344,45.962891 C 848.73176,45.785808 848.70833,45.595704 848.70313,45.392578 M 848.66406,42.267578 C 848.29427,42.439457 847.86718,42.577478 847.38281,42.681641 C 846.90364,42.785811 846.65625,42.840498 846.64063,42.845703 C 846.23958,42.96029 845.95833,43.103519 845.79688,43.275391 C 845.64062,43.447269 845.5625,43.684248 845.5625,43.986328 C 845.5625,44.29883 845.66406,44.54883 845.86719,44.736328 C 846.07031,44.918621 846.34375,45.009767 846.6875,45.009766 C 847.30208,45.009767 847.78385,44.837892 848.13281,44.494141 C 848.48697,44.145185 848.66406,43.671227 848.66406,43.072266 L 848.66406,42.267578 M 857.96875,43.244141 L 860.21094,43.244141 C 860.11718,44.322268 859.72395,45.173829 859.03125,45.798828 C 858.33854,46.423828 857.44791,46.736328 856.35938,46.736328 C 855.125,46.736328 854.15625,46.335287 853.45313,45.533203 C 852.75521,44.725913 852.40625,43.611331 852.40625,42.189453 C 852.40625,40.772792 852.76302,39.663418 853.47656,38.861328 C 854.19531,38.054045 855.18229,37.650399 856.4375,37.650391 C 857.53645,37.650399 858.41666,37.942066 859.07813,38.525391 C 859.74478,39.108731 860.11718,39.92123 860.19531,40.962891 L 857.9375,40.962891 C 857.87499,40.509772 857.71614,40.163418 857.46094,39.923828 C 857.20572,39.684252 856.86979,39.56446 856.45313,39.564453 C 855.89062,39.56446 855.46875,39.785814 855.1875,40.228516 C 854.91146,40.67123 854.77343,41.335292 854.77344,42.220703 C 854.77343,43.038415 854.91666,43.668623 855.20313,44.111328 C 855.49479,44.54883 855.91145,44.76758 856.45313,44.767578 C 856.87499,44.76758 857.21354,44.639976 857.46875,44.384766 C 857.72395,44.12956 857.89062,43.749352 857.96875,43.244141 M 866.88281,43.869141 L 869.14844,43.869141 C 868.91926,44.764976 868.45572,45.4681 867.75781,45.978516 C 867.0651,46.483724 866.21874,46.736328 865.21875,46.736328 C 863.98958,46.736328 863.01562,46.32487 862.29688,45.501953 C 861.57812,44.67383 861.21875,43.554039 861.21875,42.142578 C 861.21875,40.751959 861.57292,39.655606 862.28125,38.853516 C 862.98958,38.051441 863.95833,37.650399 865.1875,37.650391 C 866.48958,37.650399 867.49478,38.046232 868.20313,38.837891 C 868.91145,39.624356 869.26562,40.74675 869.26563,42.205078 C 869.26562,42.366541 869.26301,42.488936 869.25781,42.572266 C 869.2578,42.650394 869.2526,42.725915 869.24219,42.798828 L 863.57031,42.798828 C 863.60156,43.465498 863.76302,43.968101 864.05469,44.306641 C 864.35156,44.645184 864.77604,44.814455 865.32813,44.814453 C 865.71874,44.814455 866.03906,44.738934 866.28906,44.587891 C 866.53906,44.431643 866.73697,44.19206 866.88281,43.869141 M 863.57031,41.306641 L 866.91406,41.306641 C 866.89322,40.73373 866.73958,40.298834 866.45313,40.001953 C 866.17187,39.699877 865.76562,39.548835 865.23438,39.548828 C 864.73958,39.548835 864.34895,39.699877 864.0625,40.001953 C 863.78125,40.304043 863.61718,40.738938 863.57031,41.306641"
+       id="text5207" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 840,17.646484 L 797.02608,17.646484"
+       id="path5439" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 802.5,25.146484 L 802.5,10.146484 L 787.5,17.646484 L 802.5,25.146484 z "
+       id="path5441" />
+    <g
+       id="g5459"
+       transform="translate(0,7.5)">
+      <path
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 82.50003,75 L 54.020182,75"
+         id="path5453" />
+      <path
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 60,82.5 L 60,67.5 L 45,75 L 60,82.5 z "
+         id="path5455" />
+      <path
+         id="path5457"
+         d="M 45,67.5 C 45,82.5 45,82.5 45,82.5"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       id="g5464"
+       transform="matrix(-1,9.581637e-17,-9.581637e-17,-1,127.5,172.5)">
+      <path
+         id="path5466"
+         d="M 82.50003,75 L 54.020182,75"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         id="path5468"
+         d="M 60,82.5 L 60,67.5 L 45,75 L 60,82.5 z "
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 45,67.5 C 45,82.5 45,82.5 45,82.5"
+         id="path5470" />
+    </g>
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 107.0625,80.560547 L 105.23438,78.779297 L 107.17969,76.763672 L 109.05469,78.591797 C 109.30467,78.123052 109.49608,77.587897 109.62891,76.986328 C 109.7617,76.384773 109.82811,75.728524 109.82813,75.017578 C 109.82811,73.119151 109.40233,71.646496 108.55078,70.599609 C 107.69921,69.544936 106.5078,69.017593 104.97656,69.017578 C 103.46093,69.017593 102.28124,69.54103 101.4375,70.587891 C 100.59374,71.634778 100.17187,73.111339 100.17188,75.017578 C 100.17187,76.916022 100.59374,78.392583 101.4375,79.447266 C 102.28124,80.494144 103.46093,81.017581 104.97656,81.017578 C 105.36718,81.017581 105.73436,80.978518 106.07813,80.900391 C 106.42968,80.822268 106.7578,80.708987 107.0625,80.560547 M 109.55859,82.916016 C 108.97264,83.306641 108.28905,83.603516 107.50781,83.806641 C 106.73436,84.009765 105.89061,84.111328 104.97656,84.111328 C 102.39843,84.111328 100.34765,83.291016 98.824219,81.650391 C 97.308592,80.009769 96.55078,77.798834 96.550781,75.017578 C 96.55078,72.228527 97.308592,70.017592 98.824219,68.384766 C 100.34765,66.744158 102.39843,65.923846 104.97656,65.923828 C 107.55468,65.923846 109.60545,66.744158 111.12891,68.384766 C 112.66014,70.025404 113.42576,72.23634 113.42578,75.017578 C 113.42576,76.236336 113.26951,77.353522 112.95703,78.369141 C 112.64451,79.376957 112.18358,80.259769 111.57422,81.017578 L 113.44922,82.810547 L 111.52734,84.826172 L 109.55859,82.916016"
+       id="text5474" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 407.06836,83.630859 L 403.51758,83.630859 L 403.51758,77.197266 L 397.24805,66.369141 L 401.5957,66.369141 L 405.28711,73.810547 L 408.69727,66.369141 L 412.75195,66.369141 L 407.06836,77.197266 L 407.06836,83.630859"
+       id="text5518" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 458.08594,66.105469 L 461.67188,66.105469 L 461.67188,76.933594 C 461.67187,78.269536 461.93749,79.246098 462.46875,79.863281 C 462.99999,80.472659 463.84374,80.777346 465,80.777344 C 466.17187,80.777346 467.02343,80.472659 467.55469,79.863281 C 468.09374,79.25391 468.36327,78.277349 468.36328,76.933594 L 468.36328,66.105469 L 471.91406,66.105469 L 471.91406,77.320313 C 471.91405,79.437504 471.3203,81.062502 470.13281,82.195313 C 468.95311,83.328125 467.24999,83.894531 465.02344,83.894531 C 462.78124,83.894531 461.0625,83.332031 459.86719,82.207031 C 458.67969,81.074221 458.08594,79.445316 458.08594,77.320313 L 458.08594,66.105469"
+       id="text5522" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 523.22461,83.630859 L 523.22461,66.369141 L 526.77539,66.369141 L 526.77539,83.630859 L 523.22461,83.630859"
+       id="text5526" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 580.18359,75 C 580.18359,76.898444 580.60546,78.375005 581.44922,79.429688 C 582.29296,80.476566 583.47265,81.000003 584.98828,81 C 586.51952,81.000003 587.71093,80.476566 588.5625,79.429688 C 589.41405,78.375005 589.83983,76.898444 589.83984,75 C 589.83983,73.101573 589.41405,71.628918 588.5625,70.582031 C 587.71093,69.527358 586.51952,69.000015 584.98828,69 C 583.47265,69.000015 582.29296,69.523452 581.44922,70.570313 C 580.60546,71.617199 580.18359,73.093761 580.18359,75 M 576.5625,75 C 576.5625,72.210949 577.32031,70.000014 578.83594,68.367188 C 580.35937,66.726579 582.41015,65.906268 584.98828,65.90625 C 587.56639,65.906268 589.61717,66.726579 591.14063,68.367188 C 592.67186,70.007826 593.43748,72.218761 593.4375,75 C 593.43748,77.781256 592.67186,79.992191 591.14063,81.632813 C 589.61717,83.273438 587.56639,84.09375 584.98828,84.09375 C 582.41015,84.09375 580.35937,83.273438 578.83594,81.632813 C 577.32031,79.992191 576.5625,77.781256 576.5625,75"
+       id="text5530" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 641.97656,74.361328 L 645.41016,74.361328 C 646.33983,74.361337 647.01561,74.166025 647.4375,73.775391 C 647.85936,73.376963 648.0703,72.740245 648.07031,71.865234 C 648.0703,71.044934 647.86327,70.423841 647.44922,70.001953 C 647.03515,69.580092 646.41796,69.369155 645.59766,69.369141 L 641.97656,69.369141 L 641.97656,74.361328 M 641.95313,77.490234 L 641.95313,83.630859 L 638.40234,83.630859 L 638.40234,66.369141 L 646.07813,66.369141 C 647.89061,66.369158 649.26171,66.841814 650.19141,67.787109 C 651.12889,68.724624 651.59764,70.103529 651.59766,71.923828 C 651.59764,73.705088 651.14061,75.080087 650.22656,76.048828 C 649.31249,77.009772 648.0078,77.490241 646.3125,77.490234 L 641.95313,77.490234"
+       id="text5534" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 709.24805,63.919922 L 709.24805,66.369141 C 709.17772,66.369155 709.08007,66.365249 708.95508,66.357422 C 708.83007,66.349624 708.74413,66.345718 708.69727,66.345703 C 707.90819,66.345718 707.37304,66.498062 707.0918,66.802734 C 706.81835,67.099624 706.68163,67.732435 706.68164,68.701172 L 706.68164,71.513672 C 706.68163,72.66993 706.50585,73.490242 706.1543,73.974609 C 705.80273,74.458991 705.16992,74.806647 704.25586,75.017578 C 705.16992,75.228522 705.80273,75.572271 706.1543,76.048828 C 706.50585,76.525395 706.68163,77.341801 706.68164,78.498047 L 706.68164,81.322266 C 706.68163,82.283202 706.81835,82.912108 707.0918,83.208984 C 707.36523,83.505857 707.90038,83.654294 708.69727,83.654297 C 708.74413,83.654294 708.83007,83.650388 708.95508,83.642578 C 709.08007,83.634763 709.17772,83.630857 709.24805,83.630859 L 709.24805,86.080078 C 709.13866,86.080073 708.98632,86.08398 708.79102,86.091797 C 708.59569,86.099605 708.45116,86.103511 708.35742,86.103516 C 707.57616,86.103511 706.92382,86.056636 706.40039,85.962891 C 705.87695,85.869136 705.43163,85.724605 705.06445,85.529297 C 704.61913,85.263668 704.30273,84.904293 704.11523,84.451172 C 703.93554,84.005857 703.8457,83.228514 703.8457,82.119141 L 703.8457,79.166016 C 703.8457,78.095706 703.64648,77.337895 703.24805,76.892578 C 702.84961,76.439458 702.17773,76.212896 701.23242,76.212891 C 701.18554,76.212896 701.10742,76.216802 700.99805,76.224609 C 700.88867,76.232427 700.80664,76.236333 700.75195,76.236328 L 700.75195,73.787109 C 700.80664,73.787117 700.88867,73.791023 700.99805,73.798828 C 701.10742,73.806648 701.18554,73.810554 701.23242,73.810547 C 702.16992,73.810554 702.83789,73.583992 703.23633,73.130859 C 703.64257,72.677743 703.8457,71.912119 703.8457,70.833984 L 703.8457,67.904297 C 703.8457,66.787124 703.93554,66.001968 704.11523,65.548828 C 704.30273,65.095719 704.61913,64.736345 705.06445,64.470703 C 705.43163,64.275408 705.87695,64.130876 706.40039,64.037109 C 706.92382,63.943377 707.57616,63.896502 708.35742,63.896484 C 708.45116,63.896502 708.59569,63.900408 708.79102,63.908203 C 708.98632,63.916033 709.13866,63.919939 709.24805,63.919922 M 703.0957,93.966797 L 709.01367,93.966797 L 709.01367,96.462891 L 706.25977,96.462891 L 706.25977,113.8418 L 709.01367,113.8418 L 709.01367,116.33789 L 703.0957,116.33789 L 703.0957,93.966797"
+       id="text5546" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 760.75195,63.908203 L 761.54883,63.908203 C 762.4082,63.90822 763.09961,63.955095 763.62305,64.048828 C 764.14648,64.142595 764.58398,64.291033 764.93555,64.494141 C 765.38085,64.744157 765.69335,65.103532 765.87305,65.572266 C 766.06054,66.033218 766.15429,66.806655 766.1543,67.892578 L 766.1543,70.845703 C 766.15429,71.916025 766.35351,72.677743 766.75195,73.130859 C 767.15038,73.57618 767.82226,73.798836 768.76758,73.798828 C 768.81444,73.798836 768.89257,73.794929 769.00195,73.787109 C 769.11132,73.779304 769.19335,73.775398 769.24805,73.775391 L 769.24805,76.224609 L 768.81445,76.224609 C 767.83788,76.224614 767.15038,76.443364 766.75195,76.880859 C 766.35351,77.318363 766.15429,78.076175 766.1543,79.154297 L 766.1543,82.107422 C 766.15429,83.224607 766.06054,84.009763 765.87305,84.462891 C 765.69335,84.916012 765.38085,85.267574 764.93555,85.517578 C 764.56835,85.712886 764.12304,85.857417 763.59961,85.951172 C 763.07617,86.044917 762.42382,86.091792 761.64258,86.091797 C 761.54883,86.091792 761.40429,86.087886 761.20898,86.080078 C 761.01367,86.072261 760.86133,86.068355 760.75195,86.068359 L 760.75195,83.619141 C 760.82226,83.619138 760.91992,83.623044 761.04492,83.630859 C 761.16992,83.638669 761.25586,83.642576 761.30273,83.642578 C 762.09179,83.642576 762.62304,83.490232 762.89648,83.185547 C 763.17773,82.88867 763.31836,82.263671 763.31836,81.310547 L 763.31836,78.509766 C 763.31836,77.337895 763.49414,76.513677 763.8457,76.037109 C 764.19726,75.55274 764.83007,75.20899 765.74414,75.005859 C 764.83007,74.794928 764.19726,74.447272 763.8457,73.962891 C 763.49414,73.478523 763.31836,72.658212 763.31836,71.501953 L 763.31836,68.666016 C 763.31836,67.712904 763.17773,67.087905 762.89648,66.791016 C 762.62304,66.486343 762.09179,66.333999 761.30273,66.333984 C 761.25586,66.333999 761.16992,66.337906 761.04492,66.345703 C 760.91992,66.35353 760.82226,66.357437 760.75195,66.357422 L 760.75195,63.908203 M 767.00977,93.955078 L 767.00977,116.32617 L 761.08008,116.32617 L 761.08008,113.83008 L 763.8457,113.83008 L 763.8457,96.451172 L 761.08008,96.451172 L 761.08008,93.955078 L 767.00977,93.955078"
+       id="text5554" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 823.79883,62.876953 L 826.21289,62.876953 L 826.21289,86.876953 L 823.79883,86.876953 L 823.79883,62.876953 M 827.10352,113.44336 L 821.29102,93.509766 L 822.87305,93.509766 L 828.70898,113.44336 L 827.10352,113.44336"
+       id="text5564" />
+    <g
+       id="g5770"
+       transform="translate(0,3.75)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text5570"
+         y="139.30469"
+         x="52.152344"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+         xml:space="preserve"><tspan
+           y="139.30469"
+           x="52.152344"
+           id="tspan5572"
+           sodipodi:role="line">Caps Lock</tspan></text>
+      <path
+         id="path5584"
+         d="M 26.25,142.5 L 15,157.5 L 22.5,157.5 L 22.5,165 L 30,165 L 30,157.5 L 37.5,157.5 L 26.25,142.5 z M 25.21875,146.71875 L 27.25,146.71875 L 30.375,155.34375 L 28.5,155.34375 L 27.90625,153.5625 L 24.5625,153.5625 L 24,155.34375 L 22.125,155.34375 L 25.21875,146.71875 z M 26.25,148.4375 L 25.03125,152.09375 L 27.4375,152.09375 L 26.25,148.4375 z "
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 365.17969,141.57422 C 364.53905,142.44141 363.80858,143.07813 362.98828,143.48438 C 362.17577,143.89062 361.21874,144.09375 360.11719,144.09375 C 357.70312,144.09375 355.74609,143.25781 354.24609,141.58594 C 352.7539,139.90625 352.00781,137.70313 352.00781,134.97656 C 352.00781,132.22657 352.7539,130.02736 354.24609,128.37891 C 355.73828,126.73049 357.72656,125.90627 360.21094,125.90625 C 362.37499,125.90627 364.14061,126.4258 365.50781,127.46484 C 366.87498,128.49611 367.68748,129.91798 367.94531,131.73047 L 364.32422,131.73047 C 364.10546,130.83204 363.65624,130.14845 362.97656,129.67969 C 362.30468,129.21095 361.42577,128.97658 360.33984,128.97656 C 358.89452,128.97658 357.75781,129.50783 356.92969,130.57031 C 356.10937,131.62501 355.69921,133.08595 355.69922,134.95313 C 355.69921,136.82813 356.1289,138.29688 356.98828,139.35938 C 357.84765,140.42188 359.02734,140.95313 360.52734,140.95313 C 361.65233,140.95313 362.59374,140.6211 363.35156,139.95703 C 364.10936,139.29297 364.57811,138.38282 364.75781,137.22656 L 360.84375,137.22656 L 360.84375,134.27344 L 367.99219,134.27344 L 367.99219,143.61328 L 365.61328,143.61328 L 365.17969,141.57422"
+       id="text5657" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 143.15039,203.63086 L 143.15039,200.63086 L 152.53711,189.49805 L 143.33789,189.49805 L 143.33789,186.36914 L 156.84961,186.36914 L 156.84961,189.36914 L 147.43945,200.51367 L 156.63867,200.51367 L 156.63867,203.63086 L 143.15039,203.63086"
+       id="text5679" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 202.37109,203.63086 L 207.79688,194.81836 L 202.37109,186.36914 L 206.47266,186.36914 L 210,192.4043 L 213.50391,186.36914 L 217.62891,186.36914 L 212.20313,194.79492 L 217.62891,203.63086 L 213.52734,203.63086 L 210,197.6543 L 206.47266,203.63086 L 202.37109,203.63086"
+       id="text5683" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 277.875,197.68359 C 277.74217,199.64454 276.98436,201.20313 275.60156,202.35938 C 274.22655,203.51563 272.42968,204.09375 270.21094,204.09375 C 267.65624,204.09375 265.66796,203.29688 264.24609,201.70313 C 262.83203,200.10938 262.125,197.87501 262.125,195 C 262.125,192.06251 262.84765,189.81251 264.29297,188.25 C 265.73828,186.68752 267.8164,185.90627 270.52734,185.90625 C 272.73046,185.90627 274.46874,186.44533 275.74219,187.52344 C 277.02342,188.59377 277.72655,190.10939 277.85156,192.07031 L 274.34766,192.07031 C 274.19921,191.09376 273.80077,190.35158 273.15234,189.84375 C 272.50389,189.32814 271.6289,189.07033 270.52734,189.07031 C 268.96484,189.07033 267.77734,189.57423 266.96484,190.58203 C 266.15234,191.58986 265.74609,193.06251 265.74609,195 C 265.74609,196.87501 266.14843,198.32422 266.95313,199.34766 C 267.76562,200.3711 268.91796,200.88282 270.41016,200.88281 C 271.48827,200.88282 272.37108,200.60938 273.05859,200.0625 C 273.74608,199.50782 274.19139,198.71485 274.39453,197.68359 L 277.875,197.68359"
+       id="text5687" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 386.32031,200.51367 L 390.52734,200.51367 C 391.51952,200.51367 392.24218,200.33399 392.69531,199.97461 C 393.14843,199.61524 393.37499,199.04883 393.375,198.27539 C 393.37499,197.47071 393.15233,196.89258 392.70703,196.54102 C 392.26171,196.18165 391.52733,196.00196 390.50391,196.00195 L 386.32031,196.00195 L 386.32031,200.51367 M 386.32031,193.04883 L 390.375,193.04883 C 391.24999,193.04884 391.89061,192.9004 392.29688,192.60352 C 392.70311,192.29884 392.90624,191.82228 392.90625,191.17383 C 392.90624,190.54103 392.70702,190.084 392.30859,189.80273 C 391.91796,189.51369 391.26561,189.36915 390.35156,189.36914 L 386.32031,189.36914 L 386.32031,193.04883 M 382.92188,203.63086 L 382.92188,186.36914 L 391.05469,186.36914 C 392.8203,186.36916 394.16405,186.74416 395.08594,187.49414 C 396.01561,188.23634 396.48045,189.31837 396.48047,190.74023 C 396.48045,191.61525 396.30858,192.34571 395.96484,192.93164 C 395.62108,193.51759 395.10545,193.97071 394.41797,194.29102 C 395.30858,194.6504 395.97264,195.16993 396.41016,195.84961 C 396.85545,196.52149 397.07811,197.36133 397.07813,198.36914 C 397.07811,200.04883 396.53123,201.34571 395.4375,202.25977 C 394.34374,203.17383 392.79296,203.63086 390.78516,203.63086 L 382.92188,203.63086"
+       id="text5695" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 442.88672,203.63086 L 442.88672,186.36914 L 446.60156,186.36914 L 453.60938,198.22852 L 453.60938,186.36914 L 457.11328,186.36914 L 457.11328,203.63086 L 453.44531,203.63086 L 446.39063,191.77148 L 446.39063,203.63086 L 442.88672,203.63086"
+       id="text5699" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 501.32813,203.63086 L 501.32813,186.36914 L 506.57813,186.36914 L 510.01172,199.50586 L 513.39844,186.36914 L 518.67188,186.36914 L 518.67188,203.63086 L 515.34375,203.63086 L 515.34375,189.70898 L 511.83984,203.63086 L 508.20703,203.63086 L 504.65625,189.70898 L 504.65625,203.63086 L 501.32813,203.63086"
+       id="text5703" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 720.78516,126.7793 L 723.03516,126.7793 L 723.03516,133.33008 L 720.78516,133.33008 L 720.78516,126.7793 M 716.96484,126.7793 L 719.21484,126.7793 L 719.21484,133.33008 L 716.96484,133.33008 L 716.96484,126.7793 M 718.88672,156.7793 L 721.13672,156.7793 L 721.13672,163.33008 L 718.88672,163.33008 L 718.88672,156.7793"
+       id="text5731" />
+    <g
+       id="g5790">
+      <text
+         xml:space="preserve"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+         x="31.8125"
+         y="201.19531"
+         id="text5753"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan5755"
+           x="31.8125"
+           y="201.19531">Shift</tspan></text>
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 27.25,207.125 L 16,222.125 L 23.5,222.125 L 23.5,229.625 L 31,229.625 L 31,222.125 L 38.5,222.125 L 27.25,207.125 z "
+         id="path5757" />
+    </g>
+    <g
+       id="g5795"
+       transform="translate(727.5,0)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text5797"
+         y="201.19531"
+         x="31.8125"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+         xml:space="preserve"><tspan
+           y="201.19531"
+           x="31.8125"
+           id="tspan5799"
+           sodipodi:role="line">Shift</tspan></text>
+      <path
+         id="path5801"
+         d="M 27.25,207.125 L 16,222.125 L 23.5,222.125 L 23.5,229.625 L 31,229.625 L 31,222.125 L 38.5,222.125 L 27.25,207.125 z "
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 576.90234,189.63867 L 576.90234,192.20508 L 566.4375,196.48242 L 576.90234,200.74805 L 576.90234,203.31445 L 563.09766,197.63086 L 563.09766,195.29883 L 576.90234,189.63867 M 568.21875,237.68555 L 568.21875,236.31445 C 568.875,236.12695 569.35937,235.83789 569.67188,235.44727 C 569.98437,235.05664 570.14062,234.54883 570.14063,233.92383 L 570.14063,233.63086 L 568.21875,233.63086 L 568.21875,230.10352 L 571.76953,230.10352 L 571.76953,233.49023 C 571.76953,234.6543 571.46875,235.59179 570.86719,236.30273 C 570.27343,237.01367 569.39062,237.47461 568.21875,237.68555"
+       id="text5803" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 623.09766,189.63867 L 636.90234,195.29883 L 636.90234,197.63086 L 623.09766,203.31445 L 623.09766,200.74805 L 633.58594,196.48242 L 623.09766,192.20508 L 623.09766,189.63867 M 628.21875,233.63086 L 628.21875,230.10352 L 631.74609,230.10352 L 631.74609,233.63086 L 628.21875,233.63086"
+       id="text5813" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 688.44727,198.61523 C 688.44726,198.5293 688.44335,198.41602 688.43555,198.27539 C 688.42773,198.12696 688.42382,198.01758 688.42383,197.94727 C 688.42382,197.25977 688.49804,196.68946 688.64648,196.23633 C 688.79492,195.7754 689.0332,195.34571 689.36133,194.94727 C 689.61132,194.6504 689.98242,194.31056 690.47461,193.92773 C 690.9746,193.54493 691.29882,193.26759 691.44727,193.0957 C 691.75976,192.74415 691.9746,192.42775 692.0918,192.14648 C 692.20898,191.86525 692.26757,191.55665 692.26758,191.2207 C 692.26757,190.47853 692.06054,189.9004 691.64648,189.48633 C 691.23241,189.07228 690.65429,188.86525 689.91211,188.86523 C 689.16992,188.86525 688.58398,189.11525 688.1543,189.61523 C 687.73242,190.10744 687.50195,190.80275 687.46289,191.70117 L 684.1582,191.70117 L 684.1582,191.33789 C 684.1582,189.68947 684.67773,188.37697 685.7168,187.40039 C 686.76367,186.41603 688.16992,185.92385 689.93555,185.92383 C 691.74023,185.92385 693.17382,186.38869 694.23633,187.31836 C 695.30663,188.24025 695.84178,189.47853 695.8418,191.0332 C 695.84178,191.58009 695.77928,192.07228 695.6543,192.50977 C 695.5371,192.93946 695.3535,193.33399 695.10352,193.69336 C 694.78319,194.14649 694.2871,194.63868 693.61523,195.16992 C 692.95116,195.69337 692.54882,196.01759 692.4082,196.14258 C 692.11132,196.43165 691.89648,196.73634 691.76367,197.05664 C 691.63866,197.37696 691.57616,197.75977 691.57617,198.20508 C 691.57616,198.24415 691.58007,198.31055 691.58789,198.4043 C 691.59569,198.49805 691.5996,198.56836 691.59961,198.61523 L 688.44727,198.61523 M 688.2832,203.63086 L 688.2832,200.19727 L 691.74023,200.19727 L 691.74023,203.63086 L 688.2832,203.63086 M 686.31445,235.85742 L 692.12695,215.92383 L 693.73242,215.92383 L 687.89648,235.85742 L 686.31445,235.85742"
+       id="text5819" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 18,271.78906 C 17.911447,273.09636 17.406239,274.13542 16.484375,274.90625 C 15.5677,275.67708 14.369784,276.0625 12.890625,276.0625 C 11.187496,276.0625 9.8619761,275.53125 8.9140625,274.46875 C 7.971353,273.40625 7.4999993,271.91667 7.5,270 C 7.4999993,268.04167 7.9817696,266.54168 8.9453125,265.5 C 9.9088511,264.45834 11.294266,263.93751 13.101563,263.9375 C 14.570305,263.93751 15.729158,264.29689 16.578125,265.01563 C 17.432281,265.72918 17.901031,266.73959 17.984375,268.04688 L 15.648438,268.04688 C 15.54947,267.39584 15.283846,266.90105 14.851563,266.5625 C 14.419263,266.21876 13.83593,266.04688 13.101563,266.04688 C 12.059891,266.04688 11.268225,266.38282 10.726563,267.05469 C 10.184892,267.72657 9.9140594,268.70834 9.9140625,270 C 9.9140594,271.25 10.182288,272.21615 10.71875,272.89844 C 11.260412,273.58073 12.028641,273.92188 13.023438,273.92188 C 13.742181,273.92188 14.330722,273.73959 14.789063,273.375 C 15.247387,273.00521 15.544262,272.47657 15.679688,271.78906 L 18,271.78906 M 23.46875,275.80469 C 23.260412,275.8099 23.010412,275.81771 22.71875,275.82813 C 22.432288,275.84375 22.249996,275.85156 22.171875,275.85156 C 21.302081,275.85156 20.705727,275.6901 20.382813,275.36719 C 20.065103,275.03906 19.906249,274.39583 19.90625,273.4375 L 19.90625,268.84375 L 18.78125,268.84375 L 18.78125,267.25 L 19.90625,267.25 L 19.90625,264.92969 L 22.15625,264.92969 L 22.15625,267.25 L 23.46875,267.25 L 23.46875,268.84375 L 22.15625,268.84375 L 22.15625,273.54688 C 22.156247,273.77084 22.205726,273.91927 22.304688,273.99219 C 22.403642,274.0599 22.606767,274.09375 22.914063,274.09375 L 23.46875,274.09375 L 23.46875,275.80469 M 24.789063,275.74219 L 24.789063,267.25 L 26.898438,267.25 L 26.898438,268.70313 C 27.195309,268.1198 27.541663,267.69272 27.9375,267.42188 C 28.333329,267.14584 28.804682,267.00782 29.351563,267.00781 C 29.440099,267.00782 29.507807,267.01043 29.554688,267.01563 C 29.606765,267.01563 29.648432,267.01824 29.679688,267.02344 L 29.6875,269.32813 L 28.929688,269.32813 C 28.309891,269.32813 27.843746,269.48959 27.53125,269.8125 C 27.218747,270.13542 27.062497,270.61459 27.0625,271.25 L 27.0625,275.74219 L 24.789063,275.74219 M 31.023438,275.74219 L 31.023438,264.23438 L 33.296875,264.23438 L 33.296875,275.74219 L 31.023438,275.74219"
+       id="text5827" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 612.96875,266.53906 L 611.375,271.4375 L 614.57031,271.4375 L 612.96875,266.53906 M 611.59375,264.23438 L 614.32813,264.23438 L 618.47656,275.74219 L 615.99219,275.74219 L 615.21094,273.375 L 610.75,273.375 L 609.99219,275.74219 L 607.5,275.74219 L 611.59375,264.23438 M 619.53906,275.74219 L 619.53906,264.23438 L 621.8125,264.23438 L 621.8125,275.74219 L 619.53906,275.74219 M 627.64063,275.80469 C 627.43229,275.8099 627.18229,275.81771 626.89063,275.82813 C 626.60416,275.84375 626.42187,275.85156 626.34375,275.85156 C 625.47396,275.85156 624.8776,275.6901 624.55469,275.36719 C 624.23698,275.03906 624.07812,274.39583 624.07813,273.4375 L 624.07813,268.84375 L 622.95313,268.84375 L 622.95313,267.25 L 624.07813,267.25 L 624.07813,264.92969 L 626.32813,264.92969 L 626.32813,267.25 L 627.64063,267.25 L 627.64063,268.84375 L 626.32813,268.84375 L 626.32813,273.54688 C 626.32812,273.77084 626.3776,273.91927 626.47656,273.99219 C 626.57552,274.0599 626.77864,274.09375 627.08594,274.09375 L 627.64063,274.09375 L 627.64063,275.80469"
+       id="text5835"
+       sodipodi:nodetypes="cccccccccccccccccccsssccccccccccccsccc" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 828,271.78906 C 827.91145,273.09636 827.40624,274.13542 826.48438,274.90625 C 825.5677,275.67708 824.36978,276.0625 822.89063,276.0625 C 821.1875,276.0625 819.86198,275.53125 818.91406,274.46875 C 817.97135,273.40625 817.5,271.91667 817.5,270 C 817.5,268.04167 817.98177,266.54168 818.94531,265.5 C 819.90885,264.45834 821.29427,263.93751 823.10156,263.9375 C 824.5703,263.93751 825.72916,264.29689 826.57813,265.01563 C 827.43228,265.72918 827.90103,266.73959 827.98438,268.04688 L 825.64844,268.04688 C 825.54947,267.39584 825.28385,266.90105 824.85156,266.5625 C 824.41926,266.21876 823.83593,266.04688 823.10156,266.04688 C 822.05989,266.04688 821.26822,266.38282 820.72656,267.05469 C 820.18489,267.72657 819.91406,268.70834 819.91406,270 C 819.91406,271.25 820.18229,272.21615 820.71875,272.89844 C 821.26041,273.58073 822.02864,273.92188 823.02344,273.92188 C 823.74218,273.92188 824.33072,273.73959 824.78906,273.375 C 825.24739,273.00521 825.54426,272.47657 825.67969,271.78906 L 828,271.78906 M 833.46875,275.80469 C 833.26041,275.8099 833.01041,275.81771 832.71875,275.82813 C 832.43229,275.84375 832.25,275.85156 832.17188,275.85156 C 831.30208,275.85156 830.70573,275.6901 830.38281,275.36719 C 830.0651,275.03906 829.90625,274.39583 829.90625,273.4375 L 829.90625,268.84375 L 828.78125,268.84375 L 828.78125,267.25 L 829.90625,267.25 L 829.90625,264.92969 L 832.15625,264.92969 L 832.15625,267.25 L 833.46875,267.25 L 833.46875,268.84375 L 832.15625,268.84375 L 832.15625,273.54688 C 832.15625,273.77084 832.20573,273.91927 832.30469,273.99219 C 832.40364,274.0599 832.60677,274.09375 832.91406,274.09375 L 833.46875,274.09375 L 833.46875,275.80469 M 834.78906,275.74219 L 834.78906,267.25 L 836.89844,267.25 L 836.89844,268.70313 C 837.19531,268.1198 837.54166,267.69272 837.9375,267.42188 C 838.33333,267.14584 838.80468,267.00782 839.35156,267.00781 C 839.4401,267.00782 839.50781,267.01043 839.55469,267.01563 C 839.60677,267.01563 839.64843,267.01824 839.67969,267.02344 L 839.6875,269.32813 L 838.92969,269.32813 C 838.30989,269.32813 837.84375,269.48959 837.53125,269.8125 C 837.21875,270.13542 837.0625,270.61459 837.0625,271.25 L 837.0625,275.74219 L 834.78906,275.74219 M 841.02344,275.74219 L 841.02344,264.23438 L 843.29688,264.23438 L 843.29688,275.74219 L 841.02344,275.74219"
+       id="text5839" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 108.94531,264.01953 L 105.64844,252.51172 L 108.10156,252.51172 L 110.07031,260.62891 L 111.73438,252.51172 L 114.25781,252.51172 L 115.92188,260.62891 L 117.89063,252.51172 L 120.32031,252.51172 L 117.03125,264.01953 L 114.77344,264.01953 L 112.99219,255.20703 L 111.20313,264.01953 L 108.94531,264.01953 M 121.5,254.58203 L 121.5,252.51172 L 123.77344,252.51172 L 123.77344,254.58203 L 121.5,254.58203 M 121.5,264.01953 L 121.5,255.52734 L 123.77344,255.52734 L 123.77344,264.01953 L 121.5,264.01953 M 125.79688,264.01953 L 125.79688,255.52734 L 128.02344,255.52734 L 128.02344,256.53516 C 128.34114,256.12371 128.71614,255.81641 129.14844,255.61328 C 129.58072,255.40496 130.06249,255.30079 130.59375,255.30078 C 131.53124,255.30079 132.23176,255.54558 132.69531,256.03516 C 133.16405,256.51954 133.39843,257.25131 133.39844,258.23047 L 133.39844,264.01953 L 131.125,264.01953 L 131.125,258.88672 C 131.12499,258.27735 131.02083,257.84245 130.8125,257.58203 C 130.60937,257.32162 130.27604,257.19141 129.8125,257.19141 C 129.27604,257.19141 128.85156,257.35287 128.53906,257.67578 C 128.22656,257.9935 128.07031,258.42839 128.07031,258.98047 L 128.07031,264.01953 L 125.79688,264.01953 M 106.64844,284.01953 L 106.64844,272.51172 L 109.01563,272.51172 L 109.01563,277.23828 L 113.50781,272.51172 L 116.46875,272.51172 L 111.875,277.16797 L 116.88281,284.01953 L 113.99219,284.01953 L 110.24219,278.75391 L 109.01563,279.97266 L 109.01563,284.01953 L 106.64844,284.01953 M 122.9375,281.44141 L 125.20313,281.44141 C 124.97395,282.33724 124.51041,283.04037 123.8125,283.55078 C 123.11979,284.05599 122.27343,284.30859 121.27344,284.30859 C 120.04427,284.30859 119.07031,283.89714 118.35156,283.07422 C 117.63281,282.2461 117.27344,281.1263 117.27344,279.71484 C 117.27344,278.32422 117.6276,277.22787 118.33594,276.42578 C 119.04427,275.62371 120.01302,275.22267 121.24219,275.22266 C 122.54427,275.22267 123.54947,275.6185 124.25781,276.41016 C 124.96614,277.19662 125.3203,278.31902 125.32031,279.77734 C 125.3203,279.93881 125.3177,280.0612 125.3125,280.14453 C 125.31249,280.22266 125.30728,280.29818 125.29688,280.37109 L 119.625,280.37109 C 119.65625,281.03776 119.81771,281.54037 120.10938,281.87891 C 120.40625,282.21745 120.83073,282.38672 121.38281,282.38672 C 121.77343,282.38672 122.09374,282.3112 122.34375,282.16016 C 122.59374,282.00391 122.79166,281.76433 122.9375,281.44141 M 119.625,278.87891 L 122.96875,278.87891 C 122.94791,278.306 122.79426,277.8711 122.50781,277.57422 C 122.22656,277.27214 121.82031,277.1211 121.28906,277.12109 C 120.79427,277.1211 120.40364,277.27214 120.11719,277.57422 C 119.83593,277.87631 119.67187,278.3112 119.625,278.87891 M 127.16406,287.42578 L 127.16406,285.58984 C 127.23698,285.60026 127.3125,285.60807 127.39063,285.61328 C 127.46875,285.61849 127.57031,285.62109 127.69531,285.62109 C 128.14323,285.62109 128.47916,285.51432 128.70313,285.30078 C 128.92708,285.09245 129.03906,284.77734 129.03906,284.35547 C 129.03906,284.32422 129.03385,284.28516 129.02344,284.23828 C 129.01302,284.19141 129.0026,284.15234 128.99219,284.12109 L 125.92969,275.52734 L 128.42969,275.52734 L 130.21875,281.65234 L 131.96094,275.52734 L 134.35156,275.52734 L 130.85938,285.54297 C 130.59895,286.29297 130.27343,286.80338 129.88281,287.07422 C 129.49218,287.35026 128.90625,287.48828 128.125,287.48828 C 127.98437,287.48828 127.83333,287.48307 127.67188,287.47266 C 127.51041,287.46224 127.34114,287.44661 127.16406,287.42578"
+       id="text5872" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 708.94531,264.01953 L 705.64844,252.51172 L 708.10156,252.51172 L 710.07031,260.62891 L 711.73438,252.51172 L 714.25781,252.51172 L 715.92188,260.62891 L 717.89063,252.51172 L 720.32031,252.51172 L 717.03125,264.01953 L 714.77344,264.01953 L 712.99219,255.20703 L 711.20313,264.01953 L 708.94531,264.01953 M 721.5,254.58203 L 721.5,252.51172 L 723.77344,252.51172 L 723.77344,254.58203 L 721.5,254.58203 M 721.5,264.01953 L 721.5,255.52734 L 723.77344,255.52734 L 723.77344,264.01953 L 721.5,264.01953 M 725.79688,264.01953 L 725.79688,255.52734 L 728.02344,255.52734 L 728.02344,256.53516 C 728.34114,256.12371 728.71614,255.81641 729.14844,255.61328 C 729.58072,255.40496 730.06249,255.30079 730.59375,255.30078 C 731.53124,255.30079 732.23176,255.54558 732.69531,256.03516 C 733.16405,256.51954 733.39843,257.25131 733.39844,258.23047 L 733.39844,264.01953 L 731.125,264.01953 L 731.125,258.88672 C 731.12499,258.27735 731.02083,257.84245 730.8125,257.58203 C 730.60937,257.32162 730.27604,257.19141 729.8125,257.19141 C 729.27604,257.19141 728.85156,257.35287 728.53906,257.67578 C 728.22656,257.9935 728.07031,258.42839 728.07031,258.98047 L 728.07031,264.01953 L 725.79688,264.01953 M 706.64844,284.01953 L 706.64844,272.51172 L 709.01563,272.51172 L 709.01563,277.23828 L 713.50781,272.51172 L 716.46875,272.51172 L 711.875,277.16797 L 716.88281,284.01953 L 713.99219,284.01953 L 710.24219,278.75391 L 709.01563,279.97266 L 709.01563,284.01953 L 706.64844,284.01953 M 722.9375,281.44141 L 725.20313,281.44141 C 724.97395,282.33724 724.51041,283.04037 723.8125,283.55078 C 723.11979,284.05599 722.27343,284.30859 721.27344,284.30859 C 720.04427,284.30859 719.07031,283.89714 718.35156,283.07422 C 717.63281,282.2461 717.27344,281.1263 717.27344,279.71484 C 717.27344,278.32422 717.6276,277.22787 718.33594,276.42578 C 719.04427,275.62371 720.01302,275.22267 721.24219,275.22266 C 722.54427,275.22267 723.54947,275.6185 724.25781,276.41016 C 724.96614,277.19662 725.3203,278.31902 725.32031,279.77734 C 725.3203,279.93881 725.3177,280.0612 725.3125,280.14453 C 725.31249,280.22266 725.30728,280.29818 725.29688,280.37109 L 719.625,280.37109 C 719.65625,281.03776 719.81771,281.54037 720.10938,281.87891 C 720.40625,282.21745 720.83073,282.38672 721.38281,282.38672 C 721.77343,282.38672 722.09374,282.3112 722.34375,282.16016 C 722.59374,282.00391 722.79166,281.76433 722.9375,281.44141 M 719.625,278.87891 L 722.96875,278.87891 C 722.94791,278.306 722.79426,277.8711 722.50781,277.57422 C 722.22656,277.27214 721.82031,277.1211 721.28906,277.12109 C 720.79427,277.1211 720.40364,277.27214 720.11719,277.57422 C 719.83593,277.87631 719.67187,278.3112 719.625,278.87891 M 727.16406,287.42578 L 727.16406,285.58984 C 727.23698,285.60026 727.3125,285.60807 727.39063,285.61328 C 727.46875,285.61849 727.57031,285.62109 727.69531,285.62109 C 728.14323,285.62109 728.47916,285.51432 728.70313,285.30078 C 728.92708,285.09245 729.03906,284.77734 729.03906,284.35547 C 729.03906,284.32422 729.03385,284.28516 729.02344,284.23828 C 729.01302,284.19141 729.0026,284.15234 728.99219,284.12109 L 725.92969,275.52734 L 728.42969,275.52734 L 730.21875,281.65234 L 731.96094,275.52734 L 734.35156,275.52734 L 730.85938,285.54297 C 730.59895,286.29297 730.27343,286.80338 729.88281,287.07422 C 729.49218,287.35026 728.90625,287.48828 728.125,287.48828 C 727.98437,287.48828 727.83333,287.48307 727.67188,287.47266 C 727.51041,287.46224 727.34114,287.44661 727.16406,287.42578"
+       id="text5878" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 759.98438,275.60938 L 759.98438,264.10156 L 763.48438,264.10156 L 765.77344,272.85938 L 768.03125,264.10156 L 771.54688,264.10156 L 771.54688,275.60938 L 769.32813,275.60938 L 769.32813,266.32813 L 766.99219,275.60938 L 764.57031,275.60938 L 762.20313,266.32813 L 762.20313,275.60938 L 759.98438,275.60938 M 778.99219,273.03125 L 781.25781,273.03125 C 781.02864,273.92709 780.5651,274.63021 779.86719,275.14063 C 779.17447,275.64583 778.32812,275.89844 777.32813,275.89844 C 776.09896,275.89844 775.125,275.48698 774.40625,274.66406 C 773.6875,273.83594 773.32812,272.71615 773.32813,271.30469 C 773.32812,269.91407 773.68229,268.81772 774.39063,268.01563 C 775.09896,267.21355 776.06771,266.81251 777.29688,266.8125 C 778.59895,266.81251 779.60416,267.20834 780.3125,268 C 781.02083,268.78647 781.37499,269.90886 781.375,271.36719 C 781.37499,271.52865 781.37239,271.65105 781.36719,271.73438 C 781.36718,271.8125 781.36197,271.88802 781.35156,271.96094 L 775.67969,271.96094 C 775.71093,272.62761 775.87239,273.13021 776.16406,273.46875 C 776.46093,273.80729 776.88541,273.97656 777.4375,273.97656 C 777.82812,273.97656 778.14843,273.90104 778.39844,273.75 C 778.64843,273.59375 778.84635,273.35417 778.99219,273.03125 M 775.67969,270.46875 L 779.02344,270.46875 C 779.0026,269.89584 778.84895,269.46094 778.5625,269.16406 C 778.28124,268.86199 777.87499,268.71094 777.34375,268.71094 C 776.84895,268.71094 776.45833,268.86199 776.17188,269.16406 C 775.89062,269.46615 775.72656,269.90105 775.67969,270.46875 M 782.88281,275.60938 L 782.88281,267.11719 L 785.10938,267.11719 L 785.10938,268.125 C 785.42708,267.71355 785.80208,267.40626 786.23438,267.20313 C 786.66666,266.9948 787.14843,266.89063 787.67969,266.89063 C 788.61718,266.89063 789.3177,267.13543 789.78125,267.625 C 790.24999,268.10938 790.48437,268.84115 790.48438,269.82031 L 790.48438,275.60938 L 788.21094,275.60938 L 788.21094,270.47656 C 788.21093,269.86719 788.10676,269.4323 787.89844,269.17188 C 787.69531,268.91147 787.36197,268.78126 786.89844,268.78125 C 786.36197,268.78126 785.9375,268.94272 785.625,269.26563 C 785.3125,269.58334 785.15625,270.01823 785.15625,270.57031 L 785.15625,275.60938 L 782.88281,275.60938 M 800.01563,267.11719 L 800.01563,275.60938 L 797.78906,275.60938 L 797.78906,274.60156 C 797.46614,275.01302 797.08854,275.32292 796.65625,275.53125 C 796.22916,275.73437 795.74739,275.83594 795.21094,275.83594 C 794.27864,275.83594 793.57812,275.59115 793.10938,275.10156 C 792.64583,274.61198 792.41406,273.88021 792.41406,272.90625 L 792.41406,267.11719 L 794.6875,267.11719 L 794.6875,272.25 C 794.6875,272.85417 794.78906,273.28646 794.99219,273.54688 C 795.19531,273.80209 795.53125,273.92969 796,273.92969 C 796.53124,273.92969 796.95312,273.77084 797.26563,273.45313 C 797.58333,273.13021 797.74218,272.69271 797.74219,272.14063 L 797.74219,267.11719 L 800.01563,267.11719"
+       id="text5884" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="314.20523"
+       y="144.79591"
+       id="text2980"><tspan
+         sodipodi:role="line"
+         id="tspan2982"
+         x="314.20523"
+         y="144.79591"
+         style="font-size:14px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">full</tspan><tspan
+         sodipodi:role="line"
+         x="314.20523"
+         y="162.29591"
+         id="tspan2984"
+         style="font-size:14px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">screen</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="180"
+       y="86"
+       id="text2986"><tspan
+         sodipodi:role="line"
+         id="tspan2988"
+         x="180"
+         y="86"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">tabbed</tspan><tspan
+         sodipodi:role="line"
+         x="180"
+         y="102.25"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3030">layout</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="240"
+       y="86"
+       id="text2990"><tspan
+         sodipodi:role="line"
+         id="tspan2992"
+         x="240"
+         y="86"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">default</tspan><tspan
+         sodipodi:role="line"
+         x="240"
+         y="102.25"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3028">layout</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="230.73412"
+       y="154.28845"
+       id="text2994"><tspan
+         sodipodi:role="line"
+         id="tspan2996"
+         x="230.73412"
+         y="154.28845"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">dmenu</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="428.51135"
+       y="272.48416"
+       id="text2998"><tspan
+         sodipodi:role="line"
+         x="428.51135"
+         y="272.48416"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3004">focus floating/tiling</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="480"
+       y="154"
+       id="text3006"><tspan
+         sodipodi:role="line"
+         id="tspan3008"
+         x="480"
+         y="154"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">left</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="540"
+       y="154"
+       id="text3010"><tspan
+         sodipodi:role="line"
+         id="tspan3012"
+         x="540"
+         y="154"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">down</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="600"
+       y="154"
+       id="text3014"><tspan
+         sodipodi:role="line"
+         id="tspan3016"
+         x="600"
+         y="154"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">up</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="660"
+       y="154"
+       id="text3018"><tspan
+         sodipodi:role="line"
+         id="tspan3020"
+         x="660"
+         y="154"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">right</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="434.21317"
+       y="146.87415"
+       id="text3022"><tspan
+         sodipodi:role="line"
+         x="434.21317"
+         y="146.87415"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3026">split</tspan><tspan
+         sodipodi:role="line"
+         x="434.21317"
+         y="163.12415"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3397">horiz.</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="164.78459"
+       y="277.00677"
+       id="text2996"><tspan
+         sodipodi:role="line"
+         id="tspan2998"
+         x="164.78459"
+         y="277.00677"
+         style="font-size:18px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">Mod1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="830.84515"
+       y="144.03874"
+       id="text3022-6"><tspan
+         sodipodi:role="line"
+         x="830.84515"
+         y="144.03874"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3026-2">open</tspan><tspan
+         sodipodi:role="line"
+         x="830.84515"
+         y="160.28874"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3385">terminal</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="345.9798"
+       y="205.08424"
+       id="text3022-4"><tspan
+         sodipodi:role="line"
+         x="345.9798"
+         y="205.08424"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3026-5">split</tspan><tspan
+         sodipodi:role="line"
+         x="345.9798"
+         y="221.33424"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3397-1">vert.</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="194.07654"
+       y="146.9129"
+       id="text2986-0"><tspan
+         sodipodi:role="line"
+         id="tspan2988-3"
+         x="194.07654"
+         y="146.9129"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">stacked</tspan><tspan
+         sodipodi:role="line"
+         x="194.07654"
+         y="163.1629"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3030-7">layout</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="135.30087"
+       y="145.95485"
+       id="text2986-0-8"><tspan
+         sodipodi:role="line"
+         x="135.30087"
+         y="145.95485"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3030-7-6">focus</tspan><tspan
+         sodipodi:role="line"
+         x="135.30087"
+         y="162.20485"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3477">parent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="278.85074"
+       y="86.411041"
+       id="text2994-0"><tspan
+         sodipodi:role="line"
+         id="tspan2996-4"
+         x="278.85074"
+         y="86.411041"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">resize</tspan><tspan
+         sodipodi:role="line"
+         x="278.85074"
+         y="102.66104"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold"
+         id="tspan3500">mode</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Sans Bold"
+       x="340.89798"
+       y="83.480705"
+       id="text3755"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3757"
+         x="340.89798"
+         y="83.480705"
+         style="font-size:22px">T</tspan></text>
+  </g>
+</svg>
diff --git a/docs/keyboard-layer2.png b/docs/keyboard-layer2.png
new file mode 100644 (file)
index 0000000..83616d9
Binary files /dev/null and b/docs/keyboard-layer2.png differ
diff --git a/docs/keyboard-layer2.svg b/docs/keyboard-layer2.svg
new file mode 100644 (file)
index 0000000..70cc602
--- /dev/null
@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="900"
+   height="300"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="keyboard-layer2.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 150 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="900 : 150 : 1"
+       inkscape:persp3d-origin="450 : 100 : 1"
+       id="perspective3385" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path5387"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5390"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="Tail"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Tail"
+       style="overflow:visible">
+      <g
+         id="g5342"
+         transform="scale(-1.2)">
+        <path
+           id="path5344"
+           d="M -3.8048674,-3.9585227 L 0.54352094,-0.00068114835"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5346"
+           d="M -1.2866832,-3.9585227 L 3.0617053,-0.00068114835"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5348"
+           d="M 1.3053582,-3.9585227 L 5.6537466,-0.00068114835"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5350"
+           d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5352"
+           d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+        <path
+           id="path5354"
+           d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
+      </g>
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path5363"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(-5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path5369"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(-5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Send"
+       style="overflow:visible;">
+      <path
+         id="path5375"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.2) rotate(180)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Send"
+       style="overflow:visible;">
+      <path
+         id="path5357"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.3) rotate(180) translate(-5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path5381"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path5372"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) translate(-5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0437869"
+     inkscape:cx="412.7029"
+     inkscape:cy="149.32256"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:grid-points="true"
+     showgrid="true"
+     gridtolerance="15px"
+     showborder="false"
+     inkscape:window-width="956"
+     inkscape:window-height="958"
+     inkscape:window-x="1600"
+     inkscape:window-y="221"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0px"
+       originy="0px"
+       spacingx="7.5px"
+       spacingy="7.5px"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.12156863"
+       empopacity="0.25098039"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,0 L 60,0 L 60,60 L 0,60 L 0,0 z "
+       id="rect2186" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 60,0 L 120,0 L 120,60 L 60,60 L 60,0 z "
+       id="rect2218" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 120,0 L 180,0 L 180,60 L 120,60 L 120,0 z "
+       id="rect2222" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 180,0 L 240,0 L 240,60 L 180,60 L 180,0 z "
+       id="rect2228" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 240,0 L 300,0 L 300,60 L 240,60 L 240,0 z "
+       id="rect2230" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 300,0 L 360,0 L 360,60 L 300,60 L 300,0 z "
+       id="rect2232" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 360,0 L 420,0 L 420,60 L 360,60 L 360,0 z "
+       id="rect2234" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 420,0 L 480,0 L 480,60 L 420,60 L 420,0 z "
+       id="rect2236" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 480,0 L 540,0 L 540,60 L 480,60 L 480,0 z "
+       id="rect2238" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 540,0 L 600,0 L 600,60 L 540,60 L 540,0 z "
+       id="rect2240" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 600,0 L 660,0 L 660,60 L 600,60 L 600,0 z "
+       id="rect2242" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 660,0 L 720,0 L 720,60 L 660,60 L 660,0 z "
+       id="rect2244" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 720,0 L 780,0 L 780,60 L 720,60 L 720,0 z "
+       id="rect2246" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 780,0 L 900,0 L 900,60 L 780,60 L 780,0 z "
+       id="rect2248" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,60 L 90,60 L 90,120 L 0,120 L 0,60 z "
+       id="rect2250" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 90,60 L 150,60 L 150,120 L 90,120 L 90,60 z "
+       id="rect2252" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 150,60 L 210,60 L 210,120 L 150,120 L 150,60 z "
+       id="rect2254" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 210,60 L 270,60 L 270,120 L 210,120 L 210,60 z "
+       id="rect2256" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 270,60 L 330,60 L 330,120 L 270,120 L 270,60 z "
+       id="rect2258" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 330,60 L 390,60 L 390,120 L 330,120 L 330,60 z "
+       id="rect2262" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 390,60 L 450,60 L 450,120 L 390,120 L 390,60 z "
+       id="rect2264" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 450,60 L 510,60 L 510,120 L 450,120 L 450,60 z "
+       id="rect2266" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 510,60 L 570,60 L 570,120 L 510,120 L 510,60 z "
+       id="rect2270" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 570,60 L 630,60 L 630,120 L 570,120 L 570,60 z "
+       id="rect2272" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 630,60 L 690,60 L 690,120 L 630,120 L 630,60 z "
+       id="rect2274" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 690,60 L 750,60 L 750,120 L 690,120 L 690,60 z "
+       id="rect2278" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 750,60 L 810,60 L 810,120 L 750,120 L 750,60 z "
+       id="rect2280" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 810,60 L 900,60 L 900,120 L 810,120 L 810,60 z "
+       id="rect2284" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,120 L 105,120 L 105,180 L 0,180 L 0,120 z "
+       id="rect2286" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 105,120 L 165,120 L 165,180 L 105,180 L 105,120 z "
+       id="rect2292" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 165,120 L 225,120 L 225,180 L 165,180 L 165,120 z "
+       id="rect2296" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 225,120 L 285,120 L 285,180 L 225,180 L 225,120 z "
+       id="rect2298" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 285,120 L 345,120 L 345,180 L 285,180 L 285,120 z "
+       id="rect2300" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 345,120 L 405,120 L 405,180 L 345,180 L 345,120 z "
+       id="rect2302" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 405,120 L 465,120 L 465,180 L 405,180 L 405,120 z "
+       id="rect2306" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 465,120 L 525,120 L 525,180 L 465,180 L 465,120 z "
+       id="rect2308" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 525,120 L 585,120 L 585,180 L 525,180 L 525,120 z "
+       id="rect2312" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 585,120 L 645,120 L 645,180 L 585,180 L 585,120 z "
+       id="rect2314" />
+    <path
+       style="fill:#00adff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 645,120 L 705,120 L 705,180 L 645,180 L 645,120 z "
+       id="rect2316" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 705,120 L 765,120 L 765,180 L 705,180 L 705,120 z "
+       id="rect2318" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 765,120 L 900,120 L 900,180 L 765,180 L 765,120 z "
+       id="rect2320" />
+    <path
+       style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,180 L 135,180 L 135,240 L 0,240 L 0,180 z "
+       id="rect2322" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 135,180 L 195,180 L 195,240 L 135,240 L 135,180 z "
+       id="rect2324" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 195,180 L 255,180 L 255,240 L 195,240 L 195,180 z "
+       id="rect2326" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 255,180 L 315,180 L 315,240 L 255,240 L 255,180 z "
+       id="rect2330" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 315,180 L 375,180 L 375,240 L 315,240 L 315,180 z "
+       id="rect2334" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 375,180 L 435,180 L 435,240 L 375,240 L 375,180 z "
+       id="rect2336" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 435,180 L 495,180 L 495,240 L 435,240 L 435,180 z "
+       id="rect2338" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 495,180 L 555,180 L 555,240 L 495,240 L 495,180 z "
+       id="rect2340" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 555,180 L 615,180 L 615,240 L 555,240 L 555,180 z "
+       id="rect2342" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 615,180 L 675,180 L 675,240 L 615,240 L 615,180 z "
+       id="rect2344" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 675,180 L 735,180 L 735,240 L 675,240 L 675,180 z "
+       id="rect2346" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 735,180 L 900,180 L 900,240 L 735,240 L 735,180 z "
+       id="rect2348" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 0,240 L 90,240 L 90,300 L 0,300 L 0,240 z "
+       id="rect2350" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 810,240 L 900,240 L 900,300 L 810,300 L 810,240 z "
+       id="rect2352" />
+    <path
+       style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 150,240 L 240,240 L 240,300 L 150,300 L 150,240 z "
+       id="rect2354" />
+    <path
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 600,240 L 690,240 L 690,300 L 600,300 L 600,240 z "
+       id="rect2360" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 240,240 L 600,240 L 600,300 L 240,300 L 240,240 z "
+       id="rect2362" />
+    <path
+       style="fill:#efefef;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 90,240 L 150,240 L 150,300 L 90,300 L 90,240 z "
+       id="rect2364" />
+    <path
+       style="fill:#efefef;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 690,240 L 750,240 L 750,300 L 690,300 L 690,240 z "
+       id="rect2366" />
+    <path
+       style="fill:#efefef;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 750,240 L 810,240 L 810,300 L 750,300 L 750,240 z "
+       id="rect2368" />
+    <path
+       style=""
+       d=""
+       id="flowRoot4146" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 75.351563,18.826172 L 74.4375,11.056641 L 74.4375,6.3691406 L 78.046875,6.3691406 L 78.046875,11.056641 L 77.132813,18.826172 L 75.351563,18.826172 M 74.484375,23.630859 L 74.484375,20.173828 L 77.964844,20.173828 L 77.964844,23.630859 L 74.484375,23.630859 M 75.351563,53.630859 L 75.351563,42.158203 L 71.34375,42.158203 L 71.34375,39.802734 L 71.601563,39.802734 C 73.062496,39.802748 74.124995,39.576186 74.789063,39.123047 C 75.460931,38.669937 75.855462,37.912125 75.972656,36.849609 L 78.65625,36.849609 L 78.65625,53.630859 L 75.351563,53.630859"
+       id="text5091" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 23.34375,14.220703 L 23.34375,16.810547 C 22.531233,17.365241 21.761702,17.775396 21.035156,18.041016 C 20.316391,18.298833 19.605455,18.42774 18.902344,18.427734 C 18.542956,18.42774 18.183581,18.39649 17.824219,18.333984 C 17.464832,18.27149 17.105457,18.181646 16.746094,18.064453 C 16.558583,18.001959 16.281239,17.904303 15.914063,17.771484 C 14.203116,17.185553 12.902336,16.892585 12.011719,16.892578 C 11.34765,16.892585 10.652339,17.041022 9.9257813,17.337891 C 9.2070275,17.626959 8.3984345,18.091802 7.5,18.732422 L 7.5,16.142578 C 8.3359346,15.580086 9.1328088,15.162118 9.890625,14.888672 C 10.648432,14.607431 11.363275,14.466806 12.035156,14.466797 C 12.949211,14.466806 14.085929,14.693368 15.445313,15.146484 C 15.46874,15.154305 15.484365,15.158212 15.492188,15.158203 C 15.632802,15.205087 15.847646,15.279305 16.136719,15.380859 C 17.347644,15.810555 18.285143,16.025398 18.949219,16.025391 C 19.613267,16.025398 20.29686,15.880867 21,15.591797 C 21.703109,15.302743 22.484358,14.845712 23.34375,14.220703 M 11.988281,35.033203 L 15.011719,35.033203 L 17.320313,39.369141 L 15.65625,39.369141 L 11.988281,35.033203"
+       id="text5103" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 136.47578,20.443359 C 136.04608,21.099612 135.54999,21.583986 134.9875,21.896484 C 134.42499,22.201173 133.76093,22.353517 132.99532,22.353516 C 131.76093,22.353517 130.81953,22.01758 130.1711,21.345703 C 129.53047,20.673831 129.21015,19.681645 129.21016,18.369141 C 129.21015,16.50196 129.75312,14.935556 130.83907,13.669922 C 131.93281,12.404308 133.27656,11.771496 134.87032,11.771484 C 135.4953,11.771496 136.03827,11.900402 136.49922,12.158203 C 136.96015,12.416027 137.33905,12.798839 137.63594,13.306641 L 138.25703,12.158203 L 140.34297,12.158203 L 138.62032,19.166016 C 138.59686,19.251958 138.57733,19.341801 138.56172,19.435547 C 138.54608,19.521488 138.53827,19.591801 138.53828,19.646484 C 138.53827,19.919926 138.63202,20.126957 138.81953,20.267578 C 139.00702,20.400394 139.28436,20.4668 139.65157,20.466797 C 139.95624,20.4668 140.27264,20.388675 140.60078,20.232422 C 140.9367,20.076175 141.2492,19.857426 141.53828,19.576172 C 142.21014,18.951177 142.71795,18.220709 143.06172,17.384766 C 143.41326,16.548835 143.58904,15.630867 143.58907,14.630859 C 143.58904,12.75587 142.86248,11.216809 141.40938,10.013672 C 139.96405,8.8027492 138.09686,8.1972811 135.80782,8.1972656 C 134.70624,8.1972811 133.6789,8.3300934 132.72578,8.5957031 C 131.78046,8.8613429 130.92109,9.2558737 130.14766,9.7792969 C 128.81953,10.669935 127.79609,11.783215 127.07735,13.119141 C 126.36641,14.455087 126.01094,15.91993 126.01094,17.513672 C 126.01094,19.912113 126.81953,21.83008 128.43672,23.267578 C 130.0539,24.697265 132.21406,25.412108 134.91719,25.412109 C 136.1828,25.412108 137.41718,25.220702 138.62032,24.837891 C 139.83124,24.455077 140.95623,23.90039 141.99532,23.173828 L 142.95625,24.544922 C 141.76092,25.443358 140.49139,26.119138 139.14766,26.572266 C 137.81171,27.025387 136.41718,27.25195 134.96407,27.251953 C 133.46405,27.25195 132.08515,27.060543 130.82735,26.677734 C 129.56953,26.302732 128.45234,25.744139 127.47578,25.001953 C 126.26484,24.05664 125.35859,22.966798 124.75703,21.732422 C 124.15547,20.49805 123.85469,19.099614 123.85469,17.537109 C 123.85469,16.232429 124.05781,14.990243 124.46407,13.810547 C 124.87813,12.623058 125.48359,11.544934 126.28047,10.576172 C 127.43672,9.1621238 128.82734,8.0918124 130.45235,7.3652344 C 132.07734,6.6386889 133.88593,6.275408 135.87813,6.2753906 C 137.19843,6.275408 138.43671,6.4550953 139.59297,6.8144531 C 140.75702,7.1660321 141.76873,7.6660316 142.62813,8.3144531 C 143.68279,9.1347801 144.46795,10.072279 144.9836,11.126953 C 145.50701,12.17384 145.76873,13.357432 145.76875,14.677734 C 145.76873,15.966805 145.51092,17.15821 144.99532,18.251953 C 144.48748,19.337895 143.75311,20.267581 142.79219,21.041016 C 142.2453,21.478518 141.64764,21.814455 140.99922,22.048828 C 140.35858,22.275392 139.69061,22.388673 138.99532,22.388672 C 138.16718,22.388673 137.54218,22.224611 137.12032,21.896484 C 136.70624,21.568361 136.4914,21.083987 136.47578,20.443359 M 137.06172,15.427734 C 136.96015,14.794931 136.73358,14.314462 136.38203,13.986328 C 136.03827,13.650401 135.58124,13.482432 135.01094,13.482422 C 134.1203,13.482432 133.34687,13.966807 132.69063,14.935547 C 132.03437,15.904305 131.70624,17.068366 131.70625,18.427734 C 131.70624,19.146489 131.86249,19.693363 132.175,20.068359 C 132.49531,20.443363 132.95624,20.630862 133.55782,20.630859 C 134.20624,20.630862 134.79608,20.384769 135.32735,19.892578 C 135.8664,19.400395 136.23358,18.75977 136.42891,17.970703 L 137.06172,15.427734 M 128.56563,53.630859 C 128.58125,52.130861 128.90156,50.861331 129.52657,49.822266 C 130.15156,48.775395 131.26094,47.716803 132.85469,46.646484 C 133.09687,46.482429 133.44844,46.255867 133.90938,45.966797 C 136.01875,44.615243 137.07343,43.314463 137.07344,42.064453 C 137.07343,41.322278 136.85078,40.736341 136.40547,40.306641 C 135.96015,39.876967 135.35078,39.662123 134.57735,39.662109 C 133.73359,39.662123 133.08125,39.927748 132.62032,40.458984 C 132.16719,40.982435 131.94062,41.732434 131.94063,42.708984 L 131.94063,42.849609 L 128.84688,42.849609 C 128.84688,40.927747 129.3625,39.44728 130.39375,38.408203 C 131.425,37.369157 132.89375,36.849626 134.8,36.849609 C 136.52656,36.849626 137.90546,37.322282 138.93672,38.267578 C 139.96796,39.205093 140.48358,40.455091 140.4836,42.017578 C 140.48358,43.134776 140.21405,44.103525 139.675,44.923828 C 139.13593,45.744149 138.09296,46.677741 136.5461,47.724609 C 136.21796,47.951178 135.76484,48.248052 135.18672,48.615234 C 133.71797,49.560551 132.88984,50.2793 132.70235,50.771484 L 140.31953,50.771484 L 140.31953,53.630859 L 128.56563,53.630859"
+       id="text5127" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 195.28125,13.693359 L 194.25,16.552734 L 197.19141,16.552734 L 198.19922,13.693359 L 195.28125,13.693359 M 195.28125,6.4746094 L 197.87109,6.4746094 L 196.16016,11.337891 L 198.99609,11.337891 L 200.73047,6.4746094 L 203.32031,6.4746094 L 201.58594,11.337891 L 204.90234,11.337891 L 204.03516,13.693359 L 200.75391,13.693359 L 199.76953,16.529297 L 203.16797,16.529297 L 202.33594,18.873047 L 198.92578,18.873047 L 197.19141,23.748047 L 194.60156,23.748047 L 196.33594,18.873047 L 193.47656,18.873047 L 191.73047,23.748047 L 189.15234,23.748047 L 190.86328,18.873047 L 187.5,18.873047 L 188.39063,16.529297 L 191.69531,16.529297 L 192.70313,13.693359 L 189.19922,13.693359 L 190.06641,11.337891 L 193.54688,11.337891 L 195.28125,6.4746094 M 190.07813,48.521484 L 193.30078,48.521484 C 193.30859,49.458989 193.53515,50.166019 193.98047,50.642578 C 194.42578,51.111331 195.08593,51.345705 195.96094,51.345703 C 196.80468,51.345705 197.45312,51.126956 197.90625,50.689453 C 198.36718,50.244144 198.59765,49.607426 198.59766,48.779297 C 198.59765,47.951178 198.32812,47.326178 197.78906,46.904297 C 197.2578,46.474617 196.46484,46.259773 195.41016,46.259766 C 195.35546,46.259773 195.26953,46.263679 195.15234,46.271484 C 195.04296,46.279304 194.96093,46.28321 194.90625,46.283203 L 194.90625,43.962891 L 195.26953,43.962891 C 196.23827,43.9629 196.95312,43.7754 197.41406,43.400391 C 197.8828,43.017589 198.11718,42.435558 198.11719,41.654297 C 198.11718,41.005872 197.91796,40.494154 197.51953,40.119141 C 197.1289,39.736342 196.59374,39.544936 195.91406,39.544922 C 195.17187,39.544936 194.59765,39.763686 194.19141,40.201172 C 193.78515,40.638685 193.58203,41.259778 193.58203,42.064453 L 193.58203,42.205078 L 190.41797,42.205078 C 190.45703,40.486341 190.96094,39.169936 191.92969,38.255859 C 192.90625,37.334001 194.28125,36.873064 196.05469,36.873047 C 197.73437,36.873064 199.0664,37.283219 200.05078,38.103516 C 201.03514,38.923843 201.52733,40.02931 201.52734,41.419922 C 201.52733,42.154308 201.35936,42.798839 201.02344,43.353516 C 200.68749,43.908213 200.18358,44.365244 199.51172,44.724609 C 200.37108,45.099618 201.01952,45.619149 201.45703,46.283203 C 201.90233,46.93946 202.12499,47.724615 202.125,48.638672 C 202.12499,50.318363 201.57421,51.650393 200.47266,52.634766 C 199.37108,53.619141 197.86718,54.111328 195.96094,54.111328 C 194.07812,54.111328 192.625,53.634766 191.60156,52.681641 C 190.58594,51.720705 190.07812,50.357425 190.07813,48.591797 L 190.07813,48.521484"
+       id="text5139" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 254.46094,21.451172 C 255.10155,21.365237 255.58984,21.134768 255.92578,20.759766 C 256.26171,20.384769 256.42968,19.884769 256.42969,19.259766 C 256.42968,18.705083 256.26952,18.248052 255.94922,17.888672 C 255.63671,17.52149 255.14062,17.236335 254.46094,17.033203 L 254.46094,21.451172 M 253.06641,13.435547 L 253.06641,9.4511719 C 252.45703,9.529311 251.99218,9.7402483 251.67188,10.083984 C 251.35156,10.419935 251.1914,10.87306 251.19141,11.443359 C 251.1914,11.919934 251.33984,12.318371 251.63672,12.638672 C 251.9414,12.958995 252.41796,13.22462 253.06641,13.435547 M 253.06641,26.267578 L 253.06641,24.017578 C 251.30078,23.908203 249.98047,23.396485 249.10547,22.482422 C 248.23047,21.568361 247.79297,20.24805 247.79297,18.521484 L 250.93359,18.521484 C 250.97265,19.365239 251.16796,20.033207 251.51953,20.525391 C 251.8789,21.009768 252.39453,21.318362 253.06641,21.451172 L 253.06641,16.599609 C 251.2539,16.138679 249.96484,15.537117 249.19922,14.794922 C 248.43359,14.052744 248.05078,13.03712 248.05078,11.748047 C 248.05078,10.318373 248.5039,9.1660301 249.41016,8.2910156 C 250.32422,7.4160318 251.54296,6.959001 253.06641,6.9199219 L 253.06641,5.4199219 L 254.46094,5.4199219 L 254.46094,6.9199219 C 255.98437,6.9980635 257.17186,7.4590005 258.02344,8.3027344 C 258.87499,9.1386864 259.34374,10.318373 259.42969,11.841797 L 256.24219,11.841797 C 256.18749,11.115247 256.01171,10.56056 255.71484,10.177734 C 255.42577,9.7871232 255.0078,9.5683734 254.46094,9.5214844 L 254.46094,13.787109 C 256.39062,14.388681 257.74999,15.07618 258.53906,15.849609 C 259.32811,16.623054 259.72264,17.642584 259.72266,18.908203 C 259.72264,20.400394 259.26171,21.591799 258.33984,22.482422 C 257.42577,23.373047 256.1328,23.892578 254.46094,24.041016 L 254.46094,26.267578 L 253.06641,26.267578 M 254.64844,47.419922 L 254.64844,40.236328 L 250.08984,47.419922 L 254.64844,47.419922 M 254.57813,53.630859 L 254.57813,50.009766 L 247.5,50.009766 L 247.5,47.056641 L 253.6875,37.330078 L 257.84766,37.330078 L 257.84766,47.337891 L 259.79297,47.337891 L 259.79297,50.009766 L 257.84766,50.009766 L 257.84766,53.630859 L 254.57813,53.630859"
+       id="text5145" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 320.42578,19.740234 C 320.42577,20.263675 320.60155,20.705081 320.95313,21.064453 C 321.30467,21.416018 321.73827,21.591799 322.25391,21.591797 C 322.75389,21.591799 323.18358,21.412112 323.54297,21.052734 C 323.90233,20.68555 324.08201,20.24805 324.08203,19.740234 C 324.08201,19.240239 323.90233,18.814458 323.54297,18.462891 C 323.19139,18.103521 322.7617,17.923834 322.25391,17.923828 C 321.73827,17.923834 321.30467,18.099615 320.95313,18.451172 C 320.60155,18.794927 320.42577,19.224614 320.42578,19.740234 M 317.88281,19.740234 C 317.8828,18.521489 318.30468,17.494147 319.14844,16.658203 C 319.99217,15.822273 321.02733,15.404305 322.25391,15.404297 C 323.45701,15.404305 324.48045,15.830086 325.32422,16.681641 C 326.17576,17.525397 326.60154,18.544927 326.60156,19.740234 C 326.60154,20.943362 326.17576,21.974611 325.32422,22.833984 C 324.47264,23.685547 323.4492,24.111328 322.25391,24.111328 C 321.02733,24.111328 319.99217,23.689453 319.14844,22.845703 C 318.30468,22.001955 317.8828,20.9668 317.88281,19.740234 M 311.07422,24.111328 L 321.08203,6.8496094 L 322.96875,6.8496094 L 312.96094,24.111328 L 311.07422,24.111328 M 310.04297,11.220703 C 310.04297,11.73634 310.21484,12.169933 310.55859,12.521484 C 310.91015,12.873058 311.34375,13.048839 311.85938,13.048828 C 312.36718,13.048839 312.79687,12.873058 313.14844,12.521484 C 313.50781,12.162121 313.68749,11.728528 313.6875,11.220703 C 313.68749,10.720716 313.50781,10.294935 313.14844,9.9433594 C 312.79687,9.5839984 312.36718,9.4043111 311.85938,9.4042969 C 311.34375,9.4043111 310.91015,9.5800922 310.55859,9.9316406 C 310.21484,10.275404 310.04297,10.705091 310.04297,11.220703 M 307.5,11.220703 C 307.5,10.001967 307.92187,8.9707178 308.76563,8.1269531 C 309.60937,7.275407 310.64062,6.8496262 311.85938,6.8496094 C 313.06249,6.8496262 314.08593,7.2793132 314.92969,8.1386719 C 315.78124,8.990249 316.20702,10.017592 316.20703,11.220703 C 316.20702,12.423839 315.78124,13.451182 314.92969,14.302734 C 314.08593,15.146493 313.06249,15.568367 311.85938,15.568359 C 310.63281,15.568367 309.59765,15.150399 308.75391,14.314453 C 307.91797,13.478526 307.5,12.447277 307.5,11.220703 M 310.85156,49.119141 L 314.13281,49.119141 C 314.1875,49.853519 314.43359,50.423831 314.87109,50.830078 C 315.30859,51.228518 315.89453,51.427737 316.62891,51.427734 C 317.53515,51.427737 318.22655,51.162112 318.70313,50.630859 C 319.18749,50.099613 319.42968,49.337895 319.42969,48.345703 C 319.42968,47.416022 319.18358,46.685554 318.69141,46.154297 C 318.19921,45.615242 317.51952,45.345711 316.65234,45.345703 C 316.16796,45.345711 315.74218,45.443368 315.375,45.638672 C 315.00781,45.833992 314.69531,46.123054 314.4375,46.505859 L 311.41406,46.330078 L 312.50391,37.330078 L 322.14844,37.330078 L 322.14844,40.166016 L 314.87109,40.166016 L 314.4375,43.529297 C 314.80468,43.240245 315.22656,43.025401 315.70313,42.884766 C 316.17968,42.736339 316.71093,42.66212 317.29688,42.662109 C 318.96874,42.66212 320.3164,43.169932 321.33984,44.185547 C 322.37108,45.20118 322.88671,46.53321 322.88672,48.181641 C 322.88671,49.986332 322.3203,51.427737 321.1875,52.505859 C 320.05468,53.576172 318.53515,54.111328 316.62891,54.111328 C 314.89453,54.111328 313.51172,53.669922 312.48047,52.787109 C 311.45703,51.896486 310.91406,50.673831 310.85156,49.119141"
+       id="text5151" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 373.13672,6.5214844 L 376.08984,6.5214844 L 381.72656,13.095703 L 378.97266,13.095703 L 374.625,8.7480469 L 370.25391,13.095703 L 367.5,13.095703 L 373.13672,6.5214844 M 372.15234,48.298828 C 372.15234,49.25977 372.39062,50.021488 372.86719,50.583984 C 373.35156,51.146487 374.00781,51.427737 374.83594,51.427734 C 375.60937,51.427737 376.21484,51.154299 376.65234,50.607422 C 377.08983,50.06055 377.30858,49.298832 377.30859,48.322266 C 377.30858,47.423834 377.08202,46.724616 376.62891,46.224609 C 376.17577,45.724617 375.53905,45.474618 374.71875,45.474609 C 373.91406,45.474618 373.28515,45.724617 372.83203,46.224609 C 372.3789,46.724616 372.15234,47.416022 372.15234,48.298828 M 372.10547,43.916016 C 372.48828,43.525401 372.94921,43.232432 373.48828,43.037109 C 374.02734,42.833995 374.6289,42.732433 375.29297,42.732422 C 376.93358,42.732433 378.24608,43.232432 379.23047,44.232422 C 380.22264,45.23243 380.71874,46.56446 380.71875,48.228516 C 380.71874,49.994144 380.17968,51.419924 379.10156,52.505859 C 378.02343,53.591797 376.60155,54.134765 374.83594,54.134766 C 372.79687,54.134765 371.24609,53.431641 370.18359,52.025391 C 369.1289,50.619144 368.60156,48.560552 368.60156,45.849609 C 368.60156,42.935558 369.16797,40.708997 370.30078,39.169922 C 371.43359,37.623063 373.0664,36.849626 375.19922,36.849609 C 376.68358,36.849626 377.8789,37.236345 378.78516,38.009766 C 379.69921,38.783218 380.19921,39.830092 380.28516,41.150391 L 376.88672,41.150391 C 376.80858,40.611341 376.59765,40.205092 376.25391,39.931641 C 375.91015,39.658217 375.42968,39.521498 374.8125,39.521484 C 373.96874,39.521498 373.32031,39.888686 372.86719,40.623047 C 372.41406,41.349622 372.16015,42.447277 372.10547,43.916016"
+       id="text5157" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 432.85547,16.095703 L 431.96484,16.740234 C 431.60546,16.990241 431.33593,17.291022 431.15625,17.642578 C 430.97656,17.994146 430.88671,18.388677 430.88672,18.826172 C 430.88671,19.490239 431.11328,20.048832 431.56641,20.501953 C 432.01953,20.955081 432.58593,21.181643 433.26563,21.181641 C 433.76562,21.181643 434.24218,21.080081 434.69531,20.876953 C 435.15624,20.666019 435.58202,20.361331 435.97266,19.962891 L 432.85547,16.095703 M 433.79297,12.404297 L 434.20313,12.111328 C 434.57812,11.853527 434.85546,11.564465 435.03516,11.244141 C 435.21483,10.923841 435.30468,10.556654 435.30469,10.142578 C 435.30468,9.7441545 435.17968,9.4277486 434.92969,9.1933594 C 434.68749,8.958999 434.35546,8.8418117 433.93359,8.8417969 C 433.5039,8.8418117 433.16406,8.9629053 432.91406,9.2050781 C 432.66406,9.4394673 432.53906,9.7597795 432.53906,10.166016 C 432.53906,10.384779 432.59765,10.62306 432.71484,10.880859 C 432.83984,11.138684 433.01562,11.412122 433.24219,11.701172 L 433.79297,12.404297 M 431.15625,13.962891 L 430.47656,13.072266 C 430.125,12.603527 429.87109,12.166027 429.71484,11.759766 C 429.5664,11.345715 429.49218,10.912122 429.49219,10.458984 C 429.49218,9.2089988 429.89062,8.2168123 430.6875,7.4824219 C 431.49218,6.7402513 432.58203,6.3691579 433.95703,6.3691406 C 435.27733,6.3691579 436.3203,6.7090013 437.08594,7.3886719 C 437.85155,8.0683749 438.23436,8.9863428 438.23438,10.142578 C 438.23436,11.017591 438.0078,11.802746 437.55469,12.498047 C 437.10936,13.185557 436.40624,13.833994 435.44531,14.443359 L 437.91797,17.490234 C 438.15233,17.107428 438.33593,16.677741 438.46875,16.201172 C 438.60936,15.724617 438.70702,15.193368 438.76172,14.607422 L 441.80859,14.607422 C 441.72264,15.623055 441.5117,16.56446 441.17578,17.431641 C 440.83983,18.298833 440.37889,19.091801 439.79297,19.810547 L 442.93359,23.630859 L 438.94922,23.630859 L 437.77734,22.189453 C 437.08983,22.822266 436.33202,23.302735 435.50391,23.630859 C 434.68359,23.951172 433.82421,24.111328 432.92578,24.111328 C 431.33203,24.111328 430.02734,23.638672 429.01172,22.693359 C 428.0039,21.748049 427.5,20.541019 427.5,19.072266 C 427.5,17.978521 427.78125,17.037116 428.34375,16.248047 C 428.90625,15.458993 429.84375,14.697275 431.15625,13.962891 M 434.66016,53.630859 L 431.15625,53.630859 C 431.28125,51.341799 431.83203,49.07227 432.80859,46.822266 C 433.79296,44.572275 435.19531,42.361339 437.01563,40.189453 L 428.76563,40.189453 L 428.76563,37.330078 L 440.66016,37.330078 L 440.66016,39.849609 C 438.8164,41.880871 437.39843,44.029306 436.40625,46.294922 C 435.42187,48.560552 434.83984,51.005862 434.66016,53.630859"
+       id="text5163" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 493.5,13.212891 L 491.4375,16.119141 L 489.44531,14.724609 L 491.69531,11.900391 L 488.41406,10.986328 L 489.17578,8.6074219 L 492.32813,9.7324219 L 492.32813,6.3691406 L 494.64844,6.3691406 L 494.64844,9.7324219 L 497.80078,8.6308594 L 498.58594,11.009766 L 495.30469,11.900391 L 497.53125,14.701172 L 495.49219,16.166016 L 493.5,13.212891 M 490.875,48.755859 C 490.875,49.576176 491.10156,50.208988 491.55469,50.654297 C 492.01562,51.099612 492.67187,51.322268 493.52344,51.322266 C 494.33593,51.322268 494.97265,51.095706 495.43359,50.642578 C 495.90233,50.189457 496.13671,49.560551 496.13672,48.755859 C 496.13671,47.982428 495.89843,47.361334 495.42188,46.892578 C 494.9453,46.423835 494.31249,46.189461 493.52344,46.189453 C 492.73437,46.189461 492.09374,46.427742 491.60156,46.904297 C 491.11718,47.380866 490.875,47.998053 490.875,48.755859 M 491.14453,41.560547 C 491.14453,42.208996 491.34765,42.708995 491.75391,43.060547 C 492.16015,43.404307 492.74218,43.576182 493.5,43.576172 C 494.2578,43.576182 494.83984,43.400401 495.24609,43.048828 C 495.66015,42.697277 495.86718,42.201183 495.86719,41.560547 C 495.86718,40.93556 495.65624,40.443373 495.23438,40.083984 C 494.81249,39.724623 494.23437,39.544936 493.5,39.544922 C 492.78124,39.544936 492.20703,39.72853 491.77734,40.095703 C 491.35546,40.462904 491.14453,40.951185 491.14453,41.560547 M 489.9375,44.818359 C 489.23437,44.427744 488.72656,43.970713 488.41406,43.447266 C 488.10156,42.923839 487.94531,42.255871 487.94531,41.443359 C 487.94531,40.005873 488.4375,38.876968 489.42188,38.056641 C 490.40625,37.236345 491.76562,36.826189 493.5,36.826172 C 495.24999,36.826189 496.61718,37.236345 497.60156,38.056641 C 498.59374,38.869155 499.08983,39.998061 499.08984,41.443359 C 499.08983,42.216808 498.92186,42.888683 498.58594,43.458984 C 498.24999,44.021494 497.74608,44.474619 497.07422,44.818359 C 497.89452,45.20118 498.51171,45.73243 498.92578,46.412109 C 499.33983,47.083991 499.54686,47.904303 499.54688,48.873047 C 499.54686,50.505862 499.0078,51.787111 497.92969,52.716797 C 496.85936,53.646484 495.3828,54.111328 493.5,54.111328 C 491.59375,54.111328 490.11328,53.650391 489.05859,52.728516 C 488.0039,51.806642 487.47656,50.521487 487.47656,48.873047 C 487.47656,47.912115 487.67187,47.107428 488.0625,46.458984 C 488.46094,45.802742 489.08594,45.255868 489.9375,44.818359"
+       id="text5169" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 557.85938,6.3691406 C 556.78124,8.1347811 555.98046,9.9316543 555.45703,11.759766 C 554.93359,13.587901 554.67187,15.505868 554.67188,17.513672 C 554.67187,19.513676 554.93359,21.427737 555.45703,23.255859 C 555.98046,25.083983 556.78124,26.880856 557.85938,28.646484 L 555.38672,28.646484 C 554.01953,26.779294 552.98046,24.904296 552.26953,23.021484 C 551.5664,21.130862 551.21484,19.294926 551.21484,17.513672 C 551.21484,15.73243 551.5664,13.896494 552.26953,12.005859 C 552.98046,10.115248 554.01953,8.2363435 555.38672,6.3691406 L 557.85938,6.3691406 M 556.06641,42.685547 C 556.0664,41.724621 555.82421,40.96681 555.33984,40.412109 C 554.86327,39.849623 554.21093,39.568373 553.38281,39.568359 C 552.60156,39.568373 551.99218,39.837904 551.55469,40.376953 C 551.125,40.916028 550.91015,41.669934 550.91016,42.638672 C 550.91015,43.544932 551.13671,44.251963 551.58984,44.759766 C 552.04296,45.267586 552.67968,45.521492 553.5,45.521484 C 554.30468,45.521492 554.93359,45.271493 555.38672,44.771484 C 555.83983,44.271494 556.0664,43.576182 556.06641,42.685547 M 556.125,47.056641 C 555.73437,47.447272 555.27343,47.74024 554.74219,47.935547 C 554.21093,48.130865 553.61327,48.228521 552.94922,48.228516 C 551.30078,48.228521 549.98047,47.732428 548.98828,46.740234 C 547.99609,45.748055 547.5,44.419931 547.5,42.755859 C 547.5,40.990247 548.03906,39.564467 549.11719,38.478516 C 550.19531,37.392594 551.61718,36.849626 553.38281,36.849609 C 555.42968,36.849626 556.98436,37.556657 558.04688,38.970703 C 559.11718,40.376966 559.65233,42.431652 559.65234,45.134766 C 559.65233,48.041021 559.08202,50.267581 557.94141,51.814453 C 556.80077,53.361328 555.16015,54.134765 553.01953,54.134766 C 551.54296,54.134765 550.35156,53.751953 549.44531,52.986328 C 548.53906,52.212892 548.04297,51.162112 547.95703,49.833984 L 551.34375,49.845703 C 551.42187,50.384769 551.63281,50.787112 551.97656,51.052734 C 552.32031,51.318362 552.80468,51.451174 553.42969,51.451172 C 554.27343,51.451174 554.91796,51.083987 555.36328,50.349609 C 555.80858,49.615238 556.06249,48.517583 556.125,47.056641"
+       id="text5175" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 609.375,6.3691406 L 611.87109,6.3691406 C 613.23046,8.228531 614.26171,10.103529 614.96484,11.994141 C 615.66796,13.876963 616.01952,15.716805 616.01953,17.513672 C 616.01952,19.302739 615.66796,21.142581 614.96484,23.033203 C 614.26171,24.923827 613.23046,26.794919 611.87109,28.646484 L 609.375,28.646484 C 610.46094,26.873044 611.26562,25.072264 611.78906,23.244141 C 612.32031,21.408205 612.58593,19.498051 612.58594,17.513672 C 612.58593,15.521492 612.32031,13.611338 611.78906,11.783203 C 611.26562,9.9550918 610.46094,8.1504061 609.375,6.3691406 M 610.98047,45.474609 C 610.98046,47.513678 611.18359,48.994145 611.58984,49.916016 C 612.0039,50.837893 612.66015,51.29883 613.55859,51.298828 C 614.45702,51.29883 615.11327,50.833987 615.52734,49.904297 C 615.9414,48.974614 616.14843,47.498053 616.14844,45.474609 C 616.14843,43.44337 615.9414,41.966809 615.52734,41.044922 C 615.11327,40.12306 614.45702,39.662123 613.55859,39.662109 C 612.66015,39.662123 612.0039,40.12306 611.58984,41.044922 C 611.18359,41.958996 610.98046,43.435557 610.98047,45.474609 M 607.5,45.474609 C 607.5,42.591808 608,40.43556 609,39.005859 C 610.00781,37.568375 611.52734,36.849626 613.55859,36.849609 C 615.58202,36.849626 617.09765,37.572282 618.10547,39.017578 C 619.12108,40.455091 619.62889,42.615245 619.62891,45.498047 C 619.62889,48.380865 619.12499,50.533206 618.11719,51.955078 C 617.11718,53.376953 615.59765,54.08789 613.55859,54.087891 C 611.52734,54.08789 610.00781,53.373047 609,51.943359 C 608,50.513675 607.5,48.357427 607.5,45.474609"
+       id="text5181" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 667.5,26.900391 L 679.5,26.900391 L 679.5,29.291016 L 667.5,29.291016 L 667.5,26.900391 M 670.20703,48.849609 L 670.20703,45.638672 L 676.79297,45.638672 L 676.79297,48.849609 L 670.20703,48.849609"
+       id="text5187" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 733.33594,9.3222656 L 735.70313,9.3222656 L 735.70313,15.298828 L 741.53906,15.298828 L 741.53906,17.630859 L 735.70313,17.630859 L 735.70313,23.630859 L 733.33594,23.630859 L 733.33594,17.630859 L 727.5,17.630859 L 727.5,15.298828 L 733.33594,15.298828 L 733.33594,9.3222656 M 727.5,47.818359 L 741.53906,47.818359 L 741.53906,50.150391 L 727.5,50.150391 L 727.5,47.818359 M 727.5,42.779297 L 741.53906,42.779297 L 741.53906,45.111328 L 727.5,45.111328 L 727.5,42.779297"
+       id="text5201" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 11.070313,95.601563 L 11.070313,86.148438 L 7.65625,86.148438 L 7.65625,84.09375 L 16.828125,84.09375 L 16.828125,86.148438 L 13.4375,86.148438 L 13.4375,95.601563 L 11.070313,95.601563 M 22.859375,94.546875 C 22.572911,94.989584 22.197911,95.328125 21.734375,95.5625 C 21.270829,95.791666 20.731767,95.90625 20.117188,95.90625 C 19.294269,95.90625 18.658853,95.671875 18.210938,95.203125 C 17.768228,94.734376 17.546874,94.06771 17.546875,93.203125 C 17.546874,92.401045 17.768228,91.789066 18.210938,91.367188 C 18.658853,90.945317 19.395831,90.656255 20.421875,90.5 C 20.656246,90.463547 20.963538,90.42188 21.34375,90.375 C 22.307286,90.250005 22.789057,89.97136 22.789063,89.539063 C 22.789057,89.195319 22.682286,88.950527 22.46875,88.804688 C 22.255203,88.653653 21.898433,88.578132 21.398438,88.578125 C 20.9401,88.578132 20.588538,88.669278 20.34375,88.851563 C 20.098955,89.033861 19.97656,89.294277 19.976563,89.632813 L 19.976563,89.757813 L 17.851563,89.757813 L 17.851563,89.601563 C 17.851562,88.731778 18.158853,88.049487 18.773438,87.554688 C 19.388018,87.054696 20.236976,86.804696 21.320313,86.804688 C 22.507807,86.804696 23.41666,87.010425 24.046875,87.421875 C 24.682284,87.833341 24.999992,88.427091 25,89.203125 L 25,94.03125 C 24.999992,94.385418 25.03645,94.651043 25.109375,94.828125 C 25.182283,95.000001 25.304679,95.130209 25.476563,95.21875 L 25.476563,95.601563 L 23.109375,95.601563 C 23.031244,95.455729 22.971348,95.294271 22.929688,95.117188 C 22.888015,94.940105 22.864577,94.750001 22.859375,94.546875 M 22.820313,91.421875 C 22.450515,91.593754 22.023432,91.731775 21.539063,91.835938 C 21.059892,91.940108 20.812496,91.994795 20.796875,92 C 20.39583,92.114587 20.11458,92.257816 19.953125,92.429688 C 19.796872,92.601566 19.718747,92.838544 19.71875,93.140625 C 19.718747,93.453127 19.82031,93.703127 20.023438,93.890625 C 20.226559,94.072918 20.499997,94.164064 20.84375,94.164063 C 21.458329,94.164064 21.940099,93.992189 22.289063,93.648438 C 22.643224,93.299481 22.820307,92.825524 22.820313,92.226563 L 22.820313,91.421875 M 27.039063,84.09375 L 29.25,84.09375 L 29.25,88.164063 C 29.531246,87.721362 29.882809,87.388029 30.304688,87.164063 C 30.731766,86.934905 31.216141,86.820321 31.757813,86.820313 C 32.783847,86.820321 33.622388,87.2448 34.273438,88.09375 C 34.92447,88.937507 35.249991,90.036464 35.25,91.390625 C 35.249991,92.734378 34.92447,93.820314 34.273438,94.648438 C 33.622388,95.476563 32.773431,95.890625 31.726563,95.890625 C 31.179682,95.890625 30.70312,95.776041 30.296875,95.546875 C 29.895829,95.317709 29.531246,94.953126 29.203125,94.453125 L 29.203125,95.601563 L 27.039063,95.601563 L 27.039063,84.09375 M 32.992188,91.296875 C 32.992181,90.51563 32.828118,89.903652 32.5,89.460938 C 32.171869,89.013027 31.721348,88.789069 31.148438,88.789063 C 30.544266,88.789069 30.075517,89.007819 29.742188,89.445313 C 29.414059,89.87761 29.249997,90.494797 29.25,91.296875 C 29.249997,92.161462 29.406247,92.817711 29.71875,93.265625 C 30.036454,93.713544 30.497391,93.937502 31.101563,93.9375 C 31.71614,93.937502 32.18489,93.713544 32.507813,93.265625 C 32.830722,92.812503 32.992181,92.156253 32.992188,91.296875"
+       id="text5427" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 789.76563,44.369141 L 792.57031,44.369141 C 793.23176,44.369143 793.71353,44.249351 794.01563,44.009766 C 794.3177,43.770185 794.46874,43.392581 794.46875,42.876953 C 794.46874,42.340499 794.3203,41.955083 794.02344,41.720703 C 793.72656,41.481125 793.23697,41.361333 792.55469,41.361328 L 789.76563,41.361328 L 789.76563,44.369141 M 789.76563,39.392578 L 792.46875,39.392578 C 793.05208,39.392585 793.47916,39.293627 793.75,39.095703 C 794.02083,38.892586 794.15624,38.574878 794.15625,38.142578 C 794.15624,37.720712 794.02343,37.416025 793.75781,37.228516 C 793.49739,37.035817 793.06249,36.939463 792.45313,36.939453 L 789.76563,36.939453 L 789.76563,39.392578 M 787.5,46.447266 L 787.5,34.939453 L 792.92188,34.939453 C 794.09895,34.939465 794.99478,35.189464 795.60938,35.689453 C 796.22916,36.184255 796.53905,36.905609 796.53906,37.853516 C 796.53905,38.436857 796.42447,38.923836 796.19531,39.314453 C 795.96614,39.705085 795.62239,40.007168 795.16406,40.220703 C 795.7578,40.460292 796.20051,40.806646 796.49219,41.259766 C 796.78905,41.707687 796.93749,42.267582 796.9375,42.939453 C 796.93749,44.059247 796.57291,44.92383 795.84375,45.533203 C 795.11457,46.142578 794.08072,46.447266 792.74219,46.447266 L 787.5,46.447266 M 803.45313,45.392578 C 803.16666,45.835287 802.79166,46.173828 802.32813,46.408203 C 801.86458,46.63737 801.32552,46.751953 800.71094,46.751953 C 799.88802,46.751953 799.2526,46.517578 798.80469,46.048828 C 798.36198,45.580079 798.14062,44.913413 798.14063,44.048828 C 798.14062,43.246748 798.36198,42.634769 798.80469,42.212891 C 799.2526,41.79102 799.98958,41.501958 801.01563,41.345703 C 801.25,41.30925 801.55729,41.267583 801.9375,41.220703 C 802.90104,41.095708 803.38281,40.817063 803.38281,40.384766 C 803.38281,40.041022 803.27604,39.796231 803.0625,39.650391 C 802.84895,39.499356 802.49218,39.423835 801.99219,39.423828 C 801.53385,39.423835 801.18229,39.514981 800.9375,39.697266 C 800.69271,39.879564 800.57031,40.13998 800.57031,40.478516 L 800.57031,40.603516 L 798.44531,40.603516 L 798.44531,40.447266 C 798.44531,39.577481 798.7526,38.89519 799.36719,38.400391 C 799.98177,37.900399 800.83073,37.650399 801.91406,37.650391 C 803.10156,37.650399 804.01041,37.856128 804.64063,38.267578 C 805.27603,38.679044 805.59374,39.272794 805.59375,40.048828 L 805.59375,44.876953 C 805.59374,45.231121 805.6302,45.496746 805.70313,45.673828 C 805.77603,45.845704 805.89843,45.975912 806.07031,46.064453 L 806.07031,46.447266 L 803.70313,46.447266 C 803.62499,46.301432 803.5651,46.139974 803.52344,45.962891 C 803.48176,45.785808 803.45833,45.595704 803.45313,45.392578 M 803.41406,42.267578 C 803.04427,42.439457 802.61718,42.577478 802.13281,42.681641 C 801.65364,42.785811 801.40625,42.840498 801.39063,42.845703 C 800.98958,42.96029 800.70833,43.103519 800.54688,43.275391 C 800.39062,43.447269 800.3125,43.684248 800.3125,43.986328 C 800.3125,44.29883 800.41406,44.54883 800.61719,44.736328 C 800.82031,44.918621 801.09375,45.009767 801.4375,45.009766 C 802.05208,45.009767 802.53385,44.837892 802.88281,44.494141 C 803.23697,44.145185 803.41406,43.671227 803.41406,43.072266 L 803.41406,42.267578 M 812.71875,43.244141 L 814.96094,43.244141 C 814.86718,44.322268 814.47395,45.173829 813.78125,45.798828 C 813.08854,46.423828 812.19791,46.736328 811.10938,46.736328 C 809.875,46.736328 808.90625,46.335287 808.20313,45.533203 C 807.50521,44.725913 807.15625,43.611331 807.15625,42.189453 C 807.15625,40.772792 807.51302,39.663418 808.22656,38.861328 C 808.94531,38.054045 809.93229,37.650399 811.1875,37.650391 C 812.28645,37.650399 813.16666,37.942066 813.82813,38.525391 C 814.49478,39.108731 814.86718,39.92123 814.94531,40.962891 L 812.6875,40.962891 C 812.62499,40.509772 812.46614,40.163418 812.21094,39.923828 C 811.95572,39.684252 811.61979,39.56446 811.20313,39.564453 C 810.64062,39.56446 810.21875,39.785814 809.9375,40.228516 C 809.66146,40.67123 809.52343,41.335292 809.52344,42.220703 C 809.52343,43.038415 809.66666,43.668623 809.95313,44.111328 C 810.24479,44.54883 810.66145,44.76758 811.20313,44.767578 C 811.62499,44.76758 811.96354,44.639976 812.21875,44.384766 C 812.47395,44.12956 812.64062,43.749352 812.71875,43.244141 M 816.44531,46.447266 L 816.44531,34.939453 L 818.65625,34.939453 L 818.65625,40.978516 L 821.35938,37.955078 L 824.09375,37.955078 L 821.13281,41.103516 L 824.27344,46.447266 L 821.54688,46.447266 L 819.51563,42.830078 L 818.65625,43.759766 L 818.65625,46.447266 L 816.44531,46.447266 M 824.79688,43.681641 L 827.0625,43.681641 C 827.08333,44.113935 827.23958,44.436851 827.53125,44.650391 C 827.82291,44.858726 828.26041,44.962892 828.84375,44.962891 C 829.28645,44.962892 829.6276,44.889976 829.86719,44.744141 C 830.11197,44.593101 830.23437,44.382164 830.23438,44.111328 C 830.23437,43.725914 829.78124,43.436852 828.875,43.244141 C 828.5052,43.166019 828.21093,43.098311 827.99219,43.041016 C 826.88802,42.759769 826.11979,42.426436 825.6875,42.041016 C 825.26042,41.655604 825.04687,41.134771 825.04688,40.478516 C 825.04687,39.608731 825.35937,38.921231 825.98438,38.416016 C 826.61458,37.905608 827.46614,37.650399 828.53906,37.650391 C 829.67447,37.650399 830.5651,37.903003 831.21094,38.408203 C 831.86197,38.913419 832.20833,39.624356 832.25,40.541016 L 830.03906,40.541016 C 830.02343,40.181647 829.88541,39.903001 829.625,39.705078 C 829.36979,39.507168 829.01302,39.40821 828.55469,39.408203 C 828.12239,39.40821 827.79948,39.473314 827.58594,39.603516 C 827.3776,39.733731 827.27343,39.929043 827.27344,40.189453 C 827.27343,40.528001 827.83854,40.82748 828.96875,41.087891 C 829.22916,41.145188 829.43489,41.192063 829.58594,41.228516 C 830.71614,41.494146 831.48697,41.814458 831.89844,42.189453 C 832.3151,42.564457 832.52343,43.093102 832.52344,43.775391 C 832.52343,44.738934 832.18228,45.473308 831.5,45.978516 C 830.82291,46.483724 829.83593,46.736328 828.53906,46.736328 C 827.36718,46.736328 826.45052,46.473307 825.78906,45.947266 C 825.1276,45.421225 824.79687,44.697267 824.79688,43.775391 L 824.79688,43.681641 M 840.02344,42.251953 C 840.02343,41.397792 839.86197,40.74675 839.53906,40.298828 C 839.21614,39.84571 838.74739,39.619147 838.13281,39.619141 C 837.52864,39.619147 837.0677,39.843106 836.75,40.291016 C 836.4375,40.738938 836.28125,41.392583 836.28125,42.251953 C 836.28125,43.05404 836.44531,43.673831 836.77344,44.111328 C 837.10677,44.54883 837.57552,44.76758 838.17969,44.767578 C 838.7526,44.76758 839.20312,44.543622 839.53125,44.095703 C 839.85937,43.647789 840.02343,43.033207 840.02344,42.251953 M 834.07031,49.853516 L 834.07031,37.955078 L 836.23438,37.955078 L 836.23438,39.103516 C 836.5625,38.603523 836.92708,38.23894 837.32813,38.009766 C 837.73437,37.780608 838.21093,37.666024 838.75781,37.666016 C 839.80468,37.666024 840.65364,38.080086 841.30469,38.908203 C 841.95572,39.731127 842.28124,40.814459 842.28125,42.158203 C 842.28124,43.517581 841.95572,44.621747 841.30469,45.470703 C 840.65364,46.314453 839.8151,46.736328 838.78906,46.736328 C 838.24739,46.736328 837.76302,46.621745 837.33594,46.392578 C 836.91406,46.163412 836.5625,45.830079 836.28125,45.392578 L 836.28125,49.853516 L 834.07031,49.853516 M 848.70313,45.392578 C 848.41666,45.835287 848.04166,46.173828 847.57813,46.408203 C 847.11458,46.63737 846.57552,46.751953 845.96094,46.751953 C 845.13802,46.751953 844.5026,46.517578 844.05469,46.048828 C 843.61198,45.580079 843.39062,44.913413 843.39063,44.048828 C 843.39062,43.246748 843.61198,42.634769 844.05469,42.212891 C 844.5026,41.79102 845.23958,41.501958 846.26563,41.345703 C 846.5,41.30925 846.80729,41.267583 847.1875,41.220703 C 848.15104,41.095708 848.63281,40.817063 848.63281,40.384766 C 848.63281,40.041022 848.52604,39.796231 848.3125,39.650391 C 848.09895,39.499356 847.74218,39.423835 847.24219,39.423828 C 846.78385,39.423835 846.43229,39.514981 846.1875,39.697266 C 845.94271,39.879564 845.82031,40.13998 845.82031,40.478516 L 845.82031,40.603516 L 843.69531,40.603516 L 843.69531,40.447266 C 843.69531,39.577481 844.0026,38.89519 844.61719,38.400391 C 845.23177,37.900399 846.08073,37.650399 847.16406,37.650391 C 848.35156,37.650399 849.26041,37.856128 849.89063,38.267578 C 850.52603,38.679044 850.84374,39.272794 850.84375,40.048828 L 850.84375,44.876953 C 850.84374,45.231121 850.8802,45.496746 850.95313,45.673828 C 851.02603,45.845704 851.14843,45.975912 851.32031,46.064453 L 851.32031,46.447266 L 848.95313,46.447266 C 848.87499,46.301432 848.8151,46.139974 848.77344,45.962891 C 848.73176,45.785808 848.70833,45.595704 848.70313,45.392578 M 848.66406,42.267578 C 848.29427,42.439457 847.86718,42.577478 847.38281,42.681641 C 846.90364,42.785811 846.65625,42.840498 846.64063,42.845703 C 846.23958,42.96029 845.95833,43.103519 845.79688,43.275391 C 845.64062,43.447269 845.5625,43.684248 845.5625,43.986328 C 845.5625,44.29883 845.66406,44.54883 845.86719,44.736328 C 846.07031,44.918621 846.34375,45.009767 846.6875,45.009766 C 847.30208,45.009767 847.78385,44.837892 848.13281,44.494141 C 848.48697,44.145185 848.66406,43.671227 848.66406,43.072266 L 848.66406,42.267578 M 857.96875,43.244141 L 860.21094,43.244141 C 860.11718,44.322268 859.72395,45.173829 859.03125,45.798828 C 858.33854,46.423828 857.44791,46.736328 856.35938,46.736328 C 855.125,46.736328 854.15625,46.335287 853.45313,45.533203 C 852.75521,44.725913 852.40625,43.611331 852.40625,42.189453 C 852.40625,40.772792 852.76302,39.663418 853.47656,38.861328 C 854.19531,38.054045 855.18229,37.650399 856.4375,37.650391 C 857.53645,37.650399 858.41666,37.942066 859.07813,38.525391 C 859.74478,39.108731 860.11718,39.92123 860.19531,40.962891 L 857.9375,40.962891 C 857.87499,40.509772 857.71614,40.163418 857.46094,39.923828 C 857.20572,39.684252 856.86979,39.56446 856.45313,39.564453 C 855.89062,39.56446 855.46875,39.785814 855.1875,40.228516 C 854.91146,40.67123 854.77343,41.335292 854.77344,42.220703 C 854.77343,43.038415 854.91666,43.668623 855.20313,44.111328 C 855.49479,44.54883 855.91145,44.76758 856.45313,44.767578 C 856.87499,44.76758 857.21354,44.639976 857.46875,44.384766 C 857.72395,44.12956 857.89062,43.749352 857.96875,43.244141 M 866.88281,43.869141 L 869.14844,43.869141 C 868.91926,44.764976 868.45572,45.4681 867.75781,45.978516 C 867.0651,46.483724 866.21874,46.736328 865.21875,46.736328 C 863.98958,46.736328 863.01562,46.32487 862.29688,45.501953 C 861.57812,44.67383 861.21875,43.554039 861.21875,42.142578 C 861.21875,40.751959 861.57292,39.655606 862.28125,38.853516 C 862.98958,38.051441 863.95833,37.650399 865.1875,37.650391 C 866.48958,37.650399 867.49478,38.046232 868.20313,38.837891 C 868.91145,39.624356 869.26562,40.74675 869.26563,42.205078 C 869.26562,42.366541 869.26301,42.488936 869.25781,42.572266 C 869.2578,42.650394 869.2526,42.725915 869.24219,42.798828 L 863.57031,42.798828 C 863.60156,43.465498 863.76302,43.968101 864.05469,44.306641 C 864.35156,44.645184 864.77604,44.814455 865.32813,44.814453 C 865.71874,44.814455 866.03906,44.738934 866.28906,44.587891 C 866.53906,44.431643 866.73697,44.19206 866.88281,43.869141 M 863.57031,41.306641 L 866.91406,41.306641 C 866.89322,40.73373 866.73958,40.298834 866.45313,40.001953 C 866.17187,39.699877 865.76562,39.548835 865.23438,39.548828 C 864.73958,39.548835 864.34895,39.699877 864.0625,40.001953 C 863.78125,40.304043 863.61718,40.738938 863.57031,41.306641"
+       id="text5207" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 840,17.646484 L 797.02608,17.646484"
+       id="path5439" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 802.5,25.146484 L 802.5,10.146484 L 787.5,17.646484 L 802.5,25.146484 z "
+       id="path5441" />
+    <g
+       id="g5459"
+       transform="translate(0,7.5)">
+      <path
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 82.50003,75 L 54.020182,75"
+         id="path5453" />
+      <path
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 60,82.5 L 60,67.5 L 45,75 L 60,82.5 z "
+         id="path5455" />
+      <path
+         id="path5457"
+         d="M 45,67.5 C 45,82.5 45,82.5 45,82.5"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <g
+       id="g5464"
+       transform="matrix(-1,9.581637e-17,-9.581637e-17,-1,127.5,172.5)">
+      <path
+         id="path5466"
+         d="M 82.50003,75 L 54.020182,75"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         id="path5468"
+         d="M 60,82.5 L 60,67.5 L 45,75 L 60,82.5 z "
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 45,67.5 C 45,82.5 45,82.5 45,82.5"
+         id="path5470" />
+    </g>
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 158.94141,83.630859 L 153.99609,66.369141 L 157.67578,66.369141 L 160.62891,78.544922 L 163.125,66.369141 L 166.91016,66.369141 L 169.40625,78.544922 L 172.35938,66.369141 L 176.00391,66.369141 L 171.07031,83.630859 L 167.68359,83.630859 L 165.01172,70.412109 L 162.32813,83.630859 L 158.94141,83.630859"
+       id="text5482" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 343.24219,83.630859 L 343.24219,69.451172 L 338.12109,69.451172 L 338.12109,66.369141 L 351.87891,66.369141 L 351.87891,69.451172 L 346.79297,69.451172 L 346.79297,83.630859 L 343.24219,83.630859"
+       id="text5504" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 407.06836,83.630859 L 403.51758,83.630859 L 403.51758,77.197266 L 397.24805,66.369141 L 401.5957,66.369141 L 405.28711,73.810547 L 408.69727,66.369141 L 412.75195,66.369141 L 407.06836,77.197266 L 407.06836,83.630859"
+       id="text5518" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 458.08594,66.105469 L 461.67188,66.105469 L 461.67188,76.933594 C 461.67187,78.269536 461.93749,79.246098 462.46875,79.863281 C 462.99999,80.472659 463.84374,80.777346 465,80.777344 C 466.17187,80.777346 467.02343,80.472659 467.55469,79.863281 C 468.09374,79.25391 468.36327,78.277349 468.36328,76.933594 L 468.36328,66.105469 L 471.91406,66.105469 L 471.91406,77.320313 C 471.91405,79.437504 471.3203,81.062502 470.13281,82.195313 C 468.95311,83.328125 467.24999,83.894531 465.02344,83.894531 C 462.78124,83.894531 461.0625,83.332031 459.86719,82.207031 C 458.67969,81.074221 458.08594,79.445316 458.08594,77.320313 L 458.08594,66.105469"
+       id="text5522" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 523.22461,83.630859 L 523.22461,66.369141 L 526.77539,66.369141 L 526.77539,83.630859 L 523.22461,83.630859"
+       id="text5526" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 580.18359,75 C 580.18359,76.898444 580.60546,78.375005 581.44922,79.429688 C 582.29296,80.476566 583.47265,81.000003 584.98828,81 C 586.51952,81.000003 587.71093,80.476566 588.5625,79.429688 C 589.41405,78.375005 589.83983,76.898444 589.83984,75 C 589.83983,73.101573 589.41405,71.628918 588.5625,70.582031 C 587.71093,69.527358 586.51952,69.000015 584.98828,69 C 583.47265,69.000015 582.29296,69.523452 581.44922,70.570313 C 580.60546,71.617199 580.18359,73.093761 580.18359,75 M 576.5625,75 C 576.5625,72.210949 577.32031,70.000014 578.83594,68.367188 C 580.35937,66.726579 582.41015,65.906268 584.98828,65.90625 C 587.56639,65.906268 589.61717,66.726579 591.14063,68.367188 C 592.67186,70.007826 593.43748,72.218761 593.4375,75 C 593.43748,77.781256 592.67186,79.992191 591.14063,81.632813 C 589.61717,83.273438 587.56639,84.09375 584.98828,84.09375 C 582.41015,84.09375 580.35937,83.273438 578.83594,81.632813 C 577.32031,79.992191 576.5625,77.781256 576.5625,75"
+       id="text5530" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 641.97656,74.361328 L 645.41016,74.361328 C 646.33983,74.361337 647.01561,74.166025 647.4375,73.775391 C 647.85936,73.376963 648.0703,72.740245 648.07031,71.865234 C 648.0703,71.044934 647.86327,70.423841 647.44922,70.001953 C 647.03515,69.580092 646.41796,69.369155 645.59766,69.369141 L 641.97656,69.369141 L 641.97656,74.361328 M 641.95313,77.490234 L 641.95313,83.630859 L 638.40234,83.630859 L 638.40234,66.369141 L 646.07813,66.369141 C 647.89061,66.369158 649.26171,66.841814 650.19141,67.787109 C 651.12889,68.724624 651.59764,70.103529 651.59766,71.923828 C 651.59764,73.705088 651.14061,75.080087 650.22656,76.048828 C 649.31249,77.009772 648.0078,77.490241 646.3125,77.490234 L 641.95313,77.490234"
+       id="text5534" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 709.24805,63.919922 L 709.24805,66.369141 C 709.17772,66.369155 709.08007,66.365249 708.95508,66.357422 C 708.83007,66.349624 708.74413,66.345718 708.69727,66.345703 C 707.90819,66.345718 707.37304,66.498062 707.0918,66.802734 C 706.81835,67.099624 706.68163,67.732435 706.68164,68.701172 L 706.68164,71.513672 C 706.68163,72.66993 706.50585,73.490242 706.1543,73.974609 C 705.80273,74.458991 705.16992,74.806647 704.25586,75.017578 C 705.16992,75.228522 705.80273,75.572271 706.1543,76.048828 C 706.50585,76.525395 706.68163,77.341801 706.68164,78.498047 L 706.68164,81.322266 C 706.68163,82.283202 706.81835,82.912108 707.0918,83.208984 C 707.36523,83.505857 707.90038,83.654294 708.69727,83.654297 C 708.74413,83.654294 708.83007,83.650388 708.95508,83.642578 C 709.08007,83.634763 709.17772,83.630857 709.24805,83.630859 L 709.24805,86.080078 C 709.13866,86.080073 708.98632,86.08398 708.79102,86.091797 C 708.59569,86.099605 708.45116,86.103511 708.35742,86.103516 C 707.57616,86.103511 706.92382,86.056636 706.40039,85.962891 C 705.87695,85.869136 705.43163,85.724605 705.06445,85.529297 C 704.61913,85.263668 704.30273,84.904293 704.11523,84.451172 C 703.93554,84.005857 703.8457,83.228514 703.8457,82.119141 L 703.8457,79.166016 C 703.8457,78.095706 703.64648,77.337895 703.24805,76.892578 C 702.84961,76.439458 702.17773,76.212896 701.23242,76.212891 C 701.18554,76.212896 701.10742,76.216802 700.99805,76.224609 C 700.88867,76.232427 700.80664,76.236333 700.75195,76.236328 L 700.75195,73.787109 C 700.80664,73.787117 700.88867,73.791023 700.99805,73.798828 C 701.10742,73.806648 701.18554,73.810554 701.23242,73.810547 C 702.16992,73.810554 702.83789,73.583992 703.23633,73.130859 C 703.64257,72.677743 703.8457,71.912119 703.8457,70.833984 L 703.8457,67.904297 C 703.8457,66.787124 703.93554,66.001968 704.11523,65.548828 C 704.30273,65.095719 704.61913,64.736345 705.06445,64.470703 C 705.43163,64.275408 705.87695,64.130876 706.40039,64.037109 C 706.92382,63.943377 707.57616,63.896502 708.35742,63.896484 C 708.45116,63.896502 708.59569,63.900408 708.79102,63.908203 C 708.98632,63.916033 709.13866,63.919939 709.24805,63.919922 M 703.0957,93.966797 L 709.01367,93.966797 L 709.01367,96.462891 L 706.25977,96.462891 L 706.25977,113.8418 L 709.01367,113.8418 L 709.01367,116.33789 L 703.0957,116.33789 L 703.0957,93.966797"
+       id="text5546" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 760.75195,63.908203 L 761.54883,63.908203 C 762.4082,63.90822 763.09961,63.955095 763.62305,64.048828 C 764.14648,64.142595 764.58398,64.291033 764.93555,64.494141 C 765.38085,64.744157 765.69335,65.103532 765.87305,65.572266 C 766.06054,66.033218 766.15429,66.806655 766.1543,67.892578 L 766.1543,70.845703 C 766.15429,71.916025 766.35351,72.677743 766.75195,73.130859 C 767.15038,73.57618 767.82226,73.798836 768.76758,73.798828 C 768.81444,73.798836 768.89257,73.794929 769.00195,73.787109 C 769.11132,73.779304 769.19335,73.775398 769.24805,73.775391 L 769.24805,76.224609 L 768.81445,76.224609 C 767.83788,76.224614 767.15038,76.443364 766.75195,76.880859 C 766.35351,77.318363 766.15429,78.076175 766.1543,79.154297 L 766.1543,82.107422 C 766.15429,83.224607 766.06054,84.009763 765.87305,84.462891 C 765.69335,84.916012 765.38085,85.267574 764.93555,85.517578 C 764.56835,85.712886 764.12304,85.857417 763.59961,85.951172 C 763.07617,86.044917 762.42382,86.091792 761.64258,86.091797 C 761.54883,86.091792 761.40429,86.087886 761.20898,86.080078 C 761.01367,86.072261 760.86133,86.068355 760.75195,86.068359 L 760.75195,83.619141 C 760.82226,83.619138 760.91992,83.623044 761.04492,83.630859 C 761.16992,83.638669 761.25586,83.642576 761.30273,83.642578 C 762.09179,83.642576 762.62304,83.490232 762.89648,83.185547 C 763.17773,82.88867 763.31836,82.263671 763.31836,81.310547 L 763.31836,78.509766 C 763.31836,77.337895 763.49414,76.513677 763.8457,76.037109 C 764.19726,75.55274 764.83007,75.20899 765.74414,75.005859 C 764.83007,74.794928 764.19726,74.447272 763.8457,73.962891 C 763.49414,73.478523 763.31836,72.658212 763.31836,71.501953 L 763.31836,68.666016 C 763.31836,67.712904 763.17773,67.087905 762.89648,66.791016 C 762.62304,66.486343 762.09179,66.333999 761.30273,66.333984 C 761.25586,66.333999 761.16992,66.337906 761.04492,66.345703 C 760.91992,66.35353 760.82226,66.357437 760.75195,66.357422 L 760.75195,63.908203 M 767.00977,93.955078 L 767.00977,116.32617 L 761.08008,116.32617 L 761.08008,113.83008 L 763.8457,113.83008 L 763.8457,96.451172 L 761.08008,96.451172 L 761.08008,93.955078 L 767.00977,93.955078"
+       id="text5554" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 823.79883,62.876953 L 826.21289,62.876953 L 826.21289,86.876953 L 823.79883,86.876953 L 823.79883,62.876953 M 827.10352,113.44336 L 821.29102,93.509766 L 822.87305,93.509766 L 828.70898,113.44336 L 827.10352,113.44336"
+       id="text5564" />
+    <g
+       id="g5770"
+       transform="translate(0,3.75)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text5570"
+         y="139.30469"
+         x="52.152344"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+         xml:space="preserve"><tspan
+           y="139.30469"
+           x="52.152344"
+           id="tspan5572"
+           sodipodi:role="line">Caps Lock</tspan></text>
+      <path
+         id="path5584"
+         d="M 26.25,142.5 L 15,157.5 L 22.5,157.5 L 22.5,165 L 30,165 L 30,157.5 L 37.5,157.5 L 26.25,142.5 z M 25.21875,146.71875 L 27.25,146.71875 L 30.375,155.34375 L 28.5,155.34375 L 27.90625,153.5625 L 24.5625,153.5625 L 24,155.34375 L 22.125,155.34375 L 25.21875,146.71875 z M 26.25,148.4375 L 25.03125,152.09375 L 27.4375,152.09375 L 26.25,148.4375 z "
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 119.9707,129.82617 L 117.58008,137.17383 L 122.37305,137.17383 L 119.9707,129.82617 M 117.9082,126.36914 L 122.00977,126.36914 L 128.23242,143.63086 L 124.50586,143.63086 L 123.33398,140.08008 L 116.64258,140.08008 L 115.50586,143.63086 L 111.76758,143.63086 L 117.9082,126.36914"
+       id="text5641" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 172.98047,138.29297 L 176.48438,138.29297 C 176.61718,139.23829 177.0039,139.94141 177.64453,140.40234 C 178.28515,140.85547 179.21093,141.08203 180.42188,141.08203 C 181.45312,141.08203 182.23046,140.89844 182.75391,140.53125 C 183.27733,140.16407 183.53905,139.6211 183.53906,138.90234 C 183.53905,137.85547 182.03515,136.98829 179.02734,136.30078 C 178.98827,136.29298 178.95312,136.28516 178.92188,136.27734 C 178.84374,136.26173 178.72265,136.23438 178.55859,136.19531 C 176.94921,135.84376 175.80078,135.44923 175.11328,135.01172 C 174.5039,134.6211 174.03906,134.09767 173.71875,133.44141 C 173.39844,132.77735 173.23828,131.99611 173.23828,131.09766 C 173.23828,129.41798 173.80859,128.13283 174.94922,127.24219 C 176.08984,126.34377 177.73828,125.89455 179.89453,125.89453 C 181.91015,125.89455 183.48436,126.37111 184.61719,127.32422 C 185.7578,128.27736 186.35936,129.62111 186.42188,131.35547 L 183.01172,131.35547 C 182.94921,130.51954 182.6289,129.88283 182.05078,129.44531 C 181.47265,129.00783 180.64843,128.78908 179.57813,128.78906 C 178.64843,128.78908 177.92968,128.97267 177.42188,129.33984 C 176.92187,129.69923 176.67187,130.21486 176.67188,130.88672 C 176.67187,131.80079 177.65234,132.48439 179.61328,132.9375 C 180.14452,133.06251 180.55859,133.16017 180.85547,133.23047 C 182.11327,133.55079 183.0039,133.80079 183.52734,133.98047 C 184.05858,134.16017 184.51952,134.35938 184.91016,134.57813 C 185.61327,134.96876 186.14061,135.48829 186.49219,136.13672 C 186.84374,136.77735 187.01952,137.54688 187.01953,138.44531 C 187.01952,140.24219 186.41405,141.63672 185.20313,142.62891 C 183.99218,143.61328 182.28515,144.10547 180.08203,144.10547 C 177.91015,144.10547 176.20703,143.60156 174.97266,142.59375 C 173.73828,141.58594 173.07422,140.15235 172.98047,138.29297"
+       id="text5645" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 236.16211,140.51367 L 239.00977,140.51367 C 240.65819,140.51367 241.8496,140.08399 242.58398,139.22461 C 243.32616,138.35743 243.69725,136.95508 243.69727,135.01758 C 243.69725,133.0879 243.3535,131.66993 242.66602,130.76367 C 241.9785,129.85744 240.90429,129.40431 239.44336,129.4043 L 236.16211,129.4043 L 236.16211,140.51367 M 232.68164,143.63086 L 232.68164,126.36914 L 239.44336,126.36914 C 242.09179,126.36916 244.06444,127.084 245.36133,128.51367 C 246.666,129.94337 247.31834,132.11134 247.31836,135.01758 C 247.31834,136.59571 247.07616,137.98633 246.5918,139.18945 C 246.11522,140.39258 245.41991,141.36133 244.50586,142.0957 C 243.81835,142.64258 243.0371,143.03711 242.16211,143.2793 C 241.2871,143.51367 240.06054,143.63086 238.48242,143.63086 L 232.68164,143.63086"
+       id="text5649" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 293.97656,143.63086 L 293.97656,126.36914 L 306.02344,126.36914 L 306.02344,129.36914 L 297.48047,129.36914 L 297.48047,133.2832 L 304.96875,133.2832 L 304.96875,136.2832 L 297.48047,136.2832 L 297.48047,143.63086 L 293.97656,143.63086"
+       id="text5653" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 365.17969,141.57422 C 364.53905,142.44141 363.80858,143.07813 362.98828,143.48438 C 362.17577,143.89062 361.21874,144.09375 360.11719,144.09375 C 357.70312,144.09375 355.74609,143.25781 354.24609,141.58594 C 352.7539,139.90625 352.00781,137.70313 352.00781,134.97656 C 352.00781,132.22657 352.7539,130.02736 354.24609,128.37891 C 355.73828,126.73049 357.72656,125.90627 360.21094,125.90625 C 362.37499,125.90627 364.14061,126.4258 365.50781,127.46484 C 366.87498,128.49611 367.68748,129.91798 367.94531,131.73047 L 364.32422,131.73047 C 364.10546,130.83204 363.65624,130.14845 362.97656,129.67969 C 362.30468,129.21095 361.42577,128.97658 360.33984,128.97656 C 358.89452,128.97658 357.75781,129.50783 356.92969,130.57031 C 356.10937,131.62501 355.69921,133.08595 355.69922,134.95313 C 355.69921,136.82813 356.1289,138.29688 356.98828,139.35938 C 357.84765,140.42188 359.02734,140.95313 360.52734,140.95313 C 361.65233,140.95313 362.59374,140.6211 363.35156,139.95703 C 364.10936,139.29297 364.57811,138.38282 364.75781,137.22656 L 360.84375,137.22656 L 360.84375,134.27344 L 367.99219,134.27344 L 367.99219,143.61328 L 365.61328,143.61328 L 365.17969,141.57422"
+       id="text5657" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 412.86328,143.63086 L 412.86328,126.36914 L 416.4375,126.36914 L 416.4375,132.80273 L 423.5625,132.80273 L 423.5625,126.36914 L 427.13672,126.36914 L 427.13672,143.63086 L 423.5625,143.63086 L 423.5625,135.97852 L 416.4375,135.97852 L 416.4375,143.63086 L 412.86328,143.63086"
+       id="text5661" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 143.15039,203.63086 L 143.15039,200.63086 L 152.53711,189.49805 L 143.33789,189.49805 L 143.33789,186.36914 L 156.84961,186.36914 L 156.84961,189.36914 L 147.43945,200.51367 L 156.63867,200.51367 L 156.63867,203.63086 L 143.15039,203.63086"
+       id="text5679" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 202.37109,203.63086 L 207.79688,194.81836 L 202.37109,186.36914 L 206.47266,186.36914 L 210,192.4043 L 213.50391,186.36914 L 217.62891,186.36914 L 212.20313,194.79492 L 217.62891,203.63086 L 213.52734,203.63086 L 210,197.6543 L 206.47266,203.63086 L 202.37109,203.63086"
+       id="text5683" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 277.875,197.68359 C 277.74217,199.64454 276.98436,201.20313 275.60156,202.35938 C 274.22655,203.51563 272.42968,204.09375 270.21094,204.09375 C 267.65624,204.09375 265.66796,203.29688 264.24609,201.70313 C 262.83203,200.10938 262.125,197.87501 262.125,195 C 262.125,192.06251 262.84765,189.81251 264.29297,188.25 C 265.73828,186.68752 267.8164,185.90627 270.52734,185.90625 C 272.73046,185.90627 274.46874,186.44533 275.74219,187.52344 C 277.02342,188.59377 277.72655,190.10939 277.85156,192.07031 L 274.34766,192.07031 C 274.19921,191.09376 273.80077,190.35158 273.15234,189.84375 C 272.50389,189.32814 271.6289,189.07033 270.52734,189.07031 C 268.96484,189.07033 267.77734,189.57423 266.96484,190.58203 C 266.15234,191.58986 265.74609,193.06251 265.74609,195 C 265.74609,196.87501 266.14843,198.32422 266.95313,199.34766 C 267.76562,200.3711 268.91796,200.88282 270.41016,200.88281 C 271.48827,200.88282 272.37108,200.60938 273.05859,200.0625 C 273.74608,199.50782 274.19139,198.71485 274.39453,197.68359 L 277.875,197.68359"
+       id="text5687" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 328.33594,203.63086 L 322.38281,186.36914 L 326.32031,186.36914 L 329.98828,199.2832 L 333.72656,186.36914 L 337.61719,186.36914 L 331.73438,203.63086 L 328.33594,203.63086"
+       id="text5691" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 386.32031,200.51367 L 390.52734,200.51367 C 391.51952,200.51367 392.24218,200.33399 392.69531,199.97461 C 393.14843,199.61524 393.37499,199.04883 393.375,198.27539 C 393.37499,197.47071 393.15233,196.89258 392.70703,196.54102 C 392.26171,196.18165 391.52733,196.00196 390.50391,196.00195 L 386.32031,196.00195 L 386.32031,200.51367 M 386.32031,193.04883 L 390.375,193.04883 C 391.24999,193.04884 391.89061,192.9004 392.29688,192.60352 C 392.70311,192.29884 392.90624,191.82228 392.90625,191.17383 C 392.90624,190.54103 392.70702,190.084 392.30859,189.80273 C 391.91796,189.51369 391.26561,189.36915 390.35156,189.36914 L 386.32031,189.36914 L 386.32031,193.04883 M 382.92188,203.63086 L 382.92188,186.36914 L 391.05469,186.36914 C 392.8203,186.36916 394.16405,186.74416 395.08594,187.49414 C 396.01561,188.23634 396.48045,189.31837 396.48047,190.74023 C 396.48045,191.61525 396.30858,192.34571 395.96484,192.93164 C 395.62108,193.51759 395.10545,193.97071 394.41797,194.29102 C 395.30858,194.6504 395.97264,195.16993 396.41016,195.84961 C 396.85545,196.52149 397.07811,197.36133 397.07813,198.36914 C 397.07811,200.04883 396.53123,201.34571 395.4375,202.25977 C 394.34374,203.17383 392.79296,203.63086 390.78516,203.63086 L 382.92188,203.63086"
+       id="text5695" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 442.88672,203.63086 L 442.88672,186.36914 L 446.60156,186.36914 L 453.60938,198.22852 L 453.60938,186.36914 L 457.11328,186.36914 L 457.11328,203.63086 L 453.44531,203.63086 L 446.39063,191.77148 L 446.39063,203.63086 L 442.88672,203.63086"
+       id="text5699" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 501.32813,203.63086 L 501.32813,186.36914 L 506.57813,186.36914 L 510.01172,199.50586 L 513.39844,186.36914 L 518.67188,186.36914 L 518.67188,203.63086 L 515.34375,203.63086 L 515.34375,189.70898 L 511.83984,203.63086 L 508.20703,203.63086 L 504.65625,189.70898 L 504.65625,203.63086 L 501.32813,203.63086"
+       id="text5703" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 720.78516,126.7793 L 723.03516,126.7793 L 723.03516,133.33008 L 720.78516,133.33008 L 720.78516,126.7793 M 716.96484,126.7793 L 719.21484,126.7793 L 719.21484,133.33008 L 716.96484,133.33008 L 716.96484,126.7793 M 718.88672,156.7793 L 721.13672,156.7793 L 721.13672,163.33008 L 718.88672,163.33008 L 718.88672,156.7793"
+       id="text5731" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 772.5,140.60938 L 772.5,129.10156 L 780.85156,129.10156 L 780.85156,131.10156 L 774.83594,131.10156 L 774.83594,133.55469 L 780.33594,133.55469 L 780.33594,135.52344 L 774.83594,135.52344 L 774.83594,138.48438 L 781.13281,138.48438 L 781.13281,140.60938 L 772.5,140.60938 M 782.74219,140.60938 L 782.74219,132.11719 L 784.96875,132.11719 L 784.96875,133.125 C 785.28645,132.71355 785.66145,132.40626 786.09375,132.20313 C 786.52604,131.9948 787.00781,131.89063 787.53906,131.89063 C 788.47656,131.89063 789.17708,132.13543 789.64063,132.625 C 790.10937,133.10938 790.34374,133.84115 790.34375,134.82031 L 790.34375,140.60938 L 788.07031,140.60938 L 788.07031,135.47656 C 788.07031,134.86719 787.96614,134.4323 787.75781,134.17188 C 787.55468,133.91147 787.22135,133.78126 786.75781,133.78125 C 786.22135,133.78126 785.79687,133.94271 785.48438,134.26563 C 785.17187,134.58334 785.01562,135.01823 785.01563,135.57031 L 785.01563,140.60938 L 782.74219,140.60938 M 796.07813,140.67188 C 795.86979,140.67708 795.61979,140.6849 795.32813,140.69531 C 795.04166,140.71094 794.85937,140.71875 794.78125,140.71875 C 793.91146,140.71875 793.3151,140.55729 792.99219,140.23438 C 792.67448,139.90625 792.51562,139.26302 792.51563,138.30469 L 792.51563,133.71094 L 791.39063,133.71094 L 791.39063,132.11719 L 792.51563,132.11719 L 792.51563,129.79688 L 794.76563,129.79688 L 794.76563,132.11719 L 796.07813,132.11719 L 796.07813,133.71094 L 794.76563,133.71094 L 794.76563,138.41406 C 794.76562,138.63802 794.8151,138.78646 794.91406,138.85938 C 795.01302,138.92709 795.21614,138.96094 795.52344,138.96094 L 796.07813,138.96094 L 796.07813,140.67188 M 802.63281,138.03125 L 804.89844,138.03125 C 804.66926,138.92709 804.20572,139.63021 803.50781,140.14063 C 802.8151,140.64583 801.96874,140.89844 800.96875,140.89844 C 799.73958,140.89844 798.76562,140.48698 798.04688,139.66406 C 797.32812,138.83594 796.96875,137.71615 796.96875,136.30469 C 796.96875,134.91407 797.32292,133.81772 798.03125,133.01563 C 798.73958,132.21355 799.70833,131.81251 800.9375,131.8125 C 802.23958,131.81251 803.24478,132.20834 803.95313,133 C 804.66145,133.78647 805.01562,134.90886 805.01563,136.36719 C 805.01562,136.52865 805.01301,136.65105 805.00781,136.73438 C 805.0078,136.8125 805.0026,136.88802 804.99219,136.96094 L 799.32031,136.96094 C 799.35156,137.62761 799.51302,138.13021 799.80469,138.46875 C 800.10156,138.80729 800.52604,138.97656 801.07813,138.97656 C 801.46874,138.97656 801.78906,138.90104 802.03906,138.75 C 802.28906,138.59375 802.48697,138.35417 802.63281,138.03125 M 799.32031,135.46875 L 802.66406,135.46875 C 802.64322,134.89584 802.48958,134.46094 802.20313,134.16406 C 801.92187,133.86199 801.51562,133.71094 800.98438,133.71094 C 800.48958,133.71094 800.09895,133.86199 799.8125,134.16406 C 799.53125,134.46615 799.36718,134.90105 799.32031,135.46875 M 806.52344,140.60938 L 806.52344,132.11719 L 808.63281,132.11719 L 808.63281,133.57031 C 808.92968,132.98699 809.27604,132.5599 809.67188,132.28906 C 810.0677,132.01303 810.53906,131.87501 811.08594,131.875 C 811.17447,131.87501 811.24218,131.87761 811.28906,131.88281 C 811.34114,131.88282 811.38281,131.88543 811.41406,131.89063 L 811.42188,134.19531 L 810.66406,134.19531 C 810.04427,134.19532 809.57812,134.35678 809.26563,134.67969 C 808.95312,135.00261 808.79687,135.48178 808.79688,136.11719 L 808.79688,140.60938 L 806.52344,140.60938"
+       id="text5737" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 787.5,172.5 L 787.5,157.5 L 772.5,165 L 787.5,172.5 z "
+       id="path5745" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 810,150 L 810,165 L 780,165"
+       id="path5747" />
+    <g
+       id="g5790">
+      <text
+         xml:space="preserve"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+         x="31.8125"
+         y="201.19531"
+         id="text5753"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan5755"
+           x="31.8125"
+           y="201.19531">Shift</tspan></text>
+      <path
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 27.25,207.125 L 16,222.125 L 23.5,222.125 L 23.5,229.625 L 31,229.625 L 31,222.125 L 38.5,222.125 L 27.25,207.125 z "
+         id="path5757" />
+    </g>
+    <g
+       id="g5795"
+       transform="translate(727.5,0)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text5797"
+         y="201.19531"
+         x="31.8125"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+         xml:space="preserve"><tspan
+           y="201.19531"
+           x="31.8125"
+           id="tspan5799"
+           sodipodi:role="line">Shift</tspan></text>
+      <path
+         id="path5801"
+         d="M 27.25,207.125 L 16,222.125 L 23.5,222.125 L 23.5,229.625 L 31,229.625 L 31,222.125 L 38.5,222.125 L 27.25,207.125 z "
+         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 576.90234,189.63867 L 576.90234,192.20508 L 566.4375,196.48242 L 576.90234,200.74805 L 576.90234,203.31445 L 563.09766,197.63086 L 563.09766,195.29883 L 576.90234,189.63867 M 568.21875,237.68555 L 568.21875,236.31445 C 568.875,236.12695 569.35937,235.83789 569.67188,235.44727 C 569.98437,235.05664 570.14062,234.54883 570.14063,233.92383 L 570.14063,233.63086 L 568.21875,233.63086 L 568.21875,230.10352 L 571.76953,230.10352 L 571.76953,233.49023 C 571.76953,234.6543 571.46875,235.59179 570.86719,236.30273 C 570.27343,237.01367 569.39062,237.47461 568.21875,237.68555"
+       id="text5803" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 623.09766,189.63867 L 636.90234,195.29883 L 636.90234,197.63086 L 623.09766,203.31445 L 623.09766,200.74805 L 633.58594,196.48242 L 623.09766,192.20508 L 623.09766,189.63867 M 628.21875,233.63086 L 628.21875,230.10352 L 631.74609,230.10352 L 631.74609,233.63086 L 628.21875,233.63086"
+       id="text5813" />
+    <path
+       style="font-size:24px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 688.44727,198.61523 C 688.44726,198.5293 688.44335,198.41602 688.43555,198.27539 C 688.42773,198.12696 688.42382,198.01758 688.42383,197.94727 C 688.42382,197.25977 688.49804,196.68946 688.64648,196.23633 C 688.79492,195.7754 689.0332,195.34571 689.36133,194.94727 C 689.61132,194.6504 689.98242,194.31056 690.47461,193.92773 C 690.9746,193.54493 691.29882,193.26759 691.44727,193.0957 C 691.75976,192.74415 691.9746,192.42775 692.0918,192.14648 C 692.20898,191.86525 692.26757,191.55665 692.26758,191.2207 C 692.26757,190.47853 692.06054,189.9004 691.64648,189.48633 C 691.23241,189.07228 690.65429,188.86525 689.91211,188.86523 C 689.16992,188.86525 688.58398,189.11525 688.1543,189.61523 C 687.73242,190.10744 687.50195,190.80275 687.46289,191.70117 L 684.1582,191.70117 L 684.1582,191.33789 C 684.1582,189.68947 684.67773,188.37697 685.7168,187.40039 C 686.76367,186.41603 688.16992,185.92385 689.93555,185.92383 C 691.74023,185.92385 693.17382,186.38869 694.23633,187.31836 C 695.30663,188.24025 695.84178,189.47853 695.8418,191.0332 C 695.84178,191.58009 695.77928,192.07228 695.6543,192.50977 C 695.5371,192.93946 695.3535,193.33399 695.10352,193.69336 C 694.78319,194.14649 694.2871,194.63868 693.61523,195.16992 C 692.95116,195.69337 692.54882,196.01759 692.4082,196.14258 C 692.11132,196.43165 691.89648,196.73634 691.76367,197.05664 C 691.63866,197.37696 691.57616,197.75977 691.57617,198.20508 C 691.57616,198.24415 691.58007,198.31055 691.58789,198.4043 C 691.59569,198.49805 691.5996,198.56836 691.59961,198.61523 L 688.44727,198.61523 M 688.2832,203.63086 L 688.2832,200.19727 L 691.74023,200.19727 L 691.74023,203.63086 L 688.2832,203.63086 M 686.31445,235.85742 L 692.12695,215.92383 L 693.73242,215.92383 L 687.89648,235.85742 L 686.31445,235.85742"
+       id="text5819" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 18,271.78906 C 17.911447,273.09636 17.406239,274.13542 16.484375,274.90625 C 15.5677,275.67708 14.369784,276.0625 12.890625,276.0625 C 11.187496,276.0625 9.8619761,275.53125 8.9140625,274.46875 C 7.971353,273.40625 7.4999993,271.91667 7.5,270 C 7.4999993,268.04167 7.9817696,266.54168 8.9453125,265.5 C 9.9088511,264.45834 11.294266,263.93751 13.101563,263.9375 C 14.570305,263.93751 15.729158,264.29689 16.578125,265.01563 C 17.432281,265.72918 17.901031,266.73959 17.984375,268.04688 L 15.648438,268.04688 C 15.54947,267.39584 15.283846,266.90105 14.851563,266.5625 C 14.419263,266.21876 13.83593,266.04688 13.101563,266.04688 C 12.059891,266.04688 11.268225,266.38282 10.726563,267.05469 C 10.184892,267.72657 9.9140594,268.70834 9.9140625,270 C 9.9140594,271.25 10.182288,272.21615 10.71875,272.89844 C 11.260412,273.58073 12.028641,273.92188 13.023438,273.92188 C 13.742181,273.92188 14.330722,273.73959 14.789063,273.375 C 15.247387,273.00521 15.544262,272.47657 15.679688,271.78906 L 18,271.78906 M 23.46875,275.80469 C 23.260412,275.8099 23.010412,275.81771 22.71875,275.82813 C 22.432288,275.84375 22.249996,275.85156 22.171875,275.85156 C 21.302081,275.85156 20.705727,275.6901 20.382813,275.36719 C 20.065103,275.03906 19.906249,274.39583 19.90625,273.4375 L 19.90625,268.84375 L 18.78125,268.84375 L 18.78125,267.25 L 19.90625,267.25 L 19.90625,264.92969 L 22.15625,264.92969 L 22.15625,267.25 L 23.46875,267.25 L 23.46875,268.84375 L 22.15625,268.84375 L 22.15625,273.54688 C 22.156247,273.77084 22.205726,273.91927 22.304688,273.99219 C 22.403642,274.0599 22.606767,274.09375 22.914063,274.09375 L 23.46875,274.09375 L 23.46875,275.80469 M 24.789063,275.74219 L 24.789063,267.25 L 26.898438,267.25 L 26.898438,268.70313 C 27.195309,268.1198 27.541663,267.69272 27.9375,267.42188 C 28.333329,267.14584 28.804682,267.00782 29.351563,267.00781 C 29.440099,267.00782 29.507807,267.01043 29.554688,267.01563 C 29.606765,267.01563 29.648432,267.01824 29.679688,267.02344 L 29.6875,269.32813 L 28.929688,269.32813 C 28.309891,269.32813 27.843746,269.48959 27.53125,269.8125 C 27.218747,270.13542 27.062497,270.61459 27.0625,271.25 L 27.0625,275.74219 L 24.789063,275.74219 M 31.023438,275.74219 L 31.023438,264.23438 L 33.296875,264.23438 L 33.296875,275.74219 L 31.023438,275.74219"
+       id="text5827" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 612.96875,266.53906 L 611.375,271.4375 L 614.57031,271.4375 L 612.96875,266.53906 M 611.59375,264.23438 L 614.32813,264.23438 L 618.47656,275.74219 L 615.99219,275.74219 L 615.21094,273.375 L 610.75,273.375 L 609.99219,275.74219 L 607.5,275.74219 L 611.59375,264.23438 M 619.53906,275.74219 L 619.53906,264.23438 L 621.8125,264.23438 L 621.8125,275.74219 L 619.53906,275.74219 M 627.64063,275.80469 C 627.43229,275.8099 627.18229,275.81771 626.89063,275.82813 C 626.60416,275.84375 626.42187,275.85156 626.34375,275.85156 C 625.47396,275.85156 624.8776,275.6901 624.55469,275.36719 C 624.23698,275.03906 624.07812,274.39583 624.07813,273.4375 L 624.07813,268.84375 L 622.95313,268.84375 L 622.95313,267.25 L 624.07813,267.25 L 624.07813,264.92969 L 626.32813,264.92969 L 626.32813,267.25 L 627.64063,267.25 L 627.64063,268.84375 L 626.32813,268.84375 L 626.32813,273.54688 C 626.32812,273.77084 626.3776,273.91927 626.47656,273.99219 C 626.57552,274.0599 626.77864,274.09375 627.08594,274.09375 L 627.64063,274.09375 L 627.64063,275.80469"
+       id="text5835"
+       sodipodi:nodetypes="cccccccccccccccccccsssccccccccccccsccc" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 828,271.78906 C 827.91145,273.09636 827.40624,274.13542 826.48438,274.90625 C 825.5677,275.67708 824.36978,276.0625 822.89063,276.0625 C 821.1875,276.0625 819.86198,275.53125 818.91406,274.46875 C 817.97135,273.40625 817.5,271.91667 817.5,270 C 817.5,268.04167 817.98177,266.54168 818.94531,265.5 C 819.90885,264.45834 821.29427,263.93751 823.10156,263.9375 C 824.5703,263.93751 825.72916,264.29689 826.57813,265.01563 C 827.43228,265.72918 827.90103,266.73959 827.98438,268.04688 L 825.64844,268.04688 C 825.54947,267.39584 825.28385,266.90105 824.85156,266.5625 C 824.41926,266.21876 823.83593,266.04688 823.10156,266.04688 C 822.05989,266.04688 821.26822,266.38282 820.72656,267.05469 C 820.18489,267.72657 819.91406,268.70834 819.91406,270 C 819.91406,271.25 820.18229,272.21615 820.71875,272.89844 C 821.26041,273.58073 822.02864,273.92188 823.02344,273.92188 C 823.74218,273.92188 824.33072,273.73959 824.78906,273.375 C 825.24739,273.00521 825.54426,272.47657 825.67969,271.78906 L 828,271.78906 M 833.46875,275.80469 C 833.26041,275.8099 833.01041,275.81771 832.71875,275.82813 C 832.43229,275.84375 832.25,275.85156 832.17188,275.85156 C 831.30208,275.85156 830.70573,275.6901 830.38281,275.36719 C 830.0651,275.03906 829.90625,274.39583 829.90625,273.4375 L 829.90625,268.84375 L 828.78125,268.84375 L 828.78125,267.25 L 829.90625,267.25 L 829.90625,264.92969 L 832.15625,264.92969 L 832.15625,267.25 L 833.46875,267.25 L 833.46875,268.84375 L 832.15625,268.84375 L 832.15625,273.54688 C 832.15625,273.77084 832.20573,273.91927 832.30469,273.99219 C 832.40364,274.0599 832.60677,274.09375 832.91406,274.09375 L 833.46875,274.09375 L 833.46875,275.80469 M 834.78906,275.74219 L 834.78906,267.25 L 836.89844,267.25 L 836.89844,268.70313 C 837.19531,268.1198 837.54166,267.69272 837.9375,267.42188 C 838.33333,267.14584 838.80468,267.00782 839.35156,267.00781 C 839.4401,267.00782 839.50781,267.01043 839.55469,267.01563 C 839.60677,267.01563 839.64843,267.01824 839.67969,267.02344 L 839.6875,269.32813 L 838.92969,269.32813 C 838.30989,269.32813 837.84375,269.48959 837.53125,269.8125 C 837.21875,270.13542 837.0625,270.61459 837.0625,271.25 L 837.0625,275.74219 L 834.78906,275.74219 M 841.02344,275.74219 L 841.02344,264.23438 L 843.29688,264.23438 L 843.29688,275.74219 L 841.02344,275.74219"
+       id="text5839" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 108.94531,264.01953 L 105.64844,252.51172 L 108.10156,252.51172 L 110.07031,260.62891 L 111.73438,252.51172 L 114.25781,252.51172 L 115.92188,260.62891 L 117.89063,252.51172 L 120.32031,252.51172 L 117.03125,264.01953 L 114.77344,264.01953 L 112.99219,255.20703 L 111.20313,264.01953 L 108.94531,264.01953 M 121.5,254.58203 L 121.5,252.51172 L 123.77344,252.51172 L 123.77344,254.58203 L 121.5,254.58203 M 121.5,264.01953 L 121.5,255.52734 L 123.77344,255.52734 L 123.77344,264.01953 L 121.5,264.01953 M 125.79688,264.01953 L 125.79688,255.52734 L 128.02344,255.52734 L 128.02344,256.53516 C 128.34114,256.12371 128.71614,255.81641 129.14844,255.61328 C 129.58072,255.40496 130.06249,255.30079 130.59375,255.30078 C 131.53124,255.30079 132.23176,255.54558 132.69531,256.03516 C 133.16405,256.51954 133.39843,257.25131 133.39844,258.23047 L 133.39844,264.01953 L 131.125,264.01953 L 131.125,258.88672 C 131.12499,258.27735 131.02083,257.84245 130.8125,257.58203 C 130.60937,257.32162 130.27604,257.19141 129.8125,257.19141 C 129.27604,257.19141 128.85156,257.35287 128.53906,257.67578 C 128.22656,257.9935 128.07031,258.42839 128.07031,258.98047 L 128.07031,264.01953 L 125.79688,264.01953 M 106.64844,284.01953 L 106.64844,272.51172 L 109.01563,272.51172 L 109.01563,277.23828 L 113.50781,272.51172 L 116.46875,272.51172 L 111.875,277.16797 L 116.88281,284.01953 L 113.99219,284.01953 L 110.24219,278.75391 L 109.01563,279.97266 L 109.01563,284.01953 L 106.64844,284.01953 M 122.9375,281.44141 L 125.20313,281.44141 C 124.97395,282.33724 124.51041,283.04037 123.8125,283.55078 C 123.11979,284.05599 122.27343,284.30859 121.27344,284.30859 C 120.04427,284.30859 119.07031,283.89714 118.35156,283.07422 C 117.63281,282.2461 117.27344,281.1263 117.27344,279.71484 C 117.27344,278.32422 117.6276,277.22787 118.33594,276.42578 C 119.04427,275.62371 120.01302,275.22267 121.24219,275.22266 C 122.54427,275.22267 123.54947,275.6185 124.25781,276.41016 C 124.96614,277.19662 125.3203,278.31902 125.32031,279.77734 C 125.3203,279.93881 125.3177,280.0612 125.3125,280.14453 C 125.31249,280.22266 125.30728,280.29818 125.29688,280.37109 L 119.625,280.37109 C 119.65625,281.03776 119.81771,281.54037 120.10938,281.87891 C 120.40625,282.21745 120.83073,282.38672 121.38281,282.38672 C 121.77343,282.38672 122.09374,282.3112 122.34375,282.16016 C 122.59374,282.00391 122.79166,281.76433 122.9375,281.44141 M 119.625,278.87891 L 122.96875,278.87891 C 122.94791,278.306 122.79426,277.8711 122.50781,277.57422 C 122.22656,277.27214 121.82031,277.1211 121.28906,277.12109 C 120.79427,277.1211 120.40364,277.27214 120.11719,277.57422 C 119.83593,277.87631 119.67187,278.3112 119.625,278.87891 M 127.16406,287.42578 L 127.16406,285.58984 C 127.23698,285.60026 127.3125,285.60807 127.39063,285.61328 C 127.46875,285.61849 127.57031,285.62109 127.69531,285.62109 C 128.14323,285.62109 128.47916,285.51432 128.70313,285.30078 C 128.92708,285.09245 129.03906,284.77734 129.03906,284.35547 C 129.03906,284.32422 129.03385,284.28516 129.02344,284.23828 C 129.01302,284.19141 129.0026,284.15234 128.99219,284.12109 L 125.92969,275.52734 L 128.42969,275.52734 L 130.21875,281.65234 L 131.96094,275.52734 L 134.35156,275.52734 L 130.85938,285.54297 C 130.59895,286.29297 130.27343,286.80338 129.88281,287.07422 C 129.49218,287.35026 128.90625,287.48828 128.125,287.48828 C 127.98437,287.48828 127.83333,287.48307 127.67188,287.47266 C 127.51041,287.46224 127.34114,287.44661 127.16406,287.42578"
+       id="text5872" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 708.94531,264.01953 L 705.64844,252.51172 L 708.10156,252.51172 L 710.07031,260.62891 L 711.73438,252.51172 L 714.25781,252.51172 L 715.92188,260.62891 L 717.89063,252.51172 L 720.32031,252.51172 L 717.03125,264.01953 L 714.77344,264.01953 L 712.99219,255.20703 L 711.20313,264.01953 L 708.94531,264.01953 M 721.5,254.58203 L 721.5,252.51172 L 723.77344,252.51172 L 723.77344,254.58203 L 721.5,254.58203 M 721.5,264.01953 L 721.5,255.52734 L 723.77344,255.52734 L 723.77344,264.01953 L 721.5,264.01953 M 725.79688,264.01953 L 725.79688,255.52734 L 728.02344,255.52734 L 728.02344,256.53516 C 728.34114,256.12371 728.71614,255.81641 729.14844,255.61328 C 729.58072,255.40496 730.06249,255.30079 730.59375,255.30078 C 731.53124,255.30079 732.23176,255.54558 732.69531,256.03516 C 733.16405,256.51954 733.39843,257.25131 733.39844,258.23047 L 733.39844,264.01953 L 731.125,264.01953 L 731.125,258.88672 C 731.12499,258.27735 731.02083,257.84245 730.8125,257.58203 C 730.60937,257.32162 730.27604,257.19141 729.8125,257.19141 C 729.27604,257.19141 728.85156,257.35287 728.53906,257.67578 C 728.22656,257.9935 728.07031,258.42839 728.07031,258.98047 L 728.07031,264.01953 L 725.79688,264.01953 M 706.64844,284.01953 L 706.64844,272.51172 L 709.01563,272.51172 L 709.01563,277.23828 L 713.50781,272.51172 L 716.46875,272.51172 L 711.875,277.16797 L 716.88281,284.01953 L 713.99219,284.01953 L 710.24219,278.75391 L 709.01563,279.97266 L 709.01563,284.01953 L 706.64844,284.01953 M 722.9375,281.44141 L 725.20313,281.44141 C 724.97395,282.33724 724.51041,283.04037 723.8125,283.55078 C 723.11979,284.05599 722.27343,284.30859 721.27344,284.30859 C 720.04427,284.30859 719.07031,283.89714 718.35156,283.07422 C 717.63281,282.2461 717.27344,281.1263 717.27344,279.71484 C 717.27344,278.32422 717.6276,277.22787 718.33594,276.42578 C 719.04427,275.62371 720.01302,275.22267 721.24219,275.22266 C 722.54427,275.22267 723.54947,275.6185 724.25781,276.41016 C 724.96614,277.19662 725.3203,278.31902 725.32031,279.77734 C 725.3203,279.93881 725.3177,280.0612 725.3125,280.14453 C 725.31249,280.22266 725.30728,280.29818 725.29688,280.37109 L 719.625,280.37109 C 719.65625,281.03776 719.81771,281.54037 720.10938,281.87891 C 720.40625,282.21745 720.83073,282.38672 721.38281,282.38672 C 721.77343,282.38672 722.09374,282.3112 722.34375,282.16016 C 722.59374,282.00391 722.79166,281.76433 722.9375,281.44141 M 719.625,278.87891 L 722.96875,278.87891 C 722.94791,278.306 722.79426,277.8711 722.50781,277.57422 C 722.22656,277.27214 721.82031,277.1211 721.28906,277.12109 C 720.79427,277.1211 720.40364,277.27214 720.11719,277.57422 C 719.83593,277.87631 719.67187,278.3112 719.625,278.87891 M 727.16406,287.42578 L 727.16406,285.58984 C 727.23698,285.60026 727.3125,285.60807 727.39063,285.61328 C 727.46875,285.61849 727.57031,285.62109 727.69531,285.62109 C 728.14323,285.62109 728.47916,285.51432 728.70313,285.30078 C 728.92708,285.09245 729.03906,284.77734 729.03906,284.35547 C 729.03906,284.32422 729.03385,284.28516 729.02344,284.23828 C 729.01302,284.19141 729.0026,284.15234 728.99219,284.12109 L 725.92969,275.52734 L 728.42969,275.52734 L 730.21875,281.65234 L 731.96094,275.52734 L 734.35156,275.52734 L 730.85938,285.54297 C 730.59895,286.29297 730.27343,286.80338 729.88281,287.07422 C 729.49218,287.35026 728.90625,287.48828 728.125,287.48828 C 727.98437,287.48828 727.83333,287.48307 727.67188,287.47266 C 727.51041,287.46224 727.34114,287.44661 727.16406,287.42578"
+       id="text5878" />
+    <path
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Swis721 BT"
+       d="M 759.98438,275.60938 L 759.98438,264.10156 L 763.48438,264.10156 L 765.77344,272.85938 L 768.03125,264.10156 L 771.54688,264.10156 L 771.54688,275.60938 L 769.32813,275.60938 L 769.32813,266.32813 L 766.99219,275.60938 L 764.57031,275.60938 L 762.20313,266.32813 L 762.20313,275.60938 L 759.98438,275.60938 M 778.99219,273.03125 L 781.25781,273.03125 C 781.02864,273.92709 780.5651,274.63021 779.86719,275.14063 C 779.17447,275.64583 778.32812,275.89844 777.32813,275.89844 C 776.09896,275.89844 775.125,275.48698 774.40625,274.66406 C 773.6875,273.83594 773.32812,272.71615 773.32813,271.30469 C 773.32812,269.91407 773.68229,268.81772 774.39063,268.01563 C 775.09896,267.21355 776.06771,266.81251 777.29688,266.8125 C 778.59895,266.81251 779.60416,267.20834 780.3125,268 C 781.02083,268.78647 781.37499,269.90886 781.375,271.36719 C 781.37499,271.52865 781.37239,271.65105 781.36719,271.73438 C 781.36718,271.8125 781.36197,271.88802 781.35156,271.96094 L 775.67969,271.96094 C 775.71093,272.62761 775.87239,273.13021 776.16406,273.46875 C 776.46093,273.80729 776.88541,273.97656 777.4375,273.97656 C 777.82812,273.97656 778.14843,273.90104 778.39844,273.75 C 778.64843,273.59375 778.84635,273.35417 778.99219,273.03125 M 775.67969,270.46875 L 779.02344,270.46875 C 779.0026,269.89584 778.84895,269.46094 778.5625,269.16406 C 778.28124,268.86199 777.87499,268.71094 777.34375,268.71094 C 776.84895,268.71094 776.45833,268.86199 776.17188,269.16406 C 775.89062,269.46615 775.72656,269.90105 775.67969,270.46875 M 782.88281,275.60938 L 782.88281,267.11719 L 785.10938,267.11719 L 785.10938,268.125 C 785.42708,267.71355 785.80208,267.40626 786.23438,267.20313 C 786.66666,266.9948 787.14843,266.89063 787.67969,266.89063 C 788.61718,266.89063 789.3177,267.13543 789.78125,267.625 C 790.24999,268.10938 790.48437,268.84115 790.48438,269.82031 L 790.48438,275.60938 L 788.21094,275.60938 L 788.21094,270.47656 C 788.21093,269.86719 788.10676,269.4323 787.89844,269.17188 C 787.69531,268.91147 787.36197,268.78126 786.89844,268.78125 C 786.36197,268.78126 785.9375,268.94272 785.625,269.26563 C 785.3125,269.58334 785.15625,270.01823 785.15625,270.57031 L 785.15625,275.60938 L 782.88281,275.60938 M 800.01563,267.11719 L 800.01563,275.60938 L 797.78906,275.60938 L 797.78906,274.60156 C 797.46614,275.01302 797.08854,275.32292 796.65625,275.53125 C 796.22916,275.73437 795.74739,275.83594 795.21094,275.83594 C 794.27864,275.83594 793.57812,275.59115 793.10938,275.10156 C 792.64583,274.61198 792.41406,273.88021 792.41406,272.90625 L 792.41406,267.11719 L 794.6875,267.11719 L 794.6875,272.25 C 794.6875,272.85417 794.78906,273.28646 794.99219,273.54688 C 795.19531,273.80209 795.53125,273.92969 796,273.92969 C 796.53124,273.92969 796.95312,273.77084 797.26563,273.45313 C 797.58333,273.13021 797.74218,272.69271 797.74219,272.14063 L 797.74219,267.11719 L 800.01563,267.11719"
+       id="text5884" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="362"
+       y="272"
+       id="text3387"><tspan
+         sodipodi:role="line"
+         id="tspan3389"
+         x="362"
+         y="272"
+         style="font-size:13px;font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold">toggle tiling/floating</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="119.03223"
+       y="86"
+       id="text3391"><tspan
+         sodipodi:role="line"
+         id="tspan3393"
+         x="119.03223"
+         y="86"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">kill</tspan><tspan
+         sodipodi:role="line"
+         x="119.03223"
+         y="102.25"
+         id="tspan3395"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">window</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="239.79933"
+       y="86.438766"
+       id="text3397"><tspan
+         sodipodi:role="line"
+         id="tspan3399"
+         x="239.79933"
+         y="86.438766"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">exit</tspan><tspan
+         sodipodi:role="line"
+         x="239.79933"
+         y="102.68877"
+         id="tspan3401"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">i3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="299.31445"
+       y="86"
+       id="text3403"><tspan
+         sodipodi:role="line"
+         id="tspan3405"
+         x="299.31445"
+         y="86"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">restart</tspan><tspan
+         sodipodi:role="line"
+         x="299.31445"
+         y="102.25"
+         id="tspan3407"
+         style="font-size:13px;font-weight:bold;text-align:center;text-anchor:middle;-inkscape-font-specification:Bitstream Vera Sans Bold">i3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="491.81522"
+       y="146.5442"
+       id="text3430"><tspan
+         sodipodi:role="line"
+         id="tspan3432"
+         x="491.81522"
+         y="146.5442">move</tspan><tspan
+         sodipodi:role="line"
+         x="491.81522"
+         y="162.7942"
+         id="tspan3448">left</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="552.34015"
+       y="146.5442"
+       id="text3434"><tspan
+         sodipodi:role="line"
+         id="tspan3436"
+         x="552.34015"
+         y="146.5442">move</tspan><tspan
+         sodipodi:role="line"
+         x="552.34015"
+         y="162.7942"
+         id="tspan3450">down</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="611.90704"
+       y="145.83786"
+       id="text3438"><tspan
+         sodipodi:role="line"
+         id="tspan3440"
+         x="611.90704"
+         y="145.83786">move</tspan><tspan
+         sodipodi:role="line"
+         x="611.90704"
+         y="162.08786"
+         id="tspan3452">up</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="672.34808"
+       y="146.5442"
+       id="text3442"><tspan
+         sodipodi:role="line"
+         id="tspan3444"
+         x="672.34808"
+         y="146.5442">move</tspan><tspan
+         sodipodi:role="line"
+         x="672.34808"
+         y="162.7942"
+         id="tspan3446">right</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:13px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="194.95703"
+       y="276"
+       id="text4572"><tspan
+         sodipodi:role="line"
+         id="tspan4574"
+         x="194.95703"
+         y="276"
+         style="font-size:18">Mod1</tspan></text>
+  </g>
+</svg>
diff --git a/docs/modes.png b/docs/modes.png
new file mode 100644 (file)
index 0000000..656a6db
Binary files /dev/null and b/docs/modes.png differ
diff --git a/docs/multi-monitor b/docs/multi-monitor
new file mode 100644 (file)
index 0000000..ec0256c
--- /dev/null
@@ -0,0 +1,60 @@
+The multi-monitor situation
+===========================
+Michael Stapelberg <michael+i3@stapelberg.de>
+March 2010
+
+…or: oh no, I have an nVidia graphics card!
+
+== The quick fix
+
+If you are using the nVidia binary graphics driver (also known as 'blob')
+you need to use the +--force-xinerama+ flag (in your .xsession) when starting
+i3, like so:
+
+.Example:
+----------------------------------------------
+exec i3 --force-xinerama -V >>~/.i3/i3log 2>&1
+----------------------------------------------
+
+== The explanation
+
+Starting with version 3.ε, i3 uses the RandR (Rotate and Resize) API instead
+of Xinerama. The reason for this, is that RandR provides more information
+about your outputs and connected screens than Xinerama does. To be specific,
+the code which handled on-the-fly screen reconfiguration (meaning without
+restarting the X server) was a very messy heuristic and most of the time did
+not work correctly -- that is just not possible with the little information
+Xinerama offers (just a list of screen resolutions, no identifiers for the
+screens or any additional information). Xinerama simply was not designed
+for dynamic configuration.
+
+So RandR came along, as a more powerful alternative (RandR 1.2 to be specific).
+It offers all of Xinerama’s possibilities and lots more. Using the RandR API
+made our code much more robust and clean. Also, you can now reliably assign
+workspaces to output names instead of some rather unreliable screen identifier
+(position inside the list of screens, which could change, and so on…).
+
+As RandR has been around for about three years as of this writing, it seemed
+like a very good idea to us, and it still is a very good one. What we did not
+expect, however, was the nVidia binary driver. It still does not support RandR
+(as of March 2010), even though nVidia has announced that it will support RandR
+eventually. What does this mean for you, if you are stuck with the binary
+driver for some reason (say the free drivers don’t work with your card)? First
+of all, you are stuck with TwinView and cannot use +xrandr+. While this ruins
+the user experience, the more grave problem is that the nVidia driver not only
+does not support dynamic configuration using RandR, it also does not expose
+correct multi-monitor information via the RandR API. So, in some setups, i3
+will not find any screens; in others, it will find one large screen which
+actually contains both of your physical screens (but it will not know that
+these are two screens).
+
+For this very reason, we decided to implement the following workaround: As
+long as the nVidia driver does not support RandR, an option called
++--force-xinerama+ is available in i3. This option gets the list of screens
+*once* when starting, and never updates it. As the nVidia driver cannot do
+dynamic configuration anyways, this is not a big deal.
+
+== See also
+
+For more information on how to use multi-monitor setups, see the i3 User’s
+Guide.
diff --git a/docs/refcard.tex b/docs/refcard.tex
new file mode 100644 (file)
index 0000000..c945db5
--- /dev/null
@@ -0,0 +1,107 @@
+\documentclass[10pt,a4,landscape]{article}
+
+% \usepackage[cam,a4,center,info,]{crop} % frame
+\usepackage[height=20cm,width=25.7cm,noheadfoot,landscape]{geometry} % A4 - 210×297 mm
+
+\usepackage[T1]{fontenc}
+\usepackage{multicol}
+\usepackage{color}
+\usepackage{url}
+\usepackage{lastpage}
+
+\usepackage{hyperref}
+\hypersetup{
+  pdftitle={i3 Reference Card},
+  pdfauthor={\textcopyright\ Zeus Panchenko},
+  pdfkeywords={i3, refcard},
+  pdfsubject={based on http://i3.zekjur.net/docs/userguide.html},
+  pdfpagemode={FullScreen}}
+
+\definecolor{lightgray}{gray}{0.7}
+
+\pagestyle{empty}
+
+\setlength{\parindent}{0in}
+\setlength{\columnseprule}{0.5pt}
+\setlength{\columnsep}{20pt}
+
+\newcommand{\RefCardTitle}[2]
+{\centering{\Large{\textbf{i3 Reference Card (#1/#2)\\
+        {\scriptsize{\url{http://i3.zekjur.net/docs/userguide.html}}}}}}
+  \vspace{1mm}}
+
+
+\newcommand{\RefCardSec}[1] {\vspace{2mm} \raggedright {\vspace{0.5mm}
+    \colorbox{lightgray} {\makebox[0.31\textwidth][l]
+      {\Large{\textsc{\textsf{\textbf{\color{black}#1}}}}}}
+    \vspace{0.5mm}}}
+
+\newcommand{\RefCardRow}[2] {\normalsize{\textbf{\texttt{#1}}}
+  \hspace{\stretch{1}} \raggedleft{\small{\textnormal{#2}}} \\}
+
+\begin{document}
+
+\centering
+
+\begin{multicols}{3}
+  \RefCardTitle{\thepage}{\pageref{LastPage}}
+
+  \RefCardSec{Moving around}
+
+  \RefCardRow{Mod1+Enter}{open new terminal}
+  \RefCardRow{Mod1+j}{focus (left)}
+  \RefCardRow{Mod1+k}{focus (down)}
+  \RefCardRow{Mod1+l}{focus (up)}
+  \RefCardRow{Mod1+;}{focus (right)}
+  \RefCardRow{Mod1+Shift+j}{move window (left)}
+  \RefCardRow{Mod1+Shift+k}{move window (down)}
+  \RefCardRow{Mod1+Shift+l}{move window (up)}
+  \RefCardRow{Mod1+Shift+;}{move window (right)}
+  \RefCardRow{Mod1+Control+j}{snap (left)}
+  \RefCardRow{Mod1+Control+k}{snap (down)}
+  \RefCardRow{Mod1+Control+l}{snap (up)}
+  \RefCardRow{Mod1+Control+;}{snap (right)}
+  \RefCardRow{Mod1+Shift+q}{kill a window}
+  \RefCardRow{Mod1+Shift+<number>}{move a window to another workspace}
+
+
+  \RefCardSec{Changing container modes}
+
+  \RefCardRow{Mod1+e}{default}
+  \RefCardRow{Mod1+h}{stacking}
+  \RefCardRow{Mod1+w}{tabbed}
+  \RefCardRow{Mod1+Shift+f}{global fullscreen}
+  \RefCardRow{Mod1+f}{toggle fullscreen}
+  \RefCardRow{Mod1+Shift+Space}{toggle floating}
+  \RefCardRow{Mod1+<Mouse>}{drag floating}
+
+  \RefCardSec{Opening other applications}
+
+  \RefCardRow{Mod1+v}{open application launcher (dmenu)}
+
+  \RefCardSec{Using workspaces}
+
+  \RefCardRow{Mod1+<number>}{switch to another workspace}
+
+  \RefCardSec{Restarting i3 inplace}
+
+  \RefCardRow{Mod1+Shift+r}{restart i3 inplace}
+
+  \RefCardSec{Exiting i3}
+
+  \RefCardRow{Mod1+Shift+e}{exit i3}
+
+  \vspace{1cm}
+  \tiny{
+    \begin{center}
+      Copyright \copyright 2009, Michael Stapelberg \\
+      All rights reserved. \\
+      Designed by Zeus Panchenko
+    \end{center}
+      Permission is granted to copy, distribute and/or modify this
+      document provided the copyright notice and this permission
+      notice are preserved on all copies.}
+
+\end{multicols}
+
+\end{document}
diff --git a/docs/single_terminal.png b/docs/single_terminal.png
new file mode 100644 (file)
index 0000000..4fe918c
Binary files /dev/null and b/docs/single_terminal.png differ
diff --git a/docs/snapping.png b/docs/snapping.png
new file mode 100644 (file)
index 0000000..65fe6e4
Binary files /dev/null and b/docs/snapping.png differ
diff --git a/docs/stacklimit.png b/docs/stacklimit.png
new file mode 100644 (file)
index 0000000..ab5bed7
Binary files /dev/null and b/docs/stacklimit.png differ
diff --git a/docs/tree-layout1.png b/docs/tree-layout1.png
new file mode 100644 (file)
index 0000000..ee69f1a
Binary files /dev/null and b/docs/tree-layout1.png differ
diff --git a/docs/tree-layout2.png b/docs/tree-layout2.png
new file mode 100644 (file)
index 0000000..5cbadde
Binary files /dev/null and b/docs/tree-layout2.png differ
diff --git a/docs/tree-shot1.png b/docs/tree-shot1.png
new file mode 100644 (file)
index 0000000..3bbeae1
Binary files /dev/null and b/docs/tree-shot1.png differ
diff --git a/docs/tree-shot2.png b/docs/tree-shot2.png
new file mode 100644 (file)
index 0000000..f003264
Binary files /dev/null and b/docs/tree-shot2.png differ
diff --git a/docs/tree-shot3.png b/docs/tree-shot3.png
new file mode 100644 (file)
index 0000000..fe4c11e
Binary files /dev/null and b/docs/tree-shot3.png differ
diff --git a/docs/tree-shot4.png b/docs/tree-shot4.png
new file mode 100644 (file)
index 0000000..61e8c91
Binary files /dev/null and b/docs/tree-shot4.png differ
diff --git a/docs/two_columns.png b/docs/two_columns.png
new file mode 100644 (file)
index 0000000..6dc8c40
Binary files /dev/null and b/docs/two_columns.png differ
diff --git a/docs/two_terminals.png b/docs/two_terminals.png
new file mode 100644 (file)
index 0000000..20b45ac
Binary files /dev/null and b/docs/two_terminals.png differ
diff --git a/docs/userguide b/docs/userguide
new file mode 100644 (file)
index 0000000..e7a0459
--- /dev/null
@@ -0,0 +1,1094 @@
+i3 User’s Guide
+===============
+Michael Stapelberg <michael+i3@stapelberg.de>
+July 2011
+
+This document contains all the information you need to configure and use the i3
+window manager. If it does not, please contact us on IRC (preferred) or post your
+question(s) on the mailing list.
+
+== Default keybindings
+
+For the "too long; didn’t read" people, here is an overview of the default
+keybindings (click to see the full size image):
+
+*Keys to use with mod (alt):*
+
+image:keyboard-layer1.png["Keys to use with mod (alt)",width=600,link="keyboard-layer1.png"]
+
+*Keys to use with Shift+mod:*
+
+image:keyboard-layer2.png["Keys to use with Shift+mod",width=600,link="keyboard-layer2.png"]
+
+The red keys are the modifiers you need to press (by default), the blue keys
+are your homerow.
+
+== Using i3
+
+Throughout this guide, the keyword +mod+ will be used to refer to the
+configured modifier. This is the alt key (Mod1) by default, with windows (Mod4)
+being a popular alternative.
+
+=== Opening terminals and moving around
+
+One very basic operation is opening a new terminal. By default, the keybinding
+for this is mod+Enter, that is Alt+Enter in the default configuration. By
+pressing mod+Enter, a new terminal will be opened.  It will fill the whole
+space available on your screen.
+
+image:single_terminal.png[Single terminal]
+
+If you now open another terminal, i3 will place it next to the current one,
+splitting the screen size in half. Depending on your monitor, i3 will put the
+created window beside the existing window (on wide displays) or below the
+existing window (rotated displays).
+
+image:two_terminals.png[Two terminals]
+
+To move the focus between the two terminals, you can use the direction keys
+which you may know from the editor +vi+. However, in i3, your homerow is used
+for these keys (in +vi+, the keys are shifted to the left by one for
+compatibility with most keyboard layouts). Therefore, +mod+J+ is left, +mod+K+
+is down, +mod+L+ is up and `mod+;` is right. So, to switch between the
+terminals, use +mod+K+ or +mod+L+. Of course, you can also use the arrow keys.
+
+At the moment, your workspace is split (it contains two terminals) in a
+specific direction (horizontal by default). Every window can be split
+horizontally or vertically again, just like the workspace. The terminology is
+"window" for a container that actually contains an X11 window (like a terminal
+or browser) and "split container" for containers that consist of one or more
+windows.
+
+TODO: picture of the tree
+
+To split a window vertically, press +mod+v+. To split it horizontally, press
++mod+h+.
+
+=== Changing the container layout
+
+A split container can have one of the following layouts:
+
+default::
+Windows are sized so that every window gets an equal amount of space in the
+container.
+stacking::
+Only the focused window in the container is displayed. You get a list of
+windows at the top of the container.
+tabbed::
+The same principle as +stacking+, but the list of windows at the top is only
+a single line which is vertically split.
+
+To switch modes, press +mod+e+ for default, +mod+h+ for stacking and
++mod+w+ for tabbed.
+
+image:modes.png[Container modes]
+
+=== Toggling fullscreen mode for a window
+
+To display a window in fullscreen mode or to go out of fullscreen mode again,
+press +mod+f+.
+
+There is also a global fullscreen mode in i3 in which the client will span all
+available outputs.
+
+=== Opening other applications
+
+Aside from opening applications from a terminal, you can also use the handy
++dmenu+ which is opened by pressing +mod+d+ by default. Just type the name
+(or a part of it) of the application which you want to open. The corresponding
+application has to be in your +$PATH+ for this to work.
+
+Additionally, if you have applications you open very frequently, you can
+create a keybinding for starting the application directly. See the section
+<<configuring>> for details.
+
+=== Closing windows
+
+If an application does not provide a mechanism for closing (most applications
+provide a menu, the escape key or a shortcut like +Control+W+ to close), you
+can press +mod+Shift+q+ to kill a window. For applications which support
+the WM_DELETE protocol, this will correctly close the application (saving
+any modifications or doing other cleanup). If the application doesn’t support
+the WM_DELETE protocol your X server will kill the window and the behaviour
+depends on the application.
+
+=== Using workspaces
+
+Workspaces are an easy way to group a set of windows. By default, you are on
+the first workspace, as the bar on the bottom left indicates. To switch to
+another workspace, press +mod+num+ where +num+ is the number of the workspace
+you want to use. If the workspace does not exist yet, it will be created.
+
+A common paradigm is to put the web browser on one workspace, communication
+applications (+mutt+, +irssi+, ...) on another one, and the ones with which you
+work, on the third one. Of course, there is no need to follow this approach.
+
+If you have multiple screens, a workspace will be created on each screen at
+startup. If you open a new workspace, it will be bound to the screen you
+created it on.  When you switch to a workspace on another screen, i3 will set
+focus to that screen.
+
+=== Moving windows to workspaces
+
+To move a window to another workspace, simply press +mod+Shift+num+ where
++num+ is (like when switching workspaces) the number of the target workspace.
+Similarly to switching workspaces, the target workspace will be created if
+it does not yet exist.
+
+=== Resizing
+
+The easiest way to resize a container is by using the mouse: Grab the border
+and move it to the wanted size.
+
+See <<resizingconfig>> for how to configure i3 to be able to resize
+columns/rows with your keyboard.
+
+=== Restarting i3 inplace
+
+To restart i3 inplace (and thus get into a clean state if there is a bug, or
+to upgrade to a newer version of i3) you can use +mod+Shift+r+.
+
+=== Exiting i3
+
+To cleanly exit i3 without killing your X server, you can use +mod+Shift+e+.
+
+=== Floating
+
+Floating mode is the opposite of tiling mode. The position and size of a window
+are not managed by i3, but by you. Using this mode violates the tiling
+paradigm but can be useful for some corner cases like "Save as" dialog
+windows, or toolbar windows (GIMP or similar). Those windows usually set the
+appropriate hint and are opened in floating mode by default.
+
+You can enable floating mode for a window by pressing +mod+Shift+Space+. By
+dragging the window’s titlebar with your mouse you can move the window
+around. By grabbing the borders and moving them you can resize the window. You
+can also do that by using the <<floating_modifier>>.
+
+For resizing floating windows with your keyboard, see <<resizingconfig>>.
+
+Floating windows are always on top of tiling windows.
+
+== Tree
+
+i3 stores all information about the X11 outputs, workspaces and layout of the
+windows on them in a tree. The root node is the X11 root window, followed by
+the X11 outputs, then dock areas and a content container, then workspaces and
+finally the windows themselve. In previous versions of i3 we had multiple lists
+(of outputs, workspaces) and a table for each workspace. That approach turned
+out to be complicated to use (snapping), understand and implement.
+
+=== The tree consists of Containers
+
+The building blocks of our tree are so called +Containers+. A +Container+ can
+host a window (meaning an X11 window, one that you can actually see and use,
+like a browser). Alternatively, it could contain one or more +Containers+. A
+simple example is the workspace: When you start i3 with a single monitor, a
+single workspace and you open two terminal windows, you will end up with a tree
+like this:
+
+image::tree-layout2.png["layout2",float="right"]
+image::tree-shot4.png["shot4",title="Two terminals on standard workspace"]
+
+=== Orientation and Split Containers
+
+[[OrientationSplit]]
+
+It is only natural to use so-called +Split Containers+ in order to build a
+layout when using a tree as data structure. In i3, every +Container+ has an
+orientation (horizontal, vertical or unspecified). So, in our example with the
+workspace, the default orientation of the workspace +Container+ is horizontal
+(most monitors are widescreen nowadays). If you change the orientation to
+vertical (+mod+v+ in the default config) and *then* open two terminals, i3 will
+configure your windows like this:
+
+image::tree-shot2.png["shot2",title="Vertical Workspace Orientation"]
+
+An interesting new feature of the tree branch is the ability to split anything:
+Let’s assume you have two terminals on a workspace (with horizontal
+orientation), focus is on the right terminal. Now you want to open another
+terminal window below the current one. If you would just open a new terminal
+window, it would show up to the right due to the horizontal workspace
+orientation. Instead, press +mod+v+ to create a +Vertical Split Container+ (to
+open a +Horizontal Split Container+, use +mod+h+). Now you can open a new
+terminal and it will open below the current one:
+
+image::tree-layout1.png["Layout",float="right"]
+image::tree-shot1.png["shot",title="Vertical Split Container"]
+
+unfloat::[]
+
+You probably guessed it already: There is no limit on how deep your hierarchy
+of splits can be.
+
+=== Focus parent
+
+Let’s stay with our example from above. We have a terminal on the left and two
+vertically split terminals on the right, focus is on the bottom right one. When
+you open a new terminal, it will open below the current one.
+
+So, how can you open a new terminal window to the *right* of the current one?
+The solution is to use +focus parent+, which will focus the +Parent Container+ of
+the current +Container+. In this case, you would focus the +Vertical Split
+Container+ which is *inside* the horizontally oriented workspace. Thus, now new
+windows will be opened to the right of the +Vertical Split Container+:
+
+image::tree-shot3.png["shot3",title="Focus parent, then open new terminal"]
+
+[[configuring]]
+== Configuring i3
+
+This is where the real fun begins ;-). Most things are very dependant on your
+ideal working environment so we can’t make reasonable defaults for them.
+
+While not using a programming language for the configuration, i3 stays
+quite flexible in regards to the things you usually want your window manager
+to do.
+
+For example, you can configure bindings to jump to specific windows,
+you can set specific applications to start on specific workspaces, you can
+automatically start applications, you can change the colors of i3, and you
+can bind your keys to do useful things.
+
+To change the configuration of i3, copy +/etc/i3/config+ to +\~/.i3/config+
+(or +~/.config/i3/config+ if you like the XDG directory scheme) and edit it
+with a text editor.
+
+On first start (and on all following starts, unless you have a configuration
+file), i3 will offer you to create a configuration file. You can tell the
+wizard to use either Alt (Mod1) or Windows (Mod4) as modifier in the config
+file. Also, the created config file will use the key symbols of your current
+keyboard layout. To start the wizard, use the command +i3-config-wizard+.
+Please note that you must not have +~/.i3/config+, otherwise the wizard will
+exit.
+
+=== Comments
+
+It is possible and recommended to use comments in your configuration file to
+properly document your setup for later reference. Comments are started with
+a # and can only be used at the beginning of a line:
+
+*Examples*:
+-------------------
+# This is a comment
+-------------------
+
+=== Fonts
+
+i3 uses X core fonts (not Xft) for rendering window titles. You can use
++xfontsel(1)+ to generate such a font description. To see special characters
+(Unicode), you need to use a font which supports the ISO-10646 encoding.
+
+If i3 cannot open the configured font, it will output an error in the logfile
+and fall back to a working font.
+
+*Syntax*:
+------------------------------
+font <X core font description>
+------------------------------
+
+*Examples*:
+--------------------------------------------------------------
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+--------------------------------------------------------------
+
+[[keybindings]]
+
+=== Keyboard bindings
+
+A keyboard binding makes i3 execute a command (see below) upon pressing a
+specific key. i3 allows you to bind either on keycodes or on keysyms (you can
+also mix your bindings, though i3 will not protect you from overlapping ones).
+
+* A keysym (key symbol) is a description for a specific symbol, like "a"
+  or "b", but also more strange ones like "underscore" instead of "_". These
+  are the ones you use in Xmodmap to remap your keys. To get the current
+  mapping of your keys, use +xmodmap -pke+.
+
+* Keycodes do not need to have a symbol assigned (handy for custom vendor
+  hotkeys on some notebooks) and they will not change their meaning as you
+  switch to a different keyboard layout (when using +xmodmap+).
+
+My recommendation is: If you often switch keyboard layouts but you want to keep
+your bindings in the same physical location on the keyboard, use keycodes.
+If you don’t switch layouts, and want a clean and simple config file, use
+keysyms.
+
+*Syntax*:
+----------------------------------
+bindsym [Modifiers+]keysym command
+bindcode [Modifiers+]keycode command
+----------------------------------
+
+*Examples*:
+--------------------------------
+# Fullscreen
+bindsym mod+f f
+
+# Restart
+bindsym mod+Shift+r restart
+
+# Notebook-specific hotkeys
+bindcode 214 exec /home/michael/toggle_beamer.sh
+--------------------------------
+
+Available Modifiers:
+
+Mod1-Mod5, Shift, Control::
+Standard modifiers, see +xmodmap(1)+
+
+Mode_switch::
+Unlike other window managers, i3 can use Mode_switch as a modifier. This allows
+you to remap capslock (for example) to Mode_switch and use it for both: typing
+umlauts or special characters 'and' having some comfortably reachable key
+bindings. For example, when typing, capslock+1 or capslock+2 for switching
+workspaces is totally convenient. Try it :-).
+
+[[floating_modifier]]
+
+=== The floating modifier
+
+To move floating windows with your mouse, you can either grab their titlebar
+or configure the so called floating modifier which you can then press and
+click anywhere in the window itself to move it. The most common setup is to
+use the same key you use for managing windows (Mod1 for example). Then
+you can press Mod1, click into a window using your left mouse button, and drag
+it to the position you want.
+
+When holding the floating modifier, you can resize a floating window by
+pressing the right mouse button on it and moving around while holding it. If
+you hold the shift button as well, the resize will be proportional.
+
+*Syntax*:
+--------------------------------
+floating_modifier <Modifiers>
+--------------------------------
+
+*Example*:
+--------------------------------
+floating_modifier Mod1
+--------------------------------
+
+=== Orientation for new workspaces
+
+New workspaces get a reasonable default orientation: Wide-screen monitors
+(anything wider than high) get horizontal orientation, rotated monitors
+(anything higher than wide) get vertical orientation.
+
+With the +default_orientation+ configuration directive, you can override that
+behaviour.
+
+*Syntax*:
+----------------------------------------------
+default_orientation <horizontal|vertical|auto>
+----------------------------------------------
+
+*Example*:
+----------------------------
+default_orientation vertical
+----------------------------
+
+=== Layout mode for new containers
+
+This option determines in which mode new containers on workspace level will
+start.
+///////////////////////////////
+See also <<stack-limit>>.
+//////////////////////////////
+
+*Syntax*:
+---------------------------------------------
+workspace_layout <default|stacking|tabbed>
+---------------------------------------------
+/////////////////////////////////////////////
+new_container stack-limit <cols|rows> <value>
+/////////////////////////////////////////////
+
+*Example*:
+---------------------
+workspace_layout tabbed
+---------------------
+
+=== Border style for new windows
+
+This option determines which border style new windows will have.
+
+*Syntax*:
+---------------------------------------------
+new_window <normal|1pixel|borderless>
+---------------------------------------------
+
+*Example*:
+---------------------
+new_window 1pixel
+---------------------
+
+=== Arbitrary commands for specific windows (for_window)
+
+With the +for_window+ command, you can let i3 execute any command when it
+encounters a specific window. This can be used to set windows to floating or to
+change their border style, for example.
+
+*Syntax*:
+-----------------------------
+for_window [criteria] command
+-----------------------------
+
+*Examples*:
+------------------------------------------------
+# enable floating mode for all XTerm windows
+for_window [class="XTerm"] mode floating
+
+# Make all urxvts use a 1-pixel border:
+for_window [class="urxvt"] border 1pixel
+
+# A less useful, but rather funny example:
+# makes the window floating as soon as I change
+# directory to ~/work
+for_window [title="x200: ~/work"] mode floating
+------------------------------------------------
+
+=== Variables
+
+As you learned in the section about keyboard bindings, you will have
+to configure lots of bindings containing modifier keys. If you want to save
+yourself some typing and be able to change the modifier you use later,
+variables can be handy.
+
+*Syntax*:
+--------------
+set $name value
+--------------
+
+*Example*:
+------------------------
+set $m Mod1
+bindsym $m+Shift+r restart
+------------------------
+
+Variables are directly replaced in the file when parsing. There is no fancy
+handling and there are absolutely no plans to change this. If you need a more
+dynamic configuration you should create a little script which generates a
+configuration file and run it before starting i3 (for example in your
++~/.xsession+ file).
+
+=== Automatically putting clients on specific workspaces
+
+[[assign_workspace]]
+
+Specific windows can be matched by window class and/or window title. It is
+recommended that you match on window classes instead of window titles whenever
+possible because some applications first create their window, and then worry
+about setting the correct title. Firefox with Vimperator comes to mind. The
+window starts up being named Firefox, and only when Vimperator is loaded does
+the title change. As i3 will get the title as soon as the application maps the
+window (mapping means actually displaying it on the screen), you’d need to have
+to match on 'Firefox' in this case.
+
+You can prefix or suffix workspaces with a `~` to specify that matching clients
+should be put into floating mode. If you specify only a `~`, the client will
+not be put onto any workspace, but will be set floating on the current one.
+
+*Syntax*:
+------------------------------------------------------------
+assign ["]window class[/window title]["] [→] [workspace]
+------------------------------------------------------------
+
+*Examples*:
+----------------------
+assign urxvt 2
+assign urxvt → 2
+assign urxvt → work
+assign "urxvt" → 2
+assign "urxvt/VIM" → 3
+assign "gecko" → 4
+----------------------
+
+Note that the arrow is not required, it just looks good :-). If you decide to
+use it, it has to be a UTF-8 encoded arrow, not `->` or something like that.
+
+=== Automatically starting applications on i3 startup
+
+By using the +exec+ keyword outside a keybinding, you can configure
+which commands will be performed by i3 on initial startup. +exec+
+commands will not run when restarting i3, if you need a command to run
+also when restarting i3 you should use the +exec_always+
+keyword. These commands will be run in order.
+
+*Syntax*:
+-------------------
+exec command
+exec_always command
+-------------------
+
+*Examples*:
+--------------------------------
+exec i3status | i3bar -d
+exec_always ~/my_script.sh
+--------------------------------
+
+[[workspace_screen]]
+
+=== Automatically putting workspaces on specific screens
+
+If you assign clients to workspaces, it might be handy to put the
+workspaces on specific screens. Also, the assignment of workspaces to screens
+will determine which workspace i3 uses for a new screen when adding screens
+or when starting (e.g., by default it will use 1 for the first screen, 2 for
+the second screen and so on).
+
+*Syntax*:
+----------------------------------
+workspace <number> output <output>
+----------------------------------
+
+The 'output' is the name of the RandR output you attach your screen to. On a
+laptop, you might have VGA1 and LVDS1 as output names. You can see the
+available outputs by running +xrandr --current+.
+
+*Examples*:
+---------------------------
+workspace 1 output LVDS1
+workspace 5 output VGA1
+---------------------------
+
+=== Changing colors
+
+You can change all colors which i3 uses to draw the window decorations.
+
+*Syntax*:
+--------------------------------------------
+colorclass border background text
+--------------------------------------------
+
+Where colorclass can be one of:
+
+client.focused::
+       A client which currently has the focus.
+client.focused_inactive::
+       A client which is the focused one of its container, but it does not have
+       the focus at the moment.
+client.unfocused::
+       A client which is not the focused one of its container.
+client.urgent::
+       A client which has its urgency hint activated.
+
+You can also specify the color to be used to paint the background of the client
+windows. This color will be used to paint the window on top of which the client
+will be rendered.
+
+*Syntax*:
+-----------------------
+client.background color
+-----------------------
+
+Only clients that do not cover the whole area of this window expose the color
+used to paint it. If you use a color other than black for your terminals, you
+most likely want to set the client background color to the same color as your
+terminal program's background color to avoid black gaps between the rendered
+area of the termianal and the i3 border.
+
+Colors are in HTML hex format (#rrggbb), see the following example:
+
+*Examples*:
+--------------------------------------
+# class        border  backgr. text
+client.focused #2F343A #900000 #FFFFFF
+--------------------------------------
+
+Note that for the window decorations, the color around the child window is the
+background color, and the border color is only the two thin lines at the top of
+the window.
+
+=== Interprocess communication
+
+i3 uses unix sockets to provide an IPC interface. This allows third-party
+programs to get information from i3, such as the current workspaces
+(to display a workspace bar), and to control i3.
+
+The IPC socket is enabled by default and will be created in
++/tmp/i3-%u/ipc-socket.%p+ where +%u+ is your UNIX username and +%p+ is the PID
+of i3.
+
+You can override the default path through the environment-variable +I3SOCK+ or
+by specifying the +ipc-socket+ directive.
+
+*Examples*:
+----------------------------
+ipc-socket /tmp/i3-ipc.sock
+----------------------------
+
+You can then use the +i3-msg+ application to perform any command listed in
+the next section.
+
+=== Focus follows mouse
+
+If you have a setup where your mouse usually is in your way (like a touchpad
+on your laptop which you do not want to disable completely), you might want
+to disable 'focus follows mouse' and control focus only by using your keyboard.
+The mouse will still be useful inside the currently active window (for example
+to click on links in your browser window).
+
+*Syntax*:
+----------------------------
+focus_follows_mouse <yes|no>
+----------------------------
+
+*Example*:
+----------------------
+focus_follows_mouse no
+----------------------
+
+=== Popups during fullscreen mode
+
+When you are in fullscreen mode, some applications still open popup windows
+(take Xpdf for example). This is because these applications may not be aware
+that they are in fullscreen mode (they do not check the corresponding hint).
+There are two things which are possible to do in this situation:
+
+1. Just ignore the popup (don’t map it). This won’t interrupt you while you are
+   in fullscreen. However, some apps might react badly to this (deadlock until
+   you go out of fullscreen).
+2. Leave fullscreen mode. This is the default.
+
+*Syntax*:
+-------------------------------------------------
+popup_during_fullscreen <ignore|leave_fullscreen>
+-------------------------------------------------
+
+*Example*:
+------------------------------
+popup_during_fullscreen ignore
+------------------------------
+
+== List of commands
+
+=== Splitting containers
+
+The split command makes the current window a split container. Split containers
+can contain multiple windows. Every split container has an orientation, it is
+either split horizontally (a new window gets placed to the right of the current
+one) or vertically (a new window gets placed below the current one).
+
+If you apply this command to a split container with the same orientation,
+nothing will happen. If you use a different orientation, the split container’s
+orientation will be changed (if it does not have more than one window).
+
+*Syntax*:
+---------------------------
+split <vertical|horizontal>
+---------------------------
+
+*Example*:
+--------------
+split vertical
+--------------
+
+=== Manipulating layout
+
+Use +layout default+, +layout stacking+ or +layout tabbed+ to change the
+current container layout to default, stacking or tabbed layout, respectively.
+
+To make the current window (!) fullscreen, use +fullscreen+, to make
+it floating (or tiling again) use +floating enable+ respectively +floating disable+
+(or +floating toggle+):
+
+*Examples*:
+--------------
+bindsym mod+s layout stacking
+bindsym mod+l layout default
+bindsym mod+w layout tabbed
+
+# Toggle fullscreen
+bindsym mod+f fullscreen
+
+# Toggle floating/tiling
+bindsym mod+t floating toggle
+--------------
+
+=== Focusing/Moving containers
+
+To change the focus, use the focus command: +focus left+, +focus right+, +focus down+ and +focus up+.
+
+There are a few special parameters you can use for the focus command:
+
+parent::
+       Sets focus to the +Parent Container+ of the current +Container+.
+child::
+       The opposite of +focus parent+, sets the focus to the last focused
+       child container.
+floating::
+       Sets focus to the last focused floating container.
+tiling::
+       Sets focus to the last focused tiling container.
+mode_toggle::
+       Toggles between floating/tiling containers.
+
+For moving, use +move left+, +move right+, +move down+ and +move up+.
+
+*Examples*:
+----------------------
+# Focus clients on the left, bottom, top, right:
+bindsym mod+j focus left
+bindsym mod+k focus down
+bindsym mod+l focus up
+bindsym mod+semicolon focus right
+
+# Focus parent container
+bindsym mod+u focus parent
+
+# Focus last floating/tiling container
+bindsym mod+g focus mode_toggle
+
+# Move client to the left, bottom, top, right:
+bindsym mod+j move left
+bindsym mod+k move down
+bindsym mod+l move up
+bindsym mod+semicolon move right
+----------------------
+
+=== Changing workspaces/moving containers to workspaces
+
+To change to a specific workspace, use the +workspace+ command, followed by the
+number or name of the workspace. To move containers to specific workspaces, use
++move workspace+.
+
+You can also switch to the next and previous workspace with the commands
++workspace next+ and +workspace prev+, which is handy, for example, if you have
+workspace 1, 3, 4 and 9 and you want to cycle through them with a single key
+combination.
+
+*Examples*:
+-------------------------
+bindsym mod+1 workspace 1
+bindsym mod+2 workspace 2
+...
+
+bindsym mod+Shift+1 move workspace 1
+bindsym mod+Shift+2 move workspace 2
+...
+-------------------------
+
+[[resizingconfig]]
+
+=== Resizing containers/windows
+
+If you want to resize containers/windows using your keyboard, you can use the
++resize+ command, I recommend using it inside a so called +mode+:
+
+.Example: Configuration file, defining a mode for resizing
+----------------------------------------------------------------------
+mode "resize" {
+        # These bindings trigger as soon as you enter the resize mode
+
+        # They resize the border in the direction you pressed, e.g.
+        # when pressing left, the window is resized so that it has
+        # more space on its left
+
+        bindsym j resize shrink left
+        bindsym Shift+j resize grow left
+
+        bindsym k resize grow bottom
+        bindsym Shift+k resize shrink bottom
+
+        bindsym l resize shrink top
+        bindsym Shift+l resize grow top
+
+        bindsym semicolon resize grow right
+        bindsym Shift+semicolon resize shrink right
+
+        bindcode 36 mode default
+}
+
+# Enter resize mode
+bindsym mod+r mode "resize"
+----------------------------------------------------------------------
+
+=== Jumping to specific windows
+
+Often when in a multi-monitor environment, you want to quickly jump to a
+specific window. For example, while working on workspace 3 you may want to
+jump to your mail client to email your boss that you’ve achieved some
+important goal. Instead of figuring out how to navigate to your mailclient,
+it would be more convenient to have a shortcut. You can use the +focus+ command
+with criteria for that.
+
+*Syntax*:
+----------------------------------------------------
+[class="class"] focus
+[title="title"] focus
+----------------------------------------------------
+
+*Examples*:
+------------------------------------------------
+# Get me to the next open VIM instance
+bindsym mod+a [class="urxvt" title="VIM"] focus
+------------------------------------------------
+
+=== VIM-like marks (mark/goto)
+
+[[vim_like_marks]]
+
+This feature is like the jump feature: It allows you to directly jump to a
+specific window (this means switching to the appropriate workspace and setting
+focus to the windows). However, you can directly mark a specific window with
+an arbitrary label and use it afterwards.  You do not need to ensure that your
+windows have unique classes or titles, and you do not need to change your
+configuration file.
+
+As the command needs to include the label with which you want to mark the
+window, you cannot simply bind it to a key.  +i3-input+ is a tool created
+for this purpose: It lets you input a command and sends the command to i3. It
+can also prefix this command and display a custom prompt for the input dialog.
+
+*Syntax*:
+------------------------------
+mark identifier
+[con_mark="identifier"] focus
+------------------------------
+
+*Example (in a terminal)*:
+------------------------------
+$ i3-msg mark irssi
+$ i3-msg '[con_mark="irssi"] focus'
+------------------------------
+
+///////////////////////////////////////////////////////////////////
+TODO: make i3-input replace %s
+*Examples*:
+---------------------------------------
+# Read 1 character and mark the current window with this character
+bindsym mod+m exec i3-input -p 'mark ' -l 1 -P 'Mark: '
+
+# Read 1 character and go to the window with the character
+bindsym mod+g exec i3-input -p 'goto ' -l 1 -P 'Goto: '
+---------------------------------------
+
+Alternatively, if you do not want to mess with +i3-input+, you could create
+seperate bindings for a specific set of labels and then only use those labels.
+///////////////////////////////////////////////////////////////////
+
+=== Changing border style
+
+To change the border of the current client, you can use +border normal+ to use the normal
+border (including window title), +border 1pixel+ to use a 1-pixel border (no window title)
+and +border none+ to make the client borderless.
+
+There is also +border toggle+ which will toggle the different border styles.
+
+*Examples*:
+----------------------------
+bindsym mod+t border normal
+bindsym mod+y border 1pixel
+bindsym mod+u border none
+----------------------------
+
+[[stack-limit]]
+
+///////////////////////////////////////////////////////////////////////////////
+TODO: not yet implemented
+=== Changing the stack-limit of a container
+
+If you have a single container with a lot of windows inside it (say, more than
+10), the default layout of a stacking container can get a little unhandy.
+Depending on your screen’s size, you might end up with only half of the title
+lines being actually used, wasting a lot of screen space.
+
+Using the +stack-limit+ command, you can limit the number of rows or columns
+in a stacking container. i3 will create columns or rows (depending on what
+you limited) automatically as needed.
+
+*Syntax*:
+--------------------------------
+stack-limit <cols|rows> <value>
+--------------------------------
+
+*Examples*:
+-------------------
+# I always want to have two window titles in one line
+stack-limit cols 2
+
+# Not more than 5 rows in this stacking container
+stack-limit rows 5
+-------------------
+
+image:stacklimit.png[Container limited to two columns]
+///////////////////////////////////////////////////////////////////////////////
+
+=== Reloading/Restarting/Exiting
+
+You can make i3 reload its configuration file with +reload+. You can also
+restart i3 inplace with the +restart+ command to get it out of some weird state
+(if that should ever happen) or to perform an upgrade without having to restart
+your X session. To exit i3 properly, you can use the +exit+ command,
+however you don’t need to (simply killing your X session is fine as well).
+
+*Examples*:
+----------------------------
+bindsym mod+Shift+r restart
+bindsym mod+Shift+w reload
+bindsym mod+Shift+e exit
+----------------------------
+
+[[multi_monitor]]
+
+== Multiple monitors
+
+As you can see in the goal list on the website, i3 was specifically developed
+with support for multiple monitors in mind. This section will explain how to
+handle multiple monitors.
+
+When you have only one monitor, things are simple. You usually start with
+workspace 1 on your monitor and open new ones as you need them.
+
+When you have more than one monitor, each monitor will get an initial
+workspace.  The first monitor gets 1, the second gets 2 and a possible third
+would get 3. When you switch to a workspace on a different monitor, i3 will
+switch to that monitor and then switch to the workspace. This way, you don’t
+need shortcuts to switch to a specific monitor, and you don’t need to remember
+where you put which workspace. New workspaces will be opened on the currently
+active monitor.  It is not possible to have a monitor without a workspace.
+
+The idea of making workspaces global is based on the observation that most
+users have a very limited set of workspaces on their additional monitors.
+They are often used for a specific task (browser, shell) or for monitoring
+several things (mail, IRC, syslog, …). Thus, using one workspace on one monitor
+and "the rest" on the other monitors often makes sense. However, as you can
+create an unlimited number of workspaces in i3 and tie them to specific
+screens, you can have the "traditional" approach of having X workspaces per
+screen by changing your configuration (using modes, for example).
+
+=== Configuring your monitors
+
+To help you get going if you have never used multiple monitors before, here is
+a short overview of the xrandr options which will probably be of interest to
+you. It is always useful to get an overview of the current screen configuration.
+Just run "xrandr" and you will get an output like the following:
+-------------------------------------------------------------------------------
+$ xrandr
+Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
+VGA1 disconnected (normal left inverted right x axis y axis)
+LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
+   1280x800       60.0*+   50.0
+   1024x768       85.0     75.0     70.1     60.0
+   832x624        74.6
+   800x600        85.1     72.2     75.0     60.3     56.2
+   640x480        85.0     72.8     75.0     59.9
+   720x400        85.0
+   640x400        85.1
+   640x350        85.1
+--------------------------------------------------------------------------------------
+
+Several things are important here: You can see that +LVDS1+ is connected (of
+course, it is the internal flat panel) but +VGA1+ is not. If you have a monitor
+connected to one of the ports but xrandr still says "disconnected", you should
+check your cable, monitor or graphics driver.
+
+The maximum resolution you can see at the end of the first line is the maximum
+combined resolution of your monitors. By default, it is usually too low and has
+to be increased by editing +/etc/X11/xorg.conf+.
+
+So, say you connected VGA1 and want to use it as an additional screen:
+-------------------------------------------
+xrandr --output VGA1 --auto --left-of LVDS1
+-------------------------------------------
+This command makes xrandr try to find the native resolution of the device
+connected to +VGA1+ and configures it to the left of your internal flat panel.
+When running "xrandr" again, the output looks like this:
+-------------------------------------------------------------------------------
+$ xrandr
+Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
+VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
+   1280x1024      60.0*+   75.0
+   1280x960       60.0
+   1152x864       75.0
+   1024x768       75.1     70.1     60.0
+   832x624        74.6
+   800x600        72.2     75.0     60.3     56.2
+   640x480        72.8     75.0     66.7     60.0
+   720x400        70.1
+LVDS1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 261mm x 163mm
+   1280x800       60.0*+   50.0
+   1024x768       85.0     75.0     70.1     60.0
+   832x624        74.6
+   800x600        85.1     72.2     75.0     60.3     56.2
+   640x480        85.0     72.8     75.0     59.9
+   720x400        85.0
+   640x400        85.1
+   640x350        85.1
+-------------------------------------------------------------------------------
+Please note that i3 uses exactly the same API as xrandr does, so it will see
+only what you can see in xrandr.
+
+See also <<presentations>> for more examples of multi-monitor setups.
+
+=== Interesting configuration for multi-monitor environments
+
+There are several things to configure in i3 which may be interesting if you
+have more than one monitor:
+
+1. You can specify which workspace should be put on which screen. This
+   allows you to have a different set of workspaces when starting than just
+   1 for the first monitor, 2 for the second and so on. See
+   <<workspace_screen>>.
+2. If you want some applications to generally open on the bigger screen
+   (MPlayer, Firefox, …), you can assign them to a specific workspace, see
+   <<assign_workspace>>.
+3. If you have many workspaces on many monitors, it might get hard to keep
+   track of which window you put where. Thus, you can use vim-like marks to
+   quickly switch between windows. See <<vim_like_marks>>.
+
+== i3 and the rest of your software world
+
+=== Displaying a status line
+
+A very common thing amongst users of exotic window managers is a status line at
+some corner of the screen. It is an often superior replacement to the widget
+approach you have in the task bar of a traditional desktop environment.
+
+If you don’t already have your favorite way of generating such a status line
+(self-written scripts, conky, …), then i3status is the recommended tool for
+this task. It was written in C with the goal of using as few syscalls as
+possible to reduce the time your CPU is woken up from sleep states. Because
+i3status only spits out text, you need to combine it with some other tool, like
+i3bar. Use a pipe to connect them: +i3status | i3bar -d+.
+
+Regardless of which application you use to display the status line, you
+want to make sure that it registers as a dock window using EWMH hints. i3 will
+position the window either at the top or at the bottom of the screen, depending
+on which hint the application sets. With i3bar, you can use +-d+ or +-dbottom+
+for positioning it at the bottom and +-dtop+ to position it at the top of the
+screen.
+
+=== Giving presentations (multi-monitor)
+
+When giving a presentation, you typically want the audience to see what you see
+on your screen and then go through a series of slides (if the presentation is
+simple). For more complex presentations, you might want to have some notes
+which only you can see on your screen, while the audience can only see the
+slides.
+
+[[presentations]]
+==== Case 1: everybody gets the same output
+This is the simple case. You connect your computer to the video projector,
+turn on both (computer and video projector) and configure your X server to
+clone the internal flat panel of your computer to the video output:
+-----------------------------------------------------
+xrandr --output VGA1 --mode 1024x768 --same-as LVDS1
+-----------------------------------------------------
+i3 will then use the lowest common subset of screen resolutions, the rest of
+your screen will be left untouched (it will show the X background). So, in
+our example, this would be 1024x768 (my notebook has 1280x800).
+
+==== Case 2: you can see more than your audience
+This case is a bit harder. First of all, you should configure the VGA output
+somewhere near your internal flat panel, say right of it:
+-----------------------------------------------------
+xrandr --output VGA1 --mode 1024x768 --right-of LVDS1
+-----------------------------------------------------
+Now, i3 will put a new workspace (depending on your settings) on the new screen
+and you are in multi-monitor mode (see <<multi_monitor>>).
+
+Because i3 is not a compositing window manager, there is no ability to
+display a window on two screens at the same time. Instead, your presentation
+software needs to do this job (that is, open a window on each screen).
diff --git a/docs/wsbar b/docs/wsbar
new file mode 100644 (file)
index 0000000..9e379dd
--- /dev/null
@@ -0,0 +1,94 @@
+External workspace bars
+=======================
+Michael Stapelberg <michael+i3@stapelberg.de>
+May 2010
+
+This document describes why the internal workspace bar is minimal and how an
+external workspace bar can be used. It explains the concepts using +i3-wsbar+
+as the reference implementation.
+
+== Internal and external bars
+
+The internal workspace bar of i3 is meant to be a reasonable default so that
+you can use i3 without having too much hassle when setting it up. It is quite
+simple and intended to stay this way. So, there is no way to display your own
+information in this bar (unlike dwm, wmii, awesome, …).
+
+We chose not to implement such a mechanism because that would be duplicating
+already existing functionality of tools such as dzen2, xmobar and similar.
+Instead, you should disable the internal bar and use an external workspace bar
+(which communicates with i3 through its IPC interface).
+
+== dock mode
+
+You typically want to see the same workspace bar on every workspace on a
+specific screen. Also, you don’t want to place the workspace bar somewhere
+in your layout by hand. This is where dock mode comes in: When a program sets
+the appropriate hint (_NET_WM_WINDOW_TYPE_DOCK), it will be managed in dock
+mode by i3. That means it will be placed at the bottom of the screen (while
+other edges of the screen are possible in the NetWM standard, this is not yet
+implemented in i3), it will not overlap any other window and it will be on
+every workspace for the specific screen it was placed on initially.
+
+== The IPC interface
+
+In the context of using an external workspace bar, the IPC interface needs to
+provide the bar program with the current workspaces and output (as in VGA-1,
+LVDS-1, …) configuration. In the other direction, the program has to be able
+to switch to specific workspaces.
+
+By default, the IPC interface is enabled and places its UNIX socket in
++~/.i3/ipc.sock+.
+
+To learn more about the protocol which is used for IPC, see +docs/ipc+.
+
+== Output changes (on-the-fly)
+
+i3 implements the RandR API and can handle changing outputs quite well. So, an
+external workspace bar implementation needs to make sure that when you change
+the resolution of any of your screens (or enable/disable an output), the bars
+will be adjusted properly.
+
+== i3-wsbar, the reference implementation
+
+Please keep in mind that +i3-wsbar+ is just a reference implementation. It is
+shipped with i3 to have a reasonable default. Thus, +i3-wsbar+ is designed to
+work well with dzen2 and there are no plans to make it more generic.
+
+=== The big picture
+
+The most common reason to use an external workspace bar is to integrate system
+information such as what +i3status+ provides into the workspace bar (to save
+screen space). So, we have +i3status+ or a similar program, which only provides
+text output (formatted in some way). To display this text nicely on the screen,
+there are programs such as dzen2, xmobar and similar. We will stick to dzen2
+from here on. So, we have the output of i3status, which needs to go into dzen2
+somehow. But we also want to display the list of workspaces. +i3-wsbar+ takes
+input on stdin, combines it with a formatted workspace list and pipes it to
+dzen2.
+
+Please note that +i3-wsbar+ does not print its output to stdout. Instead, it
+launches the dzen2 instances on its own. This is necessary to handle changes
+in the available outputs (to place a new dzen2 on a new screen for example).
+
+image:wsbar.png["Overview",link="wsbar.png"]
+
+=== Running i3-wsbar
+
+The most simple usage of i3-wsbar looks like this:
+-------------------------------
+i3-wsbar -c "dzen2 -x %x -dock"
+-------------------------------
+
+The +%x+ in the command name will be replaced by the X position of the output
+for which this workspace bar is running. i3 will automatically place the
+workspace bar on the correct output when dzen2 is started in dock mode. The
+bar which you will see should look exactly like the internal bar of i3.
+
+To actually get a benefit, you want to give +i3-wsbar+ some input:
+------------------------------------------
+i3status | i3-wsbar -c "dzen2 -x %x -dock"
+------------------------------------------
+
+It is recommended to place the above command in your i3 configuration file
+to start it automatically with i3.
diff --git a/docs/wsbar.dia b/docs/wsbar.dia
new file mode 100644 (file)
index 0000000..d117ce0
Binary files /dev/null and b/docs/wsbar.dia differ
diff --git a/docs/wsbar.png b/docs/wsbar.png
new file mode 100644 (file)
index 0000000..0789dec
Binary files /dev/null and b/docs/wsbar.png differ
diff --git a/dump-asy.pl b/dump-asy.pl
new file mode 100755 (executable)
index 0000000..a8eab04
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+# renders the layout tree using asymptote
+
+use strict;
+use warnings;
+use Data::Dumper;
+use AnyEvent::I3;
+use File::Temp;
+use v5.10;
+
+my $i3 = i3("/tmp/nestedcons");
+
+my $tree = $i3->get_tree->recv;
+
+my $tmp = File::Temp->new(UNLINK => 0, SUFFIX => '.asy');
+
+say $tmp "import drawtree;";
+
+say $tmp "treeLevelStep = 2cm;";
+
+sub dump_node {
+       my ($n, $parent) = @_;
+
+    my $o = ($n->{orientation} eq 'none' ? "u" : ($n->{orientation} eq 'horizontal' ? "h" : "v"));
+    my $w = (defined($n->{window}) ? $n->{window} : "N");
+    my $na = $n->{name};
+    $na =~ s/#/\\#/g;
+    my $name = "($na, $o, $w)";
+
+    print $tmp "TreeNode n" . $n->{id} . " = makeNode(";
+
+    print $tmp "n" . $parent->{id} . ", " if defined($parent);
+    print $tmp "\"" . $name . "\");\n";
+
+       dump_node($_, $n) for @{$n->{nodes}};
+}
+
+dump_node($tree);
+say $tmp "draw(n" . $tree->{id} . ", (0, 0));";
+
+close($tmp);
+my $rep = "$tmp";
+$rep =~ s/asy$/eps/;
+system("cd /tmp && asy $tmp && gv $rep && rm $rep");
diff --git a/gtk-tree-watch.pl b/gtk-tree-watch.pl
new file mode 100755 (executable)
index 0000000..f15d0c1
--- /dev/null
@@ -0,0 +1,219 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+# renders the layout tree using asymptote
+
+use strict;
+use warnings;
+
+use JSON::XS;
+use Data::Dumper;
+use AnyEvent::I3;
+use v5.10;
+
+use Gtk2 '-init';
+use Gtk2::SimpleMenu;
+use Glib qw/TRUE FALSE/;
+
+my $window = Gtk2::Window->new('toplevel');
+$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
+
+my $tree_store = Gtk2::TreeStore->new(qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/);
+
+my $i3 = i3("/tmp/nestedcons");
+
+my $tree_view = Gtk2::TreeView->new($tree_store);
+
+my $layout_box = undef;
+
+sub copy_node {
+    my ($n, $parent, $piter, $pbox) = @_;
+
+    my $o = ($n->{orientation} == 0 ? "u" : ($n->{orientation} == 1 ? "h" : "v"));
+    my $w = (defined($n->{window}) ? $n->{window} : "N");
+
+    # convert a rectangle struct to X11 notation (WxH+X+Y)
+    my $r = $n->{rect};
+    my $x = $r->{x};
+    my $y = $r->{y};
+    my $dim = $r->{width}."x".$r->{height}.($x<0?$x:"+$x").($y<0?$y:"+$y");
+
+    # add node to the tree with all known properties
+    my $iter = $tree_store->append($piter);
+    $tree_store->set($iter, 0 => $n->{name}, 1 => $w, 2 => $o, 3 => sprintf("0x%08x", $n->{id}), 4 => $n->{urgent}, 5 => $n->{focused}, 6 => $n->{layout}, 7 => $dim);
+
+    # also create a box for the node, each node has a vbox
+    # for combining the title (and properties) with the
+    # container itself, the container will be empty in case
+    # of no children, a vbox or hbox
+    my $box;
+    if($n->{orientation} == 1) {
+        $box = Gtk2::HBox->new(1, 5);
+    } else {
+        $box = Gtk2::VBox->new(1, 5);
+    }
+
+    # combine label and container
+    my $node = Gtk2::Frame->new($n->{name}.",".$o.",".$w);
+    $node->set_shadow_type('etched-out');
+    $node->add($box);
+
+    # the parent is added onto a scrolled window, so add it with a viewport
+    if(defined($pbox)) {
+       $pbox->pack_start($node, 1, 1, 0);
+    } else {
+       $layout_box = $node;
+    }
+
+    # recurse into children
+    copy_node($_, $n, $iter, $box) for @{$n->{nodes}};
+
+    # if it is a window draw a nice color
+    if(defined($n->{window})) {
+       # use a drawing area to fill a colored rectangle
+       my $area = Gtk2::DrawingArea->new();
+
+       # the color is stored as hex in the name
+       $area->{"user-data"} = $n->{name};
+
+       $area->signal_connect(expose_event => sub {
+           my ($widget, $event) = @_;
+
+           # fetch a cairo context and it width/height to start drawing nodes
+           my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window());
+
+           my $w = $widget->allocation->width;
+           my $h = $widget->allocation->height;
+
+           my $hc  = $widget->{"user-data"};
+           my $r = hex(substr($hc, 1, 2)) / 255.0;
+           my $g = hex(substr($hc, 3, 2)) / 255.0;
+           my $b = hex(substr($hc, 5, 2)) / 255.0;
+
+           $cr->set_source_rgb($r, $g, $b);
+           $cr->rectangle(0, 0, $w, $h);
+           $cr->fill();
+
+        return FALSE;
+       });
+
+    $box->pack_end($area, 1, 1, 0);
+    }
+}
+
+# Replaced by Gtk2 Boxes:
+#sub draw_node {
+#    my ($n, $cr, $x, $y, $w, $h) = @_;
+#
+#    $cr->set_source_rgb(1.0, 1.0, 1.0);
+#    $cr->rectangle($x, $y, $w/2, $h/2);
+#    $cr->fill();
+#}
+
+my $json_prev = "";
+
+my $layout_sw = Gtk2::ScrolledWindow->new(undef, undef);
+my $layout_container = Gtk2::HBox->new(0, 0);
+$layout_sw->add_with_viewport($layout_container);
+
+sub copy_tree {
+    my $tree = $i3->get_tree->recv;
+
+    # convert the tree back to json so we only rebuild/redraw when the tree is changed
+    my $json = encode_json($tree);
+    if ($json ne $json_prev) {
+        $json_prev = $json;
+
+        # rebuild the tree and the layout
+        $tree_store->clear();
+        if(defined($layout_box)) {
+            $layout_container->remove($layout_box);
+        }
+        copy_node($tree);
+        $layout_container->add($layout_box);
+        $layout_container->show_all();
+
+        # keep things expanded, otherwise the tree collapses every reload which is more annoying then this :-)
+        $tree_view->expand_all();
+    }
+
+    return(TRUE);
+}
+
+sub new_column {
+    my $tree_column = Gtk2::TreeViewColumn->new();
+    $tree_column->set_title(shift);
+
+    my $renderer = Gtk2::CellRendererText->new();
+    $tree_column->pack_start($renderer, FALSE);
+    $tree_column->add_attribute($renderer, text => shift);
+
+    return($tree_column);
+}
+
+my $col = 0;
+$tree_view->append_column(new_column("Name", $col++));
+$tree_view->append_column(new_column("Window", $col++));
+$tree_view->append_column(new_column("Orientation", $col++));
+$tree_view->append_column(new_column("ID", $col++));
+$tree_view->append_column(new_column("Urgent", $col++));
+$tree_view->append_column(new_column("Focused", $col++));
+$tree_view->append_column(new_column("Layout", $col++));
+$tree_view->append_column(new_column("Rect", $col++));
+
+$tree_view->set_grid_lines("both");
+
+my $tree_sw = Gtk2::ScrolledWindow->new(undef, undef);
+$tree_sw->add($tree_view);
+
+# Replaced by Gtk2 Boxes:
+#my $area = Gtk2::DrawingArea->new();
+#$area->signal_connect(expose_event => sub {
+#    my ($widget, $event) = @_;
+#
+#    # fetch a cairo context and it width/height to start drawing nodes
+#    my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window());
+#
+#    my $w = $widget->allocation->width;
+#    my $h = $widget->allocation->height;
+#
+#    draw_node($gtree, $cr, 0, 0, $w, $h);
+#
+#    return FALSE;
+#});
+
+sub menu_export {
+    print("TODO: EXPORT\n");
+}
+
+my $menu_tree = [
+       _File => {
+               item_type => '<Branch>',
+               children => [
+                       _Export => {
+                               callback => \&menu_export,
+                               accelerator => '<ctrl>E',
+                       },
+                       _Quit => {
+                               callback => sub { Gtk2->main_quit; },
+                               accelerator => '<ctrl>Q',
+                       },
+               ],
+       },
+];
+
+my $menu = Gtk2::SimpleMenu->new(menu_tree => $menu_tree);
+
+my $vbox = Gtk2::VBox->new(0, 0);
+$vbox->pack_start($menu->{widget}, 0, 0, 0);
+$vbox->pack_end($tree_sw, 1, 1, 0);
+$vbox->pack_end($layout_sw, 1, 1, 0);
+
+$window->add($vbox);
+$window->show_all();
+$window->set_size_request(500,500);
+
+Glib::Timeout->add(1000, "copy_tree", undef, Glib::G_PRIORITY_DEFAULT);
+copy_tree();
+
+Gtk2->main();
+
diff --git a/i3-config-wizard/Makefile b/i3-config-wizard/Makefile
new file mode 100644 (file)
index 0000000..43c3a1f
--- /dev/null
@@ -0,0 +1,42 @@
+# Default value so one can compile i3-input standalone
+TOPDIR=..
+
+include $(TOPDIR)/common.mk
+
+# Depend on the object files of all source-files in src/*.c and on all header files
+AUTOGENERATED:=cfgparse.tab.c cfgparse.yy.c
+FILES:=$(patsubst %.c,%.o,$(filter-out $(AUTOGENERATED),$(wildcard *.c)))
+HEADERS:=$(wildcard *.h)
+
+# Depend on the specific file (.c for each .o) and on all headers
+%.o: %.c ${HEADERS}
+       echo "CC $<"
+       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+
+all: i3-config-wizard
+
+i3-config-wizard: cfgparse.y.o cfgparse.yy.o ${FILES}
+       echo "LINK i3-config-wizard"
+       $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+cfgparse.yy.o: cfgparse.l cfgparse.y.o ${HEADERS}
+       echo "LEX $<"
+       flex -i -o$(@:.o=.c) $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(@:.o=.c)
+
+cfgparse.y.o: cfgparse.y ${HEADERS}
+       echo "YACC $<"
+       bison --debug --verbose -b $(basename $< .y) -d $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(<:.y=.tab.c)
+
+
+install: all
+       echo "INSTALL"
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/bin
+       $(INSTALL) -m 0755 i3-config-wizard $(DESTDIR)$(PREFIX)/bin/
+
+clean:
+       rm -f *.o cfgparse.tab.{c,h} cfgparse.output cfgparse.yy.c
+
+distclean: clean
+       rm -f i3-config-wizard
diff --git a/i3-config-wizard/atoms.xmacro b/i3-config-wizard/atoms.xmacro
new file mode 100644 (file)
index 0000000..8f94cea
--- /dev/null
@@ -0,0 +1,6 @@
+xmacro(_NET_WM_NAME)
+xmacro(_NET_WM_WINDOW_TYPE)
+xmacro(_NET_WM_WINDOW_TYPE_DIALOG)
+xmacro(ATOM)
+xmacro(CARDINAL)
+xmacro(UTF8_STRING)
diff --git a/i3-config-wizard/cfgparse.l b/i3-config-wizard/cfgparse.l
new file mode 100644 (file)
index 0000000..772b847
--- /dev/null
@@ -0,0 +1,105 @@
+%option nounput
+%option noinput
+%option noyy_top_state
+%option stack
+
+%{
+/*
+ * vim:ts=8:expandtab
+ *
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "cfgparse.tab.h"
+
+int yycolumn = 1;
+
+struct context {
+        int line_number;
+        char *line_copy;
+
+        char *compact_error;
+
+        /* These are the same as in YYLTYPE */
+        int first_column;
+        int last_column;
+};
+
+
+#define YY_DECL int yylex (struct context *context)
+
+#define YY_USER_ACTION { \
+        context->first_column = yycolumn; \
+        context->last_column = yycolumn+yyleng-1; \
+        yycolumn += yyleng; \
+}
+
+%}
+
+EOL    (\r?\n)
+
+%s BINDCODE_COND
+%s BIND_AWS_COND
+%s BIND_A2WS_COND
+%x BUFFER_LINE
+
+%%
+
+       {
+               /* This is called when a new line is lexed. We only want the
+                * first line to match to go into state BUFFER_LINE */
+               if (context->line_number == 0) {
+                       context->line_number = 1;
+                       BEGIN(INITIAL);
+                       yy_push_state(BUFFER_LINE);
+               }
+       }
+
+<BUFFER_LINE>^[^\r\n]*/{EOL}? {
+       /* save whole line */
+       context->line_copy = strdup(yytext);
+
+       yyless(0);
+       yy_pop_state();
+       yy_set_bol(true);
+       yycolumn = 1;
+}
+
+
+<BIND_A2WS_COND>[^\n]+          { BEGIN(INITIAL); yylval.string = strdup(yytext); return STR; }
+[0-9]+                          { yylval.number = atoi(yytext); return NUMBER; }
+bind                            { BEGIN(BINDCODE_COND); return TOKBINDCODE; }
+bindcode                        { BEGIN(BINDCODE_COND); return TOKBINDCODE; }
+Mod1                            { yylval.number = (1 << 3); return MODIFIER; }
+Mod2                            { yylval.number = (1 << 4); return MODIFIER; }
+Mod3                            { yylval.number = (1 << 5); return MODIFIER; }
+Mod4                            { yylval.number = (1 << 6); return MODIFIER; }
+Mod5                            { yylval.number = (1 << 7); return MODIFIER; }
+Mode_switch                     { yylval.number = (1 << 8); return MODIFIER; }
+$mod                           { yylval.number = (1 << 9); return TOKMODVAR; }
+control                         { return TOKCONTROL; }
+ctrl                            { return TOKCONTROL; }
+shift                           { return TOKSHIFT; }
+{EOL}                           {
+                                 if (context->line_copy) {
+                                    free(context->line_copy);
+                                   context->line_copy = NULL;
+                                 }
+                                  context->line_number++;
+                                  BEGIN(INITIAL);
+                                  yy_push_state(BUFFER_LINE);
+                                }
+<BINDCODE_COND>[ \t]+           { BEGIN(BIND_AWS_COND); return WHITESPACE; }
+<BIND_AWS_COND>[ \t]+           { BEGIN(BIND_A2WS_COND); return WHITESPACE; }
+[ \t]+                          { return WHITESPACE; }
+.                               { return (int)yytext[0]; }
+
+<<EOF>> {
+        while (yy_start_stack_ptr > 0)
+                yy_pop_state();
+        yyterminate();
+}
+
+%%
diff --git a/i3-config-wizard/cfgparse.y b/i3-config-wizard/cfgparse.y
new file mode 100644 (file)
index 0000000..018b37b
--- /dev/null
@@ -0,0 +1,161 @@
+%{
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xlib.h>
+
+extern Display *dpy;
+
+struct context {
+        int line_number;
+        char *line_copy;
+
+        char *compact_error;
+
+        /* These are the same as in YYLTYPE */
+        int first_column;
+        int last_column;
+
+        char *result;
+};
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+extern int yylex(struct context *context);
+extern int yyparse(void);
+extern FILE *yyin;
+YY_BUFFER_STATE yy_scan_string(const char *);
+
+static struct context *context;
+
+/* We don’t need yydebug for now, as we got decent error messages using
+ * yyerror(). Should you ever want to extend the parser, it might be handy
+ * to just comment it in again, so it stays here. */
+//int yydebug = 1;
+
+void yyerror(const char *error_message) {
+    fprintf(stderr, "\n");
+    fprintf(stderr, "CONFIG: %s\n", error_message);
+    fprintf(stderr, "CONFIG: line %d:\n",
+        context->line_number);
+    fprintf(stderr, "CONFIG:   %s\n", context->line_copy);
+    fprintf(stderr, "CONFIG:   ");
+    for (int c = 1; c <= context->last_column; c++)
+        if (c >= context->first_column)
+            fprintf(stderr, "^");
+        else fprintf(stderr, " ");
+    fprintf(stderr, "\n");
+    fprintf(stderr, "\n");
+}
+
+int yywrap() {
+    return 1;
+}
+
+char *rewrite_binding(const char *bindingline) {
+    char *result = NULL;
+
+    context = calloc(sizeof(struct context), 1);
+
+    yy_scan_string(bindingline);
+
+    if (yyparse() != 0) {
+        fprintf(stderr, "Could not parse configfile\n");
+        exit(1);
+    }
+
+    result = context->result;
+
+    if (context->line_copy)
+        free(context->line_copy);
+    free(context);
+
+    return result;
+}
+
+/* XXX: does not work for combinations of modifiers yet */
+static char *modifier_to_string(int modifiers) {
+    //printf("should convert %d to string\n", modifiers);
+    if (modifiers == (1 << 3))
+        return strdup("$mod+");
+    else if (modifiers == ((1 << 3) | (1 << 0)))
+        return strdup("$mod+Shift+");
+    else if (modifiers == (1 << 9))
+        return strdup("$mod+");
+    else if (modifiers == ((1 << 9) | (1 << 0)))
+        return strdup("$mod+Shift+");
+    else if (modifiers == (1 << 0))
+        return strdup("Shift+");
+    else return strdup("");
+}
+
+%}
+
+%error-verbose
+%lex-param { struct context *context }
+
+%union {
+    int number;
+    char *string;
+}
+
+%token <number>NUMBER "<number>"
+%token <string>STR "<string>"
+%token TOKBINDCODE
+%token TOKMODVAR "$mod"
+%token MODIFIER "<modifier>"
+%token TOKCONTROL "control"
+%token TOKSHIFT "shift"
+%token WHITESPACE "<whitespace>"
+
+%%
+
+lines: /* empty */
+    | lines WHITESPACE bindcode
+    | lines error
+    | lines bindcode
+    ;
+
+bindcode:
+    TOKBINDCODE WHITESPACE binding_modifiers NUMBER WHITESPACE STR
+    {
+        //printf("\tFound keycode binding mod%d with key %d and command %s\n", $<number>3, $4, $<string>6);
+        int level = 0;
+        if (($<number>3 & (1 << 0))) {
+            /* When shift is included, we really need to use the second-level
+             * symbol (upper-case). The lower-case symbol could be on a
+             * different key than the upper-case one (unlikely for letters, but
+             * more likely for special characters). */
+            level = 1;
+        }
+        KeySym sym = XKeycodeToKeysym(dpy, $4, level);
+        char *str = XKeysymToString(sym);
+        char *modifiers = modifier_to_string($<number>3);
+        // TODO: modifier to string
+        asprintf(&(context->result), "bindsym %s%s %s\n", modifiers, str, $<string>6);
+        free(modifiers);
+    }
+    ;
+
+binding_modifiers:
+    /* NULL */                               { $<number>$ = 0; }
+    | binding_modifier
+    | binding_modifiers '+' binding_modifier { $<number>$ = $<number>1 | $<number>3; }
+    | binding_modifiers '+'                  { $<number>$ = $<number>1; }
+    ;
+
+binding_modifier:
+    MODIFIER        { $<number>$ = $<number>1; }
+    | TOKMODVAR     { $<number>$ = $<number>1; }
+    | TOKCONTROL    { $<number>$ = (1 << 2); }
+    | TOKSHIFT      { $<number>$ = (1 << 0); }
+    ;
diff --git a/i3-config-wizard/ipc.c b/i3-config-wizard/ipc.c
new file mode 100644 (file)
index 0000000..597a86e
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <err.h>
+
+/*
+ * Formats a message (payload) of the given size and type and sends it to i3 via
+ * the given socket file descriptor.
+ *
+ */
+void ipc_send_message(int sockfd, uint32_t message_size,
+                      uint32_t message_type, uint8_t *payload) {
+        int buffer_size = strlen("i3-ipc") + sizeof(uint32_t) + sizeof(uint32_t) + message_size;
+        char msg[buffer_size];
+        char *walk = msg;
+
+        strcpy(walk, "i3-ipc");
+        walk += strlen("i3-ipc");
+        memcpy(walk, &message_size, sizeof(uint32_t));
+        walk += sizeof(uint32_t);
+        memcpy(walk, &message_type, sizeof(uint32_t));
+        walk += sizeof(uint32_t);
+        memcpy(walk, payload, message_size);
+
+        int sent_bytes = 0;
+        int bytes_to_go = buffer_size;
+        while (sent_bytes < bytes_to_go) {
+                int n = write(sockfd, msg + sent_bytes, bytes_to_go);
+                if (n == -1)
+                        err(EXIT_FAILURE, "write() failed");
+
+                sent_bytes += n;
+                bytes_to_go -= n;
+        }
+}
+
+/*
+ * Connects to the i3 IPC socket and returns the file descriptor for the
+ * socket. die()s if anything goes wrong.
+ *
+ */
+int connect_ipc(char *socket_path) {
+       int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
+        if (sockfd == -1)
+                err(EXIT_FAILURE, "Could not create socket");
+
+        struct sockaddr_un addr;
+        memset(&addr, 0, sizeof(struct sockaddr_un));
+        addr.sun_family = AF_LOCAL;
+        strcpy(addr.sun_path, socket_path);
+        if (connect(sockfd, (const struct sockaddr*)&addr, sizeof(struct sockaddr_un)) < 0)
+                err(EXIT_FAILURE, "Could not connect to i3");
+
+       return sockfd;
+}
diff --git a/i3-config-wizard/ipc.h b/i3-config-wizard/ipc.h
new file mode 100644 (file)
index 0000000..c40c909
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _IPC_H
+#define _IPC_H
+
+void ipc_send_message(int sockfd, uint32_t message_size,
+                      uint32_t message_type, uint8_t *payload);
+
+int connect_ipc(char *socket_path);
+
+#endif
diff --git a/i3-config-wizard/main.c b/i3-config-wizard/main.c
new file mode 100644 (file)
index 0000000..d3a2672
--- /dev/null
@@ -0,0 +1,546 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * i3-config-wizard: Program to convert configs using keycodes to configs using
+ * keysyms.
+ *
+ */
+#include <ev.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <err.h>
+#include <stdint.h>
+#include <getopt.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <glob.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_event.h>
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+
+/* We need SYSCONFDIR for the path to the keycode config template, so raise an
+ * error if it’s not defined for whatever reason */
+#ifndef SYSCONFDIR
+#error "SYSCONFDIR not defined"
+#endif
+
+#define FREE(pointer) do { \
+    if (pointer != NULL) { \
+        free(pointer); \
+        pointer = NULL; \
+    } \
+} \
+while (0)
+
+#include "xcb.h"
+#include "ipc.h"
+
+enum { STEP_WELCOME, STEP_GENERATE } current_step = STEP_WELCOME;
+enum { MOD_ALT, MOD_SUPER } modifier = MOD_SUPER;
+
+static char *config_path;
+static xcb_connection_t *conn;
+static uint32_t font_id;
+static uint32_t font_bold_id;
+static char *socket_path;
+static int font_height;
+static int font_bold_height;
+static xcb_window_t win;
+static xcb_pixmap_t pixmap;
+static xcb_gcontext_t pixmap_gc;
+static xcb_key_symbols_t *symbols;
+xcb_window_t root;
+Display *dpy;
+
+char *rewrite_binding(const char *bindingline);
+static void finish();
+
+#if defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Returns a pointer to a new string which is a duplicate of the
+ * string, but only copies at most n characters.
+ *
+ */
+char *strndup(const char *str, size_t n) {
+    size_t len;
+    char *copy;
+
+    for (len = 0; len < n && str[len]; len++)
+        continue;
+
+    if ((copy = malloc(len + 1)) == NULL)
+        return (NULL);
+    memcpy(copy, str, len);
+    copy[len] = '\0';
+    return (copy);
+}
+
+#endif
+
+/*
+ * This function resolves ~ in pathnames.
+ * It may resolve wildcards in the first part of the path, but if no match
+ * or multiple matches are found, it just returns a copy of path as given.
+ *
+ */
+static char *resolve_tilde(const char *path) {
+    static glob_t globbuf;
+    char *head, *tail, *result;
+
+    tail = strchr(path, '/');
+    head = strndup(path, tail ? tail - path : strlen(path));
+
+    int res = glob(head, GLOB_TILDE, NULL, &globbuf);
+    free(head);
+    /* no match, or many wildcard matches are bad */
+    if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1)
+        result = strdup(path);
+    else if (res != 0) {
+        err(1, "glob() failed");
+    } else {
+        head = globbuf.gl_pathv[0];
+        result = calloc(1, strlen(head) + (tail ? strlen(tail) : 0) + 1);
+        strncpy(result, head, strlen(head));
+        if (tail)
+            strncat(result, tail, strlen(tail));
+    }
+    globfree(&globbuf);
+
+    return result;
+}
+
+/*
+ * Try to get the socket path from X11 and return NULL if it doesn’t work.
+ * As i3-msg is a short-running tool, we don’t bother with cleaning up the
+ * connection and leave it up to the operating system on exit.
+ *
+ */
+static char *socket_path_from_x11() {
+    xcb_connection_t *conn;
+    int screen;
+    if ((conn = xcb_connect(NULL, &screen)) == NULL ||
+        xcb_connection_has_error(conn))
+        return NULL;
+    xcb_screen_t *root_screen = xcb_aux_get_screen(conn, screen);
+    xcb_window_t root = root_screen->root;
+
+    xcb_intern_atom_cookie_t atom_cookie;
+    xcb_intern_atom_reply_t *atom_reply;
+
+    atom_cookie = xcb_intern_atom(conn, 0, strlen("I3_SOCKET_PATH"), "I3_SOCKET_PATH");
+    atom_reply = xcb_intern_atom_reply(conn, atom_cookie, NULL);
+    if (atom_reply == NULL)
+        return NULL;
+
+    xcb_get_property_cookie_t prop_cookie;
+    xcb_get_property_reply_t *prop_reply;
+    prop_cookie = xcb_get_property_unchecked(conn, false, root, atom_reply->atom,
+                                             XCB_GET_PROPERTY_TYPE_ANY, 0, PATH_MAX);
+    prop_reply = xcb_get_property_reply(conn, prop_cookie, NULL);
+    if (prop_reply == NULL || xcb_get_property_value_length(prop_reply) == 0)
+        return NULL;
+    if (asprintf(&socket_path, "%.*s", xcb_get_property_value_length(prop_reply),
+                 (char*)xcb_get_property_value(prop_reply)) == -1)
+        return NULL;
+    return socket_path;
+}
+
+/*
+ * Handles expose events, that is, draws the window contents.
+ *
+ */
+static int handle_expose() {
+    /* re-draw the background */
+    xcb_rectangle_t border = {0, 0, 300, (15*font_height) + 8};
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#000000"));
+    xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &border);
+
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_id);
+
+#define txt(x, row, text) xcb_image_text_8(conn, strlen(text), pixmap, pixmap_gc, x, (row * font_height) + 2, text)
+
+    if (current_step == STEP_WELCOME) {
+        /* restore font color */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#FFFFFF"));
+
+        txt(10, 2, "You have not configured i3 yet.");
+        txt(10, 3, "Do you want me to generate ~/.i3/config?");
+        txt(85, 5, "Yes, generate ~/.i3/config");
+        txt(85, 7, "No, I will use the defaults");
+
+        /* green */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#00FF00"));
+        txt(25, 5, "<Enter>");
+
+        /* red */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#FF0000"));
+        txt(31, 7, "<ESC>");
+    }
+
+    if (current_step == STEP_GENERATE) {
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#FFFFFF"));
+
+        txt(10, 2, "Please choose either:");
+        txt(85, 4, "Win as default modifier");
+        txt(85, 5, "Alt as default modifier");
+        txt(10, 7, "Afterwards, press");
+        txt(85, 9, "to write ~/.i3/config");
+        txt(85, 10, "to abort");
+
+        /* the not-selected modifier */
+        if (modifier == MOD_SUPER)
+            txt(31, 5, "<Alt>");
+        else txt(31, 4, "<Win>");
+
+        /* the selected modifier */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_bold_id);
+        if (modifier == MOD_SUPER)
+            txt(31, 4, "<Win>");
+        else txt(31, 5, "<Alt>");
+
+        /* green */
+        uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_FONT;
+        uint32_t values[] = { get_colorpixel(conn, "#00FF00"), font_id };
+        xcb_change_gc(conn, pixmap_gc, mask, values);
+
+        txt(25, 9, "<Enter>");
+
+        /* red */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#FF0000"));
+        txt(31, 10, "<ESC>");
+    }
+
+    /* Copy the contents of the pixmap to the real window */
+    xcb_copy_area(conn, pixmap, win, pixmap_gc, 0, 0, 0, 0, /* */ 500, 500);
+    xcb_flush(conn);
+
+    return 1;
+}
+
+static int handle_key_press(void *ignored, xcb_connection_t *conn, xcb_key_press_event_t *event) {
+    printf("Keypress %d, state raw = %d\n", event->detail, event->state);
+
+    /* Remove the numlock bit, all other bits are modifiers we can bind to */
+    uint16_t state_filtered = event->state & ~(xcb_numlock_mask | XCB_MOD_MASK_LOCK);
+    /* Only use the lower 8 bits of the state (modifier masks) so that mouse
+     * button masks are filtered out */
+    state_filtered &= 0xFF;
+
+    xcb_keysym_t sym = xcb_key_press_lookup_keysym(symbols, event, state_filtered);
+
+    printf("sym = %c (%d)\n", sym, sym);
+
+    if (sym == XK_Return || sym == XK_KP_Enter) {
+        if (current_step == STEP_WELCOME) {
+            current_step = STEP_GENERATE;
+            /* Set window title */
+            xcb_change_property(conn,
+                XCB_PROP_MODE_REPLACE,
+                win,
+                A__NET_WM_NAME,
+                A_UTF8_STRING,
+                8,
+                strlen("i3: generate config"),
+                "i3: generate config");
+            xcb_flush(conn);
+        }
+        else finish();
+    }
+
+    /* cancel any time */
+    if (sym == XK_Escape)
+        exit(0);
+
+    if (sym == XK_Alt_L)
+        modifier = MOD_ALT;
+
+    if (sym == XK_Super_L)
+        modifier = MOD_SUPER;
+
+    handle_expose();
+    return 1;
+}
+
+/*
+ * Creates the config file and tells i3 to reload.
+ *
+ */
+static void finish() {
+    printf("creating \"%s\"...\n", config_path);
+
+    if (!(dpy = XOpenDisplay(NULL)))
+        errx(1, "Could not connect to X11");
+
+    FILE *kc_config = fopen(SYSCONFDIR "/i3/config.keycodes", "r");
+    if (kc_config == NULL)
+        err(1, "Could not open input file \"%s\"", SYSCONFDIR "/i3/config.keycodes");
+
+    FILE *ks_config = fopen(config_path, "w");
+    if (ks_config == NULL)
+        err(1, "Could not open output config file \"%s\"", config_path);
+
+    char *line = NULL;
+    size_t len = 0;
+#if !defined(__APPLE__)
+    ssize_t read;
+#endif
+    bool head_of_file = true;
+
+    /* write a header about auto-generation to the output file */
+    fputs("# This file has been auto-generated by i3-config-wizard(1).\n", ks_config);
+    fputs("# It will not be overwritten, so edit it as you like.\n", ks_config);
+    fputs("#\n", ks_config);
+    fputs("# Should you change your keyboard layout somewhen, delete\n", ks_config);
+    fputs("# this file and re-run i3-config-wizard(1).\n", ks_config);
+    fputs("#\n", ks_config);
+
+#if defined(__APPLE__)
+    while ((line = fgetln(kc_config, &len)) != NULL) {
+#else
+    while ((read = getline(&line, &len, kc_config)) != -1) {
+#endif
+        /* skip the warning block at the beginning of the input file */
+        if (head_of_file &&
+            strncmp("# WARNING", line, strlen("# WARNING")) == 0)
+            continue;
+
+        head_of_file = false;
+
+        /* Skip leading whitespace */
+        char *walk = line;
+        while (isspace(*walk) && walk < (line + len))
+            walk++;
+
+        /* Set the modifier the user chose */
+        if (strncmp(walk, "set $mod ", strlen("set $mod ")) == 0) {
+            if (modifier == MOD_ALT)
+                fputs("set $mod Mod1\n", ks_config);
+            else fputs("set $mod Mod4\n", ks_config);
+            continue;
+        }
+
+        /* Check for 'bindcode'. If it’s not a bindcode line, we
+         * just copy it to the output file */
+        if (strncmp(walk, "bindcode", strlen("bindcode")) != 0) {
+            fputs(line, ks_config);
+            continue;
+        }
+        char *result = rewrite_binding(walk);
+        fputs(result, ks_config);
+        free(result);
+    }
+
+    /* sync to do our best in order to have the file really stored on disk */
+    fflush(ks_config);
+    fsync(fileno(ks_config));
+
+    free(line);
+    fclose(kc_config);
+    fclose(ks_config);
+
+    /* tell i3 to reload the config file */
+    int sockfd = connect_ipc(socket_path);
+    ipc_send_message(sockfd, strlen("reload"), 0, (uint8_t*)"reload");
+    close(sockfd);
+
+    exit(0);
+}
+
+int main(int argc, char *argv[]) {
+    config_path = resolve_tilde("~/.i3/config");
+    socket_path = getenv("I3SOCK");
+    char *pattern = "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+    char *patternbold = "-misc-fixed-bold-r-normal--13-120-75-75-C-70-iso10646-1";
+    int o, option_index = 0;
+
+    static struct option long_options[] = {
+        {"socket", required_argument, 0, 's'},
+        {"version", no_argument, 0, 'v'},
+        {"limit", required_argument, 0, 'l'},
+        {"prompt", required_argument, 0, 'P'},
+        {"prefix", required_argument, 0, 'p'},
+        {"font", required_argument, 0, 'f'},
+        {"help", no_argument, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    char *options_string = "s:vh";
+
+    while ((o = getopt_long(argc, argv, options_string, long_options, &option_index)) != -1) {
+        switch (o) {
+            case 's':
+                FREE(socket_path);
+                socket_path = strdup(optarg);
+                break;
+            case 'v':
+                printf("i3-config-wizard " I3_VERSION "\n");
+                return 0;
+            case 'h':
+                printf("i3-config-wizard " I3_VERSION "\n");
+                printf("i3-config-wizard [-s <socket>] [-v]\n");
+                return 0;
+        }
+    }
+
+    /* Check if the destination config file does not exist but the path is
+     * writable. If not, exit now, this program is not useful in that case. */
+    struct stat stbuf;
+    if (stat(config_path, &stbuf) == 0) {
+        printf("The config file \"%s\" already exists. Exiting.\n", config_path);
+        return 0;
+    }
+
+    /* Create ~/.i3 if it does not yet exist */
+    char *config_dir = resolve_tilde("~/.i3");
+    if (stat(config_dir, &stbuf) != 0)
+        if (mkdir(config_dir, 0755) == -1)
+            err(1, "mkdir(%s) failed", config_dir);
+    free(config_dir);
+
+    int fd;
+    if ((fd = open(config_path, O_CREAT | O_RDWR, 0644)) == -1) {
+        printf("Cannot open file \"%s\" for writing: %s. Exiting.\n", config_path, strerror(errno));
+        return 0;
+    }
+    close(fd);
+    unlink(config_path);
+
+    if (socket_path == NULL)
+        socket_path = socket_path_from_x11();
+
+    if (socket_path == NULL)
+        socket_path = "/tmp/i3-ipc.sock";
+
+    int screens;
+    if ((conn = xcb_connect(NULL, &screens)) == NULL ||
+        xcb_connection_has_error(conn))
+        errx(1, "Cannot open display\n");
+
+    /* Place requests for the atoms we need as soon as possible */
+    #define xmacro(atom) \
+        xcb_intern_atom_cookie_t atom ## _cookie = xcb_intern_atom(conn, 0, strlen(#atom), #atom);
+    #include "atoms.xmacro"
+    #undef xmacro
+
+    xcb_screen_t *root_screen = xcb_aux_get_screen(conn, screens);
+    root = root_screen->root;
+
+    xcb_get_numlock_mask(conn);
+
+    symbols = xcb_key_symbols_alloc(conn);
+
+    font_id = get_font_id(conn, pattern, &font_height);
+    font_bold_id = get_font_id(conn, patternbold, &font_bold_height);
+
+    /* Open an input window */
+    win = open_input_window(conn, 300, 205);
+
+    /* Setup NetWM atoms */
+    #define xmacro(name) \
+        do { \
+            xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(conn, name ## _cookie, NULL); \
+            if (!reply) \
+                errx(EXIT_FAILURE, "Could not get atom " # name "\n"); \
+            \
+            A_ ## name = reply->atom; \
+            free(reply); \
+        } while (0);
+    #include "atoms.xmacro"
+    #undef xmacro
+
+    /* Set dock mode */
+    xcb_change_property(conn,
+        XCB_PROP_MODE_REPLACE,
+        win,
+        A__NET_WM_WINDOW_TYPE,
+        A_ATOM,
+        32,
+        1,
+        (unsigned char*) &A__NET_WM_WINDOW_TYPE_DIALOG);
+
+    /* Set window title */
+    xcb_change_property(conn,
+        XCB_PROP_MODE_REPLACE,
+        win,
+        A__NET_WM_NAME,
+        A_UTF8_STRING,
+        8,
+        strlen("i3: first configuration"),
+        "i3: first configuration");
+
+    /* Create pixmap */
+    pixmap = xcb_generate_id(conn);
+    pixmap_gc = xcb_generate_id(conn);
+    xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, 500, 500);
+    xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
+
+    /* Grab the keyboard to get all input */
+    xcb_flush(conn);
+
+    /* Try (repeatedly, if necessary) to grab the keyboard. We might not
+     * get the keyboard at the first attempt because of the keybinding
+     * still being active when started via a wm’s keybinding. */
+    xcb_grab_keyboard_cookie_t cookie;
+    xcb_grab_keyboard_reply_t *reply = NULL;
+
+    int count = 0;
+    while ((reply == NULL || reply->status != XCB_GRAB_STATUS_SUCCESS) && (count++ < 500)) {
+        cookie = xcb_grab_keyboard(conn, false, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+        reply = xcb_grab_keyboard_reply(conn, cookie, NULL);
+        usleep(1000);
+    }
+
+    if (reply->status != XCB_GRAB_STATUS_SUCCESS) {
+        fprintf(stderr, "Could not grab keyboard, status = %d\n", reply->status);
+        exit(-1);
+    }
+
+    xcb_flush(conn);
+
+    xcb_generic_event_t *event;
+    while ((event = xcb_wait_for_event(conn)) != NULL) {
+        if (event->response_type == 0) {
+            fprintf(stderr, "X11 Error received! sequence %x\n", event->sequence);
+            continue;
+        }
+
+        /* Strip off the highest bit (set if the event is generated) */
+        int type = (event->response_type & 0x7F);
+
+        switch (type) {
+            case XCB_KEY_PRESS:
+                handle_key_press(NULL, conn, (xcb_key_press_event_t*)event);
+                break;
+
+            /* TODO: handle mappingnotify */
+
+            case XCB_EXPOSE:
+                handle_expose();
+                break;
+        }
+
+        free(event);
+    }
+
+    return 0;
+}
diff --git a/i3-config-wizard/xcb.c b/i3-config-wizard/xcb.c
new file mode 100644 (file)
index 0000000..d1753d1
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <err.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/keysym.h>
+
+#include "xcb.h"
+
+extern xcb_window_t root;
+unsigned int xcb_numlock_mask;
+
+/*
+ * Convenience-wrapper around xcb_change_gc which saves us declaring a variable
+ *
+ */
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value) {
+        xcb_change_gc(conn, gc, mask, &value);
+}
+
+/*
+ * Returns the colorpixel to use for the given hex color (think of HTML).
+ *
+ * The hex_color has to start with #, for example #FF00FF.
+ *
+ * NOTE that get_colorpixel() does _NOT_ check the given color code for validity.
+ * This has to be done by the caller.
+ *
+ */
+uint32_t get_colorpixel(xcb_connection_t *conn, char *hex) {
+        char strgroups[3][3] = {{hex[1], hex[2], '\0'},
+                                {hex[3], hex[4], '\0'},
+                                {hex[5], hex[6], '\0'}};
+        uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)),
+                             (strtol(strgroups[1], NULL, 16)),
+                             (strtol(strgroups[2], NULL, 16))};
+
+        return (rgb16[0] << 16) + (rgb16[1] << 8) + rgb16[2];
+}
+
+/*
+ * Returns the mask for Mode_switch (to be used for looking up keysymbols by
+ * keycode).
+ *
+ */
+uint32_t get_mod_mask(xcb_connection_t *conn, uint32_t keycode) {
+       xcb_key_symbols_t *symbols = xcb_key_symbols_alloc(conn);
+
+       xcb_get_modifier_mapping_reply_t *modmap_r;
+       xcb_keycode_t *modmap, kc;
+       xcb_keycode_t *modeswitchcodes = xcb_key_symbols_get_keycode(symbols, keycode);
+       if (modeswitchcodes == NULL)
+               return 0;
+
+       modmap_r = xcb_get_modifier_mapping_reply(conn, xcb_get_modifier_mapping(conn), NULL);
+       modmap = xcb_get_modifier_mapping_keycodes(modmap_r);
+
+       for (int i = 0; i < 8; i++)
+               for (int j = 0; j < modmap_r->keycodes_per_modifier; j++) {
+                       kc = modmap[i * modmap_r->keycodes_per_modifier + j];
+                       for (xcb_keycode_t *ktest = modeswitchcodes; *ktest; ktest++) {
+                               if (*ktest != kc)
+                                       continue;
+
+                               free(modeswitchcodes);
+                               free(modmap_r);
+                               return (1 << i);
+                       }
+               }
+
+       return 0;
+}
+
+/*
+ * Opens the window we use for input/output and maps it
+ *
+ */
+xcb_window_t open_input_window(xcb_connection_t *conn, uint32_t width, uint32_t height) {
+        xcb_window_t win = xcb_generate_id(conn);
+        //xcb_cursor_t cursor_id = xcb_generate_id(conn);
+
+#if 0
+        /* Use the default cursor (left pointer) */
+        if (cursor > -1) {
+                i3Font *cursor_font = load_font(conn, "cursor");
+                xcb_create_glyph_cursor(conn, cursor_id, cursor_font->id, cursor_font->id,
+                                XCB_CURSOR_LEFT_PTR, XCB_CURSOR_LEFT_PTR + 1,
+                                0, 0, 0, 65535, 65535, 65535);
+        }
+#endif
+
+        uint32_t mask = 0;
+        uint32_t values[3];
+
+        mask |= XCB_CW_BACK_PIXEL;
+        values[0] = 0;
+
+       mask |= XCB_CW_EVENT_MASK;
+       values[1] = XCB_EVENT_MASK_EXPOSURE;
+
+        xcb_create_window(conn,
+                          XCB_COPY_FROM_PARENT,
+                          win, /* the window id */
+                          root, /* parent == root */
+                          490, 297, width, height, /* dimensions */
+                          0, /* border = 0, we draw our own */
+                          XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                          XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
+                          mask,
+                          values);
+
+#if 0
+        if (cursor > -1)
+                xcb_change_window_attributes(conn, result, XCB_CW_CURSOR, &cursor_id);
+#endif
+
+        /* Map the window (= make it visible) */
+        xcb_map_window(conn, win);
+
+       return win;
+}
+
+/*
+ * Returns the ID of the font matching the given pattern and stores the height
+ * of the font (in pixels) in *font_height. die()s if no font matches.
+ *
+ */
+int get_font_id(xcb_connection_t *conn, char *pattern, int *font_height) {
+        xcb_void_cookie_t font_cookie;
+        xcb_list_fonts_with_info_cookie_t info_cookie;
+
+        /* Send all our requests first */
+        int result;
+        result = xcb_generate_id(conn);
+        font_cookie = xcb_open_font_checked(conn, result, strlen(pattern), pattern);
+        info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
+
+        xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
+        if (error != NULL) {
+                fprintf(stderr, "ERROR: Could not open font: %d\n", error->error_code);
+                exit(1);
+        }
+
+        /* Get information (height/name) for this font */
+        xcb_list_fonts_with_info_reply_t *reply = xcb_list_fonts_with_info_reply(conn, info_cookie, NULL);
+        if (reply == NULL)
+                errx(1, "Could not load font \"%s\"\n", pattern);
+
+        *font_height = reply->font_ascent + reply->font_descent;
+
+        return result;
+}
+
+/*
+ * Finds out which modifier mask is the one for numlock, as the user may change this.
+ *
+ */
+void xcb_get_numlock_mask(xcb_connection_t *conn) {
+    xcb_key_symbols_t *keysyms;
+    xcb_get_modifier_mapping_cookie_t cookie;
+    xcb_get_modifier_mapping_reply_t *reply;
+    xcb_keycode_t *modmap;
+    int mask, i;
+    const int masks[8] = { XCB_MOD_MASK_SHIFT,
+                           XCB_MOD_MASK_LOCK,
+                           XCB_MOD_MASK_CONTROL,
+                           XCB_MOD_MASK_1,
+                           XCB_MOD_MASK_2,
+                           XCB_MOD_MASK_3,
+                           XCB_MOD_MASK_4,
+                           XCB_MOD_MASK_5 };
+
+    /* Request the modifier map */
+    cookie = xcb_get_modifier_mapping_unchecked(conn);
+
+    /* Get the keysymbols */
+    keysyms = xcb_key_symbols_alloc(conn);
+
+    if ((reply = xcb_get_modifier_mapping_reply(conn, cookie, NULL)) == NULL) {
+        xcb_key_symbols_free(keysyms);
+        return;
+    }
+
+    modmap = xcb_get_modifier_mapping_keycodes(reply);
+
+    /* Get the keycode for numlock */
+#ifdef OLD_XCB_KEYSYMS_API
+    xcb_keycode_t numlock = xcb_key_symbols_get_keycode(keysyms, XCB_NUM_LOCK);
+#else
+    /* For now, we only use the first keysymbol. */
+    xcb_keycode_t *numlock_syms = xcb_key_symbols_get_keycode(keysyms, XCB_NUM_LOCK);
+    if (numlock_syms == NULL)
+        return;
+    xcb_keycode_t numlock = *numlock_syms;
+    free(numlock_syms);
+#endif
+
+    /* Check all modifiers (Mod1-Mod5, Shift, Control, Lock) */
+    for (mask = 0; mask < 8; mask++)
+        for (i = 0; i < reply->keycodes_per_modifier; i++)
+            if (modmap[(mask * reply->keycodes_per_modifier) + i] == numlock)
+                xcb_numlock_mask = masks[mask];
+
+    xcb_key_symbols_free(keysyms);
+    free(reply);
+}
+
diff --git a/i3-config-wizard/xcb.h b/i3-config-wizard/xcb.h
new file mode 100644 (file)
index 0000000..40aeec8
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef _XCB_H
+#define _XCB_H
+
+/* from X11/keysymdef.h */
+#define XCB_NUM_LOCK                    0xff7f
+
+#define xmacro(atom) xcb_atom_t A_ ## atom;
+#include "atoms.xmacro"
+#undef xmacro
+
+extern unsigned int xcb_numlock_mask;
+
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value);
+uint32_t get_colorpixel(xcb_connection_t *conn, char *hex);
+uint32_t get_mod_mask(xcb_connection_t *conn, uint32_t keycode);
+xcb_window_t open_input_window(xcb_connection_t *conn, uint32_t width, uint32_t height);
+int get_font_id(xcb_connection_t *conn, char *pattern, int *font_height);
+/**
+ * Finds out which modifier mask is the one for numlock, as the user may change this.
+ *
+ */
+void xcb_get_numlock_mask(xcb_connection_t *conn);
+
+#endif
diff --git a/i3-input/Makefile b/i3-input/Makefile
new file mode 100644 (file)
index 0000000..45653da
--- /dev/null
@@ -0,0 +1,30 @@
+# Default value so one can compile i3-input standalone
+TOPDIR=..
+
+include $(TOPDIR)/common.mk
+
+# Depend on the object files of all source-files in src/*.c and on all header files
+FILES=$(patsubst %.c,%.o,$(wildcard *.c))
+HEADERS=$(wildcard *.h)
+
+# Depend on the specific file (.c for each .o) and on all headers
+%.o: %.c ${HEADERS}
+       echo "CC $<"
+       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+
+all: i3-input
+
+i3-input: ${FILES}
+       echo "LINK i3-input"
+       $(CC) $(LDFLAGS) -o $@ ${FILES} $(LIBS)
+
+install: all
+       echo "INSTALL"
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/bin
+       $(INSTALL) -m 0755 i3-input $(DESTDIR)$(PREFIX)/bin/
+
+clean:
+       rm -f *.o
+
+distclean: clean
+       rm -f i3-input
diff --git a/i3-input/UnicodeData.txt b/i3-input/UnicodeData.txt
new file mode 100644 (file)
index 0000000..77db788
--- /dev/null
@@ -0,0 +1,19336 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;;
+0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;;
+0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;;
+0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;;
+0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
+0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;;
+0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
+0007;<control>;Cc;0;BN;;;;;N;BELL;;;;
+0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;;
+0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;
+000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;
+000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;;
+000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;;
+0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
+0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
+0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
+0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
+0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
+0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
+0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
+0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
+0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;;
+0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
+001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
+001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;;
+001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;;
+001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
+001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;;
+001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;;
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+007F;<control>;Cc;0;BN;;;;;N;DELETE;;;;
+0080;<control>;Cc;0;BN;;;;;N;;;;;
+0081;<control>;Cc;0;BN;;;;;N;;;;;
+0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
+0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
+0084;<control>;Cc;0;BN;;;;;N;;;;;
+0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;;
+0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
+0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
+0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
+0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
+008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
+008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;;
+008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
+008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
+008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
+0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
+0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
+0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
+0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
+0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
+0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
+0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
+0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
+0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;;
+0099;<control>;Cc;0;BN;;;;;N;;;;;
+009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
+009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
+009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
+009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
+009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
+009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;So;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;;
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;;
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;;
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;;
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;;
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;;
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia, Tonos;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
+0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
+0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
+0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
+0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
+0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
+0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
+036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
+036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
+036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
+036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
+036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
+036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
+0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
+0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
+0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
+0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
+0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
+0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
+03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9;
+03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
+03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
+03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
+048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
+04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
+04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
+04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
+0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
+0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
+0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
+0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
+0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
+0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
+0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
+0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
+0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
+0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
+050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
+050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
+050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
+050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
+050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
+050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
+0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
+0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
+0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
+0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
+0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
+051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
+051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
+051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
+051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
+051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
+051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
+0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
+0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
+0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
+0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
+05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
+0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
+0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
+0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
+0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
+0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
+0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
+0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
+061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
+066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;;
+076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;;
+077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;;
+0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
+0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
+0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
+0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
+0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;;
+0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;;
+0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;;
+0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;;
+0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;;
+0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;;
+0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;;
+0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;;
+0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;;
+0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;;
+0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;;
+0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;;
+1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;;
+1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;;
+103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;;
+103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;;
+103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;;
+105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;;
+105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;;
+105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;;
+105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;;
+105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;;
+1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;;
+1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;;
+1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;;
+1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;;
+1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;;
+1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;;
+1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;;
+1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;;
+1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;;
+106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;;
+106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;;
+106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;;
+106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;;
+106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;;
+106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;;
+1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;;
+1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;;
+1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;;
+1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;;
+1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;;
+1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;;
+1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;;
+1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;;
+1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;;
+1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;;
+107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;;
+107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;;
+107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;;
+107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;;
+107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;;
+107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;;
+1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;;
+1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;;
+1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;;
+1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;;
+1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;;
+1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;;
+1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;;
+1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;;
+108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;;
+108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;;
+108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;;
+108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;;
+108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;;
+108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;;
+1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;;
+109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
+10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;;
+13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
+13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
+13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
+13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;;
+13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;;
+13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;;
+13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;;
+13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;;
+13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;;
+13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;;
+13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;;
+13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;;
+13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;;
+13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;;
+13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;;
+13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;;
+13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;;
+13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;;
+13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;;
+13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;;
+13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;;
+13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;;
+13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;;
+13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;;
+13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;;
+13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;;
+13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;;
+13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;;
+13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;;
+13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;;
+13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;;
+13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;;
+13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;;
+13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;;
+13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;;
+13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;;
+13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;;
+13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;;
+13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;;
+13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;;
+13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;;
+13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;;
+13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;;
+13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;;
+13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;;
+13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;;
+13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;;
+13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;;
+13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;;
+13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;;
+13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;;
+13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;;
+13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;;
+13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;;
+13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;;
+13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;;
+13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;;
+13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;;
+13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;;
+13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;;
+13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;;
+13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;;
+13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;;
+13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;;
+13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;;
+13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;;
+13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;;
+13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;;
+13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;;
+13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;;
+13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;;
+13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;;
+13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;;
+13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;;
+13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;;
+13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;;
+13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;;
+13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;;
+13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;;
+13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;;
+13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;;
+13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;;
+13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;;
+13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;;
+13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;;
+1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;;
+1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;;
+1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;;
+1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;;
+1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;;
+1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;;
+1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;;
+1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;;
+1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;;
+1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;;
+170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
+170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
+170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
+170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
+1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
+1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;;
+1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
+1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
+1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
+1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;;
+1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;;
+1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;;
+1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;;
+1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;;
+1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;;
+172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;;
+172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;;
+172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;;
+172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;;
+172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;;
+172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;;
+1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;;
+1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
+1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
+1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;;
+1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;;
+1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;;
+1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;;
+1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;;
+1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;;
+1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;;
+1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;;
+1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;;
+174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;;
+174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;;
+174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;;
+174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;;
+174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;;
+174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;;
+1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;;
+1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;;
+1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;;
+1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;;
+1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;;
+1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;;
+1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;;
+1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;;
+1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;;
+1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;;
+176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;;
+176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;;
+176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;;
+176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;;
+176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;;
+1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;;
+1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;*;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;*;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Cf;0;L;;;;;N;;*;;;
+17B5;KHMER VOWEL INHERENT AA;Cf;0;L;;;;;N;;*;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;*;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;*;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;;
+1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;;
+1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
+1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
+1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
+1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;;
+1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;;
+1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;;
+1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;;
+1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;;
+1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;;
+1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;;
+1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;;
+1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;;
+1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;;
+1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;;
+1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;;
+1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;;
+1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;;
+1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;;
+1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;;
+1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;;
+1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;;
+1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;;
+1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;;
+1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;;
+1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;;
+1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;;
+1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;;
+1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;;
+1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;;
+1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;;
+1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;;
+1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;;
+1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;;
+1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;;
+1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;;
+1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;;
+1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;;
+1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;;
+1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;;
+1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;;
+1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;;
+1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;;
+1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;;
+1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;;
+1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;;
+1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;;
+1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;;
+1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;;
+1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;;
+1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;;
+1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;;
+1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;;
+1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;;
+1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;;
+1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;;
+1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;;
+1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;;
+1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;;
+1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;;
+1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;;
+1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;;
+1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;;
+1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;;
+1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;;
+1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;;
+1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;;
+1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;;
+1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;;
+1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;;
+1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;;
+1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;;
+1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;;
+1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;;
+1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;;
+1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;;
+1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;;
+1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;;
+1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;;
+1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;;
+1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;;
+1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;;
+1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;;
+1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;;
+1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;;
+1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;;
+1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;;
+1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;;
+1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;;
+1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;;
+1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;;
+1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;;
+1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;;
+1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;;
+1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;;
+1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;;
+1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;;
+1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;;
+1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;;
+1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;;
+1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;;
+1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;;
+1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;;
+1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;;
+1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;;
+1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;;
+1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;;
+1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;;
+1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;;
+1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;;
+1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;;
+1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;;
+1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;;
+1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;;
+1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;;
+1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;;
+1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;;
+1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;;
+1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF;
+1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;;
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB;
+1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA
+1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD;
+1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC
+1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF;
+1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;;
+204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
+2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
+2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
+205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
+2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
+2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
+2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;;
+2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
+20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
+20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;;
+20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
+20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;;
+2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;;
+2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;;
+2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
+214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;;
+2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;;
+2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;;
+2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;;
+22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;;
+23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
+23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
+23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;;
+23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;;
+23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;;
+23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;;
+23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;;
+23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;;
+23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;;
+23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;;
+23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
+23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
+23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;;
+24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
+24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
+24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
+24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;;
+24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;;
+24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;;
+24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;;
+24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;;
+24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;;
+24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;;
+24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;;
+24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;;
+24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;;
+24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;;
+24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;;
+24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;;
+24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
+24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
+24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;;
+2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;;
+2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;;
+2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;;
+259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
+2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;pete;;;
+2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;hdpe;;;
+2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;pvc;;;
+2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;ldpe;;;
+2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;pp;;;
+2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;ps;;;
+2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;other;;;
+267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;;
+267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
+2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
+2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
+2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
+2683;DIE FACE-4;So;0;ON;;;;;N;;;;;
+2684;DIE FACE-5;So;0;ON;;;;;N;;;;;
+2685;DIE FACE-6;So;0;ON;;;;;N;;;;;
+2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;;
+2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
+2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;So;0;ON;;;;;N;;;;;
+26B3;CERES;So;0;ON;;;;;N;;;;;
+26B4;PALLAS;So;0;ON;;;;;N;;;;;
+26B5;JUNO;So;0;ON;;;;;N;;;;;
+26B6;VESTA;So;0;ON;;;;;N;;;;;
+26B7;CHIRON;So;0;ON;;;;;N;;;;;
+26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;;
+26B9;SEXTILE;So;0;ON;;;;;N;;;;;
+26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;;
+26BB;QUINCUNX;So;0;ON;;;;;N;;;;;
+26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;;
+26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;;
+27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
+27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
+27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
+27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;;
+27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;;
+27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;;
+27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;;
+27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;;
+27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;;
+27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
+2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;;
+2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;;
+2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;;
+2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;;
+2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;;
+293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;;
+293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;;
+2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;;
+297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;;
+2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;;
+2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;;
+2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;;
+2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;;
+2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;;
+2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;;
+2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;;
+2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;;
+298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;;
+298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;;
+298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;;
+298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;;
+298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;;
+298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;;
+2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;;
+2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;;
+2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;;
+2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;;
+299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;;
+299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;;
+299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;;
+299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
+299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;;
+29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;;
+29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;;
+29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;;
+29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;;
+29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;;
+29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;;
+29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;;
+29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;;
+29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;;
+29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;;
+29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;;
+29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;;
+29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;;
+29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;;
+29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;;
+29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;;
+29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;;
+29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;;
+29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;;
+29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;;
+29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;;
+29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;;
+29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;;
+29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;;
+29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;;
+29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+29FE;TINY;Sm;0;ON;;;;;N;;;;;
+29FF;MINY;Sm;0;ON;;;;;N;;;;;
+2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;;
+2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;;
+2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;;
+2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;;
+2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;;
+2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;;
+2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;;
+2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;;
+2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;;
+2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;;
+2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;;
+2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;;
+2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1D;JOIN;Sm;0;ON;;;;;N;;;;;
+2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;;
+2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;;
+2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;;
+2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;;
+2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;;
+2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;;
+2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;;
+2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;;
+2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;;
+2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;;
+2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;;
+2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;;
+2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;;
+2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;;
+2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;;
+2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;;
+2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;;
+2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;;
+2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;;
+2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;;
+2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;;
+2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;;
+2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;;
+2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;;
+2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;not independent;;;
+2ADD;NONFORKING;Sm;0;ON;;;;;N;;independent;;;
+2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;;
+2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;;
+2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;;
+2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;;
+2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;;
+2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;;
+2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;;
+2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;;
+2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;;
+2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;;
+2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;;
+2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;;
+2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;;
+2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251;
+2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271;
+2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250;
+2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;;
+2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73;
+2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;;
+2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;;
+2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;;
+2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;;
+2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;;
+2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;;
+2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;;
+2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;;
+2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;;
+2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;;
+2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;;
+2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;;
+2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;;
+2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;;
+2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;;
+2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;;
+2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;;
+2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;;
+2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;;
+2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;;
+2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;;
+2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;;
+2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;;
+2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;;
+2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;;
+2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;;
+2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;;
+2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;;
+2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;;
+2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;;
+2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;;
+2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;;
+2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;;
+2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;;
+2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;;
+2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;;
+2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;;
+2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;;
+2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;;
+2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;;
+2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;;
+2E30;RING POINT;Po;0;ON;;;;;N;;;;;
+2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
+2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
+2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+303C;MASU MARK;Lo;0;L;;;;;N;;;;;
+303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;;
+30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
+31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
+31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31D0;CJK STROKE H;So;0;ON;;;;;N;;;;;
+31D1;CJK STROKE S;So;0;ON;;;;;N;;;;;
+31D2;CJK STROKE P;So;0;ON;;;;;N;;;;;
+31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;;
+31D4;CJK STROKE D;So;0;ON;;;;;N;;;;;
+31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;;
+31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;;
+31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;;
+31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;;
+31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;;
+31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;;
+31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;;
+31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;;
+31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;;
+31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;;
+31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;;
+31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;;
+31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;;
+31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;;
+31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;;
+31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
+31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
+31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
+31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;;
+31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;;
+31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;;
+31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;;
+31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;;
+31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;;
+31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;;
+31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;;
+31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;;
+31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;;
+31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;;
+31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;;
+31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
+3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
+3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
+3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
+3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;;
+3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;;
+3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;;
+3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;;
+3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;;
+3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;;
+325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;;
+325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;;
+325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;;
+325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;;
+325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;;
+325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;;
+32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;;
+32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;;
+32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;;
+32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;;
+32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;;
+32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;;
+32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;;
+32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;;
+32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;;
+32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;;
+32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;;
+32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;;
+32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;;
+32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
+3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
+4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
+4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
+4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
+4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
+4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FC3;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
+A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;;
+A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;;
+A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;;
+A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;;
+A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;;
+A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;;
+A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;;
+A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;;
+A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;;
+A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;;
+A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;;
+A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;;
+A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;;
+A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;;
+A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;;
+A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;;
+A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;;
+A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;;
+A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;;
+A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;;
+A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;;
+A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;;
+A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;;
+A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;;
+A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;;
+A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;;
+A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;;
+A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;;
+A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;;
+A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;;
+A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;;
+A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;;
+A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;;
+A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;;
+A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;;
+A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;;
+A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;;
+A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;;
+A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;;
+A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;;
+A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;;
+A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;;
+A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;;
+A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;;
+A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;;
+A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;;
+A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;;
+A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;;
+A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;;
+A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;;
+A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;;
+A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;;
+A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;;
+A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;;
+A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;;
+A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;;
+A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;;
+A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;;
+A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;;
+A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;;
+A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;;
+A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;;
+A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;;
+A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;;
+A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;;
+A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;;
+A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;;
+A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;;
+A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;;
+A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;;
+A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;;
+A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;;
+A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;;
+A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;;
+A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;;
+A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;;
+A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;;
+A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;;
+A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;;
+A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;;
+A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;;
+A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;;
+A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;;
+A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;;
+A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;;
+A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;;
+A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;;
+A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;;
+A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;;
+A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;;
+A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;;
+A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;;
+A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;;
+A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;;
+A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;;
+A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;;
+A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;;
+A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;;
+A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;;
+A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;;
+A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;;
+A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;;
+A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;;
+A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;;
+A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+A60D;VAI COMMA;Po;0;ON;;;;;N;;;;;
+A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;;
+A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;;
+A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;;
+A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;;
+A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;;
+A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;;
+A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;;
+A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;;
+A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;;
+A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;;
+A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;;
+A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;;
+A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;;
+A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;;
+A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;;
+A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;;
+A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;;
+A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;;
+A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;;
+A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;;
+A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
+A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
+A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643;
+A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642
+A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645;
+A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644
+A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647;
+A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646
+A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649;
+A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648
+A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B;
+A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A
+A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D;
+A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C
+A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
+A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E
+A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651;
+A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650
+A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653;
+A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652
+A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655;
+A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654
+A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657;
+A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656
+A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659;
+A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658
+A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B;
+A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A
+A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D;
+A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C
+A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F;
+A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
+A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663;
+A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662
+A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665;
+A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664
+A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667;
+A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666
+A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669;
+A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668
+A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B;
+A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A
+A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D;
+A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C
+A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;;
+A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;;
+A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;;
+A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;;
+A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;;
+A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;;
+A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;;
+A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681;
+A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680
+A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683;
+A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682
+A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685;
+A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684
+A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687;
+A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686
+A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689;
+A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688
+A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B;
+A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A
+A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D;
+A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C
+A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F;
+A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E
+A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691;
+A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690
+A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693;
+A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692
+A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695;
+A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694
+A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697;
+A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;;
+A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;;
+A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723;
+A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722
+A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725;
+A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724
+A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727;
+A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726
+A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729;
+A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728
+A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B;
+A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A
+A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D;
+A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C
+A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F;
+A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E
+A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;;
+A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;;
+A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733;
+A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732
+A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735;
+A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734
+A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737;
+A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736
+A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739;
+A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738
+A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B;
+A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A
+A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D;
+A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C
+A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F;
+A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E
+A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741;
+A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740
+A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743;
+A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742
+A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745;
+A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744
+A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747;
+A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746
+A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749;
+A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748
+A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B;
+A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A
+A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D;
+A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C
+A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F;
+A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E
+A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751;
+A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750
+A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753;
+A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752
+A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755;
+A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754
+A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757;
+A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756
+A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759;
+A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758
+A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B;
+A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A
+A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D;
+A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C
+A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F;
+A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E
+A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761;
+A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760
+A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763;
+A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762
+A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765;
+A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764
+A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767;
+A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766
+A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769;
+A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768
+A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B;
+A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A
+A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D;
+A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C
+A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F;
+A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E
+A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;;
+A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;;
+A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;;
+A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;;
+A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;;
+A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;;
+A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;;
+A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;;
+A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;;
+A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A;
+A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779
+A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C;
+A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B
+A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79;
+A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F;
+A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E
+A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781;
+A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780
+A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783;
+A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782
+A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785;
+A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784
+A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787;
+A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786
+A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;;
+A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;;
+A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;;
+A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C;
+A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B
+A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;;
+A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;;
+A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;;
+A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;;
+A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
+A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
+A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
+A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;;
+A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;;
+A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;;
+A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;;
+A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;;
+A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;;
+A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;;
+A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;;
+A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;;
+A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;;
+A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;;
+A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;;
+A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;;
+A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;;
+A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;;
+A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;;
+A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;;
+A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;;
+A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;;
+A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;;
+A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;;
+A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;;
+A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;;
+A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;;
+A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;;
+A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;;
+A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;;
+A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;;
+A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;;
+A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;;
+A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;;
+A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;;
+A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;;
+A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;;
+A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;;
+A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;;
+A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;;
+A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;;
+A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;;
+A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;;
+A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;;
+A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;;
+A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;;
+A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;;
+A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;;
+A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;;
+A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;;
+A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;;
+A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;;
+A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;;
+A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;;
+A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;;
+A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;;
+A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;;
+A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;;
+A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;;
+A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;;
+A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;;
+A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;;
+A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;;
+A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;;
+A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;;
+A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;;
+A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;;
+A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;;
+A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;;
+A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;;
+A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;;
+A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;;
+A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;;
+A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;;
+A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;;
+A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;;
+A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;;
+A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;;
+A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;;
+A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;;
+A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;;
+A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;;
+A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;;
+A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;;
+A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;;
+A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;;
+A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;;
+A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;;
+A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;;
+A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;;
+A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;;
+A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;;
+A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;;
+A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;;
+A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;;
+A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;;
+A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;;
+A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;;
+AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;;
+AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;;
+AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;;
+AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;;
+AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;;
+AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;;
+AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;;
+AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;;
+AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;;
+AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;;
+AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;;
+AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;;
+AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;;
+AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;;
+AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;;
+AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;;
+AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;;
+AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;;
+AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;;
+AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;;
+AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;;
+AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;;
+AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;;
+AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;;
+AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;;
+AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;;
+AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;;
+AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;;
+AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+E000;<Private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;;
+FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;;
+FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;;
+FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;;
+FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;;
+FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;;
+FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;;
+FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;;
+FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;;
+FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;;
+FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;;
+FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;;
+FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;;
+FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;;
+FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;;
+FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;;
+FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;;
+FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;;
+FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;;
+FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;;
+FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;;
+FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;;
+FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;;
+FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;;
+FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;;
+FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;;
+FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;;
+FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;;
+FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;;
+FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;;
+FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;;
+FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;;
+FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;;
+FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;;
+FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;;
+FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;;
+FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;;
+FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;;
+FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;;
+FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;;
+FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;;
+FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;;
+FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;;
+FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;;
+FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;;
+FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;;
+FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;;
+FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;;
+FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;;
+FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;;
+FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;;
+FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;;
+FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;;
+FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;;
+FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;;
+FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;;
+FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
+FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
+FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
+FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
+FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
+FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;;
+FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;;
+FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;;
+FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;;
+FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;;
+FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;;
+FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;;
+FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;;
+FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;;
+FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;;
+FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
+FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
+FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;*;;;
+FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;*;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;;
+10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;;
+10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;;
+10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;;
+10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;;
+10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;;
+10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;;
+10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;;
+1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;;
+1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;;
+101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;;
+101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;;
+101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;;
+101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;;
+101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;;
+101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;;
+101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;;
+101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;;
+101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;;
+101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;;
+101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;;
+101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;;
+101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;;
+101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;;
+101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;;
+101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;;
+101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;;
+101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;;
+101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;;
+101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;;
+101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;;
+101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;;
+101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;;
+101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;;
+101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;;
+101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;;
+101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;;
+101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;;
+101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;;
+101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;;
+101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;;
+101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;;
+101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;;
+101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;;
+101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;;
+101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;;
+101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;;
+101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;;
+101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;;
+101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;;
+101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;;
+101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;;
+101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;;
+101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;;
+101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;;
+101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;;
+10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;;
+10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;;
+10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;;
+10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;;
+10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;;
+10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;;
+10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;;
+10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;;
+10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;;
+10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;;
+1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;;
+1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;;
+1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;;
+1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;;
+10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;;
+10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;;
+10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;;
+10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;;
+10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;;
+10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;;
+10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;;
+10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;;
+1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;;
+1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;;
+1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;;
+102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;;
+102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;;
+102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;;
+102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;;
+102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;;
+102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;;
+102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;;
+102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;;
+102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;;
+102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;;
+102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;;
+102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;;
+102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;;
+102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;;
+102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;;
+102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;;
+102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;;
+102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;;
+102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;;
+102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;;
+102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;;
+102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;;
+102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;;
+102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;;
+102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;;
+102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;;
+102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;;
+102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;;
+102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;;
+102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;;
+102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;;
+102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;;
+102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;;
+102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;;
+102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;;
+102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;;
+102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;;
+102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;;
+102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;;
+102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;;
+102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;;
+102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;;
+102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;;
+102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;;
+10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
+10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
+10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
+10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;;
+10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;;
+10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;;
+10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;;
+10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;;
+10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;;
+10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;;
+1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;;
+1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;;
+1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;;
+1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;;
+1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;;
+1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;;
+10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;;
+10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;;
+10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;;
+10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;;
+10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;;
+10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;;
+10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;;
+10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;;
+10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;;
+10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;;
+1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;;
+1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;;
+1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;;
+1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;;
+10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;;
+10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
+10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
+10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
+10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
+10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;;
+10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;;
+10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;;
+10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;;
+10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;;
+10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;;
+10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;;
+1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;;
+1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;;
+1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;;
+1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;;
+1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
+1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
+10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
+10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
+10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
+10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
+10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;;
+10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;;
+10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
+10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
+10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
+10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
+10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
+10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
+10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B;
+10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C;
+10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D;
+10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E;
+10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F;
+10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430;
+10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431;
+1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432;
+1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433;
+1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434;
+1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435;
+1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436;
+1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437;
+10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438;
+10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439;
+10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A;
+10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B;
+10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C;
+10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D;
+10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E;
+10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F;
+10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440;
+10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441;
+1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442;
+1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443;
+1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444;
+1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445;
+1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446;
+1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447;
+10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448;
+10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449;
+10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A;
+10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
+10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
+10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
+10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
+10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
+1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
+1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403
+1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404
+1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405
+1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406
+1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407
+10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408
+10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409
+10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A
+10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B
+10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C
+10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D
+10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E
+10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F
+10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410
+10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411
+1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412
+1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413
+1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414
+1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415
+1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416
+1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417
+10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418
+10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419
+10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A
+10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B
+10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C
+10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D
+10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E
+10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F
+10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420
+10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421
+1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422
+1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
+1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
+1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;;
+10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;;
+10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;;
+10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;;
+10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;;
+10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;;
+10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;;
+10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;;
+10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;;
+10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;;
+1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;;
+1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;;
+1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;;
+1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;;
+1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;;
+1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;;
+10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;;
+10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;;
+10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;;
+10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;;
+10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;;
+10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;;
+10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;;
+10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;;
+10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;;
+1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
+1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
+1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
+1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
+1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;;
+1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;;
+1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;;
+1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;;
+1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;;
+1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;;
+1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;;
+1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;;
+1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;;
+1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;;
+1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;;
+1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;;
+1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;;
+1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;;
+1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;;
+1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;;
+1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;;
+1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;;
+1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;;
+1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;;
+1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;;
+1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;;
+1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;;
+1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;;
+1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;;
+1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;;
+1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;;
+1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;;
+1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;;
+1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;;
+1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;;
+1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;;
+1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;;
+1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;;
+1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;;
+1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;;
+1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;;
+1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;;
+1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;;
+1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;;
+1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;;
+1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;;
+1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;;
+1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;;
+1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;;
+1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;;
+1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;;
+1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;;
+1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;;
+1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;;
+1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;;
+1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;;
+1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;;
+1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;;
+1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;;
+1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;;
+1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;;
+1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;;
+1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;;
+1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;;
+1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;;
+1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;;
+1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;;
+1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;;
+1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;;
+1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;;
+1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;;
+1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;;
+1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;;
+1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;;
+1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;;
+1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;;
+1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;;
+1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;;
+1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;;
+1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;;
+1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;;
+1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;;
+1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;;
+1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;;
+1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;;
+1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;;
+1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;;
+1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;;
+1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;;
+1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;;
+1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;;
+1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;;
+1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;;
+1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;;
+1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;;
+1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;;
+1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;;
+1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;;
+1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;;
+1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;;
+1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;;
+1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;;
+1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;;
+1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;;
+1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;;
+1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;;
+1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;;
+1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;;
+1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;;
+1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;;
+1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;;
+1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;;
+1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;;
+1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;;
+1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;;
+1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;;
+1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;;
+1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;;
+1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;;
+1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;;
+1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;;
+1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;;
+1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;;
+1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;;
+1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;;
+1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;;
+1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;;
+1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;;
+1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;;
+1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;;
+1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;;
+1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;;
+1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;;
+1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;;
+1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;;
+1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;;
+1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;;
+1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;;
+1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;;
+1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;;
+1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;;
+1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;;
+1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;;
+1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;;
+1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;;
+1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;;
+1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;;
+1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;;
+1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;;
+1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;;
+1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;;
+1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;;
+1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;;
+1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;;
+1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;;
+1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;;
+1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;;
+1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;;
+1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;;
+1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;;
+1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;;
+1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;;
+1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;;
+1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;;
+1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;;
+1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;;
+1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;;
+1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;;
+1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;;
+1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;;
+1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;;
+1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;;
+1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;;
+1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;;
+1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;;
+1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;;
+1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;;
+1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;;
+1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;;
+1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;;
+1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;;
+1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;;
+1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;;
+1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;;
+1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;;
+1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;;
+1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;;
+1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;;
+1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;;
+1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;;
+1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;;
+1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;;
+1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;;
+1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;;
+1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;;
+1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;;
+1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;;
+1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;;
+1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;;
+1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;;
+1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;;
+1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;;
+1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;;
+1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;;
+1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;;
+1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;;
+1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;;
+1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;;
+1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
+1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;;
+1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
+1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
+1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
+1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;;
+1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;;
+1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;;
+1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;;
+1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;;
+1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;;
+1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;;
+1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;;
+1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;;
+1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;;
+1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;;
+1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;;
+1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;;
+1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;;
+1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;;
+1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;;
+1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;;
+1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;;
+1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;;
+1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;;
+1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;;
+1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;;
+1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;;
+1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;;
+1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;;
+1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;;
+1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;;
+1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;;
+1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;;
+1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;;
+1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;;
+1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;;
+1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;;
+1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;;
+1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;;
+1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;;
+1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;;
+1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;;
+1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;;
+1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;;
+1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;;
+1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;;
+1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;;
+1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;;
+1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;;
+1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;;
+1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;;
+1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;;
+1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;;
+1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;;
+1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;;
+1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;;
+1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;;
+1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;;
+1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;;
+1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;;
+1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;;
+1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;;
+1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;;
+1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;;
+1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;;
+1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;;
+1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;;
+1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;;
+1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;;
+1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;;
+1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;;
+1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;;
+1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;;
+1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;;
+1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;;
+1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;;
+1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;;
+1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;;
+1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;;
+1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;;
+1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;;
+1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;;
+1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;;
+1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;;
+1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;;
+1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;;
+1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;;
+1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;;
+1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;;
+1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;;
+1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;;
+1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;;
+1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;;
+1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;;
+1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;;
+1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;;
+1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;;
+1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;;
+1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;;
+1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;;
+1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;;
+1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;;
+1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;;
+1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;;
+1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;;
+1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;;
+1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;;
+1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;;
+1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;;
+1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;;
+1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;;
+1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;;
+1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;;
+1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;;
+1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;;
+1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;;
+1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;;
+1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;;
+1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;;
+1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;;
+1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;;
+1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;;
+1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;;
+1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;;
+1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;;
+1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;;
+1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;;
+1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;;
+1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;;
+1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;;
+1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;;
+1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;;
+1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;;
+1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;;
+1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;;
+1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;;
+1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
+1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
+1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
+1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;;
+1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;;
+1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;;
+1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;;
+1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;;
+1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;;
+1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;;
+1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;;
+1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;;
+1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;;
+1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;;
+1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;;
+1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;;
+1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;;
+1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;;
+1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;;
+1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;;
+1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;;
+1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;;
+1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;;
+1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;;
+1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;;
+1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;;
+1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;;
+1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;;
+1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;;
+1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;;
+1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;;
+1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;;
+1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;;
+1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;;
+1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;;
+1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;;
+1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;;
+1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;;
+1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;;
+1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;;
+1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;;
+1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;;
+1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;;
+1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;;
+1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;;
+1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;;
+1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;;
+1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;;
+1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;;
+1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;;
+1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;;
+1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;;
+1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;;
+1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;;
+1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;;
+1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;;
+1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;;
+1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;;
+1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;;
+1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;;
+1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;;
+1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;;
+1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;;
+1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;;
+1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;;
+1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;;
+1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;;
+1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;;
+1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;;
+1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;;
+1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;;
+1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;;
+1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;;
+1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;;
+1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;;
+1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;;
+1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;;
+1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;;
+1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;;
+1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;;
+1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;;
+1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;;
+1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;;
+1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;;
+1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;;
+1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;;
+1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;;
+1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;;
+1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;;
+1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;;
+1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;;
+1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;;
+1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;;
+1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;;
+1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;;
+1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;;
+1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;;
+1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;;
+1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;;
+1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;;
+1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;;
+1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;;
+1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;;
+1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;;
+1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;;
+1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;;
+1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;;
+1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;;
+1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;;
+1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;;
+1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;;
+1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;;
+1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;;
+1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;;
+1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;;
+1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;;
+1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;;
+1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;;
+1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;;
+1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;;
+20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
+2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
+2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
+2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
+2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
+2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;;
+2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;;
+2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;;
+2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;;
+2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;;
+2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;;
+2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;;
+2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;;
+2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;;
+2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;;
+2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;;
+2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;;
+2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;;
+2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;;
+2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;;
+2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;;
+2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;;
+2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;;
+2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;;
+2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;;
+2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;;
+2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;;
+2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;;
+2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;;
+2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;;
+2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;;
+2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;;
+2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;;
+2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;;
+2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;;
+2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;;
+2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;;
+2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;;
+2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;;
+2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;;
+2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;;
+2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;;
+2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;;
+2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;;
+2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;;
+2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;;
+2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;;
+2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;;
+2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;;
+2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;;
+2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;;
+2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;;
+2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;;
+2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;;
+2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;;
+2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;;
+2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;;
+2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;;
+2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;;
+2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;;
+2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;;
+2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;;
+2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;;
+2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;;
+2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;;
+2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;;
+2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;;
+2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;;
+2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;;
+2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;;
+2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;;
+2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;;
+2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;;
+2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;;
+2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;;
+2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;;
+2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;;
+2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;;
+2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;;
+2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;;
+2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;;
+2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;;
+2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;;
+2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;;
+2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;;
+2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;;
+2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;;
+2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;;
+2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;;
+2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;;
+2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;;
+2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;;
+2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;;
+2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;;
+2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;;
+2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;;
+2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;;
+2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;;
+2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;;
+2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;;
+2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;;
+2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;;
+2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;;
+2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
+2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
+2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
+2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
+2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
+2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
+2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;;
+2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;;
+2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;;
+2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;;
+2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;;
+2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
+2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
+2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
+2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
+2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
+2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
+2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;;
+2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;;
+2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;;
+2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;;
+2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;;
+2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;;
+2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;;
+2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;;
+2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;;
+2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;;
+2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;;
+2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;;
+2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;;
+2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;;
+2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;;
+2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;;
+2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;;
+2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;;
+2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;;
+2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;;
+2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;;
+2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
+2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
+2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;;
+2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
+2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
+2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
+2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;;
+2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;;
+2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;;
+2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;;
+2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;;
+2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;;
+2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;;
+2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;;
+2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;;
+2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;;
+2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;;
+2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;;
+2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;;
+2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;;
+2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;;
+2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;;
+2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;;
+2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;;
+2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;;
+2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;;
+2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;;
+2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;;
+2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;;
+2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;;
+2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;;
+2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;;
+2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;;
+2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;;
+2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;;
+2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;;
+2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;;
+2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;;
+2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;;
+2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;;
+2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;;
+2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;;
+2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;;
+2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;;
+2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;;
+2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;;
+2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;;
+2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;;
+2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;;
+2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;;
+2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;;
+2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;;
+2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;;
+2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;;
+2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;;
+2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;;
+2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;;
+2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;;
+2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;;
+2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;;
+2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;;
+2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;;
+2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;;
+2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;;
+2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;;
+2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;;
+2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;;
+2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;;
+2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;;
+2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;;
+2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;;
+2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;;
+2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;;
+2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;;
+2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;;
+2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;;
+2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;;
+2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;;
+2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;;
+2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;;
+2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;;
+2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;;
+2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;;
+2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;;
+2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;;
+2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;;
+2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;;
+2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;;
+2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;;
+2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;;
+2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;;
+2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;;
+2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;;
+2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;;
+2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;;
+2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;;
+2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;;
+2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;;
+2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;;
+2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;;
+2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;;
+2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;;
+2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;;
+2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;;
+2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;;
+2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;;
+2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;;
+2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;;
+2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;;
+2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;;
+2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;;
+2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;;
+2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;;
+2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;;
+2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;;
+2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;;
+2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;;
+2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;;
+2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;;
+2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;;
+2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;;
+2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;;
+2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;;
+2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;;
+2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;;
+2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;;
+2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;;
+2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;;
+2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;;
+2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;;
+2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;;
+2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;;
+2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;;
+2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;;
+2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;;
+2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;;
+2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;;
+2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;;
+2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;;
+2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;;
+2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;;
+2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;;
+2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
+2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
+2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
+2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
+2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
+2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;;
+2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;;
+2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;;
+2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/i3-input/convmap.pl b/i3-input/convmap.pl
new file mode 100755 (executable)
index 0000000..da34b8a
--- /dev/null
@@ -0,0 +1,178 @@
+#!/usr/bin/perl
+# Generate keysym2ucs.c file
+#
+# $XFree86: xc/programs/xterm/unicode/convmap.pl,v 1.5 2000/01/24 22:22:05 dawes Exp $
+
+sub utf8 ($) {
+    my $c = shift(@_);
+
+    if ($c < 0x80) {
+        return sprintf("%c", $c);
+    } elsif ($c < 0x800) {
+        return sprintf("%c%c", 0xc0 | ($c >> 6), 0x80 | ($c & 0x3f));
+    } elsif ($c < 0x10000) {
+        return sprintf("%c%c%c",
+                       0xe0 |  ($c >> 12),
+                       0x80 | (($c >>  6) & 0x3f),
+                       0x80 | ( $c        & 0x3f));
+    } elsif ($c < 0x200000) {
+        return sprintf("%c%c%c%c",
+                       0xf0 |  ($c >> 18),
+                       0x80 | (($c >> 12) & 0x3f),
+                       0x80 | (($c >>  6) & 0x3f),
+                       0x80 | ( $c        & 0x3f));
+    } elsif ($c < 0x4000000) {
+        return sprintf("%c%c%c%c%c",
+                       0xf8 |  ($c >> 24),
+                       0x80 | (($c >> 18) & 0x3f),
+                       0x80 | (($c >> 12) & 0x3f),
+                       0x80 | (($c >>  6) & 0x3f),
+                       0x80 | ( $c        & 0x3f));
+
+    } elsif ($c < 0x80000000) {
+        return sprintf("%c%c%c%c%c%c",
+                       0xfe |  ($c >> 30),
+                       0x80 | (($c >> 24) & 0x3f),
+                       0x80 | (($c >> 18) & 0x3f),
+                       0x80 | (($c >> 12) & 0x3f),
+                       0x80 | (($c >> 6)  & 0x3f),
+                       0x80 | ( $c        & 0x3f));
+    } else {
+        return utf8(0xfffd);
+    }
+}
+
+$unicodedata = "UnicodeData.txt";
+
+# read list of all Unicode names
+if (!open(UDATA, $unicodedata) && !open(UDATA, "$unicodedata")) {
+    die ("Can't open Unicode database '$unicodedata':\n$!\n\n" .
+         "Please make sure that you have downloaded the file\n" .
+         "ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData-Latest.txt\n");
+}
+while (<UDATA>) {
+    if (/^([0-9,A-F]{4});([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*)$/) {
+        $name{hex($1)} = $2;
+    } else {
+           next;
+        die("Syntax error in line '$_' in file '$unicodedata'");
+    }
+}
+close(UDATA);
+
+# read mapping (from http://wsinwp07.win.tue.nl:1234/unicode/keysym.map)
+open(LIST, "<keysym.map") || die ("Can't open map file:\n$!\n");
+while (<LIST>) {
+    if (/^0x([0-9a-f]{4})\s+U([0-9a-f]{4})\s*(\#.*)?$/){
+        $keysym = hex($1);
+        $ucs = hex($2);
+        $keysym_to_ucs{$keysym} = $ucs;
+    } elsif (/^\s*\#/ || /^\s*$/) {
+    } else {
+        die("Syntax error in 'list' in line\n$_\n");
+    }
+}
+close(LIST);
+
+# read entries in keysymdef.h
+open(LIST, "</usr/include/X11/keysymdef.h") || die ("Can't open keysymdef.h:\n$!\n");
+while (<LIST>) {
+    if (/^\#define\s+XK_([A-Za-z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/.*)?$/) {
+       next if /\/\* deprecated \*\//;
+       $keysymname = $1;
+       $keysym = hex($2);
+       $keysym_to_keysymname{$keysym} = $keysymname;
+    }
+}
+close(LIST);
+
+print <<EOT;
+/* \$XFree86\$
+ * This module converts keysym values into the corresponding ISO 10646-1
+ * (UCS, Unicode) values.
+ *
+ * The array keysymtab[] contains pairs of X11 keysym values for graphical
+ * characters and the corresponding Unicode value. The function
+ * keysym2ucs() maps a keysym onto a Unicode value using a binary search,
+ * therefore keysymtab[] must remain SORTED by keysym value.
+ *
+ * The keysym -> UTF-8 conversion will hopefully one day be provided
+ * by Xlib via XmbLookupString() and should ideally not have to be
+ * done in X applications. But we are not there yet.
+ *
+ * We allow to represent any UCS character in the range U+00000000 to
+ * U+00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
+ * This admittedly does not cover the entire 31-bit space of UCS, but
+ * it does cover all of the characters up to U+10FFFF, which can be
+ * represented by UTF-16, and more, and it is very unlikely that higher
+ * UCS codes will ever be assigned by ISO. So to get Unicode character
+ * U+ABCD you can directly use keysym 0x1000abcd.
+ *
+ * NOTE: The comments in the table below contain the actual character
+ * encoded in UTF-8, so for viewing and editing best use an editor in
+ * UTF-8 mode.
+ *
+ * Author: Markus G. Kuhn <mkuhn\@acm.org>, University of Cambridge, June 1999
+ *
+ * Special thanks to Richard Verhoeven <river\@win.tue.nl> for preparing
+ * an initial draft of the mapping table.
+ *
+ * This software is in the public domain. Share and enjoy!
+ */
+
+#include <keysym2ucs.h>
+
+struct codepair {
+  unsigned short keysym;
+  unsigned short ucs;
+} keysymtab[] = {
+EOT
+
+for $keysym (sort {$a <=> $b} keys(%keysym_to_keysymname)) {
+    $ucs = $keysym_to_ucs{$keysym};
+    next if $keysym >= 0xf000 || $keysym < 0x100;
+    if ($ucs) {
+       printf("  { 0x%04x, 0x%04x }, /*%28s %s %s */\n",
+              $keysym, $ucs, $keysym_to_keysymname{$keysym}, utf8($ucs),
+              defined($name{$ucs}) ? $name{$ucs} : "???" );
+    } else {
+       printf("/*  0x%04x   %39s ? ??? */\n",
+              $keysym, $keysym_to_keysymname{$keysym});
+    }
+}
+
+print <<EOT;
+};
+
+long keysym2ucs(KeySym keysym)
+{
+    int min = 0;
+    int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
+    int mid;
+
+    /* first check for Latin-1 characters (1:1 mapping) */
+    if ((keysym >= 0x0020 && keysym <= 0x007e) ||
+        (keysym >= 0x00a0 && keysym <= 0x00ff))
+        return keysym;
+
+    /* also check for directly encoded 24-bit UCS characters */
+    if ((keysym & 0xff000000) == 0x01000000)
+       return keysym & 0x00ffffff;
+
+    /* binary search in table */
+    while (max >= min) {
+       mid = (min + max) / 2;
+       if (keysymtab[mid].keysym < keysym)
+           min = mid + 1;
+       else if (keysymtab[mid].keysym > keysym)
+           max = mid - 1;
+       else {
+           /* found it */
+           return keysymtab[mid].ucs;
+       }
+    }
+
+    /* no matching Unicode value found */
+    return -1;
+}
+EOT
diff --git a/i3-input/i3-input.h b/i3-input/i3-input.h
new file mode 100644 (file)
index 0000000..581203d
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _I3_INPUT
+#define _I3_INPUT
+
+#include <err.h>
+
+#define die(...) errx(EXIT_FAILURE, __VA_ARGS__);
+#define FREE(pointer) do { \
+        if (pointer != NULL) { \
+                free(pointer); \
+                pointer = NULL; \
+        } \
+} \
+while (0)
+
+extern xcb_window_t root;
+
+char *convert_ucs_to_utf8(char *input);
+char *convert_utf8_to_ucs2(char *input, int *real_strlen);
+uint32_t get_colorpixel(xcb_connection_t *conn, char *hex);
+uint32_t get_mod_mask(xcb_connection_t *conn, uint32_t keycode);
+int connect_ipc(char *socket_path);
+void ipc_send_message(int sockfd, uint32_t message_size,
+                      uint32_t message_type, uint8_t *payload);
+xcb_window_t open_input_window(xcb_connection_t *conn, uint32_t width, uint32_t height);
+int get_font_id(xcb_connection_t *conn, char *pattern, int *font_height);
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value);
+
+#endif
diff --git a/i3-input/ipc.c b/i3-input/ipc.c
new file mode 100644 (file)
index 0000000..2d11f0e
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <err.h>
+
+/*
+ * Formats a message (payload) of the given size and type and sends it to i3 via
+ * the given socket file descriptor.
+ *
+ */
+void ipc_send_message(int sockfd, uint32_t message_size,
+                      uint32_t message_type, uint8_t *payload) {
+        int buffer_size = strlen("i3-ipc") + sizeof(uint32_t) + sizeof(uint32_t) + message_size;
+        char msg[buffer_size];
+        char *walk = msg;
+
+        strcpy(walk, "i3-ipc");
+        walk += strlen("i3-ipc");
+        memcpy(walk, &message_size, sizeof(uint32_t));
+        walk += sizeof(uint32_t);
+        memcpy(walk, &message_type, sizeof(uint32_t));
+        walk += sizeof(uint32_t);
+        memcpy(walk, payload, message_size);
+
+        int sent_bytes = 0;
+        int bytes_to_go = buffer_size;
+        while (sent_bytes < bytes_to_go) {
+                int n = write(sockfd, msg + sent_bytes, bytes_to_go);
+                if (n == -1)
+                        err(EXIT_FAILURE, "write() failed");
+
+                sent_bytes += n;
+                bytes_to_go -= n;
+        }
+}
+
+/*
+ * Connects to the i3 IPC socket and returns the file descriptor for the
+ * socket. die()s if anything goes wrong.
+ *
+ */
+int connect_ipc(char *socket_path) {
+       int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
+        if (sockfd == -1)
+                err(EXIT_FAILURE, "Could not create socket");
+
+        struct sockaddr_un addr;
+        memset(&addr, 0, sizeof(struct sockaddr_un));
+        addr.sun_family = AF_LOCAL;
+        strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
+        if (connect(sockfd, (const struct sockaddr*)&addr, sizeof(struct sockaddr_un)) < 0)
+                err(EXIT_FAILURE, "Could not connect to i3");
+
+       return sockfd;
+}
diff --git a/i3-input/keysym.map b/i3-input/keysym.map
new file mode 100644 (file)
index 0000000..6e587bd
--- /dev/null
@@ -0,0 +1,1062 @@
+# This list can be used to convert X11 Keysyms to Unicode 2.1 character. 
+# The list is not checked for correctness by Unicode officials.  Use it 
+# at your own risk and the creator is not responsable for any damage that 
+# occured due to using this list. 
+# 
+# The list is created by looking at the Keysym names and the Unicode data 
+# file.  Other mapping tables were used as a reference where needed. 
+# Due to a lack of knowledge of the Hebrew, Thai and Hangul symbols, 
+# expect errors in these sections.  The mapping of the keypad keys 
+# might also require some adjustments. 
+# 
+# The following fields are used: 
+# 1    The X11 keysym numbers from the include file keysymdef.h 
+# 2    The Unicode (2.1) position (U0000 means unknown Unicode position) 
+# # 
+# 3    the name of the X11 keysym (without XK_) 
+# 
+# Authors:  Richard Verhoeven, TUE, <river@win.tue.nl> 
+#           Markus Kuhn, University of Cambridge, <mkuhn@acm.org> 
+#  
+# You are free to use and modify this table.  If you introduce errors 
+# in the table, please remove the copyright line. If you remove errors, 
+# please let me know, so I can update my version. 
+#
+# $XFree86: xc/programs/xterm/unicode/keysym.map,v 1.1 1999/06/12 15:37:24 dawes Exp $
+# 
+0x0020   U0020   # space 
+0x0021   U0021   # exclam 
+0x0022   U0022   # quotedbl 
+0x0023   U0023   # numbersign 
+0x0024   U0024   # dollar 
+0x0025   U0025   # percent 
+0x0026   U0026   # ampersand 
+0x0027   U0027   # apostrophe 
+0x0027   U0027   # quoteright  /* deprecated */ 
+0x0028   U0028   # parenleft 
+0x0029   U0029   # parenright 
+0x002a   U002a   # asterisk 
+0x002b   U002b   # plus 
+0x002c   U002c   # comma 
+0x002d   U002d   # minus 
+0x002e   U002e   # period 
+0x002f   U002f   # slash 
+0x0030   U0030   # 0 
+0x0031   U0031   # 1 
+0x0032   U0032   # 2 
+0x0033   U0033   # 3 
+0x0034   U0034   # 4 
+0x0035   U0035   # 5 
+0x0036   U0036   # 6 
+0x0037   U0037   # 7 
+0x0038   U0038   # 8 
+0x0039   U0039   # 9 
+0x003a   U003a   # colon 
+0x003b   U003b   # semicolon 
+0x003c   U003c   # less 
+0x003d   U003d   # equal 
+0x003e   U003e   # greater 
+0x003f   U003f   # question 
+0x0040   U0040   # at 
+0x0041   U0041   # A 
+0x0042   U0042   # B 
+0x0043   U0043   # C 
+0x0044   U0044   # D 
+0x0045   U0045   # E 
+0x0046   U0046   # F 
+0x0047   U0047   # G 
+0x0048   U0048   # H 
+0x0049   U0049   # I 
+0x004a   U004a   # J 
+0x004b   U004b   # K 
+0x004c   U004c   # L 
+0x004d   U004d   # M 
+0x004e   U004e   # N 
+0x004f   U004f   # O 
+0x0050   U0050   # P 
+0x0051   U0051   # Q 
+0x0052   U0052   # R 
+0x0053   U0053   # S 
+0x0054   U0054   # T 
+0x0055   U0055   # U 
+0x0056   U0056   # V 
+0x0057   U0057   # W 
+0x0058   U0058   # X 
+0x0059   U0059   # Y 
+0x005a   U005a   # Z 
+0x005b   U005b   # bracketleft 
+0x005c   U005c   # backslash 
+0x005d   U005d   # bracketright 
+0x005e   U005e   # asciicircum 
+0x005f   U005f   # underscore 
+0x0060   U0060   # grave 
+0x0060   U0060   # quoteleft   /* deprecated */ 
+0x0061   U0061   # a 
+0x0062   U0062   # b 
+0x0063   U0063   # c 
+0x0064   U0064   # d 
+0x0065   U0065   # e 
+0x0066   U0066   # f 
+0x0067   U0067   # g 
+0x0068   U0068   # h 
+0x0069   U0069   # i 
+0x006a   U006a   # j 
+0x006b   U006b   # k 
+0x006c   U006c   # l 
+0x006d   U006d   # m 
+0x006e   U006e   # n 
+0x006f   U006f   # o 
+0x0070   U0070   # p 
+0x0071   U0071   # q 
+0x0072   U0072   # r 
+0x0073   U0073   # s 
+0x0074   U0074   # t 
+0x0075   U0075   # u 
+0x0076   U0076   # v 
+0x0077   U0077   # w 
+0x0078   U0078   # x 
+0x0079   U0079   # y 
+0x007a   U007a   # z 
+0x007b   U007b   # braceleft 
+0x007c   U007c   # bar 
+0x007d   U007d   # braceright 
+0x007e   U007e   # asciitilde 
+0x00a0   U00a0   # nobreakspace 
+0x00a1   U00a1   # exclamdown 
+0x00a2   U00a2   # cent 
+0x00a3   U00a3   # sterling 
+0x00a4   U00a4   # currency 
+0x00a5   U00a5   # yen 
+0x00a6   U00a6   # brokenbar 
+0x00a7   U00a7   # section 
+0x00a8   U00a8   # diaeresis 
+0x00a9   U00a9   # copyright 
+0x00aa   U00aa   # ordfeminine 
+0x00ab   U00ab   # guillemotleft       /* left angle quotation mark */ 
+0x00ac   U00ac   # notsign 
+0x00ad   U00ad   # hyphen 
+0x00ae   U00ae   # registered 
+0x00af   U00af   # macron 
+0x00b0   U00b0   # degree 
+0x00b1   U00b1   # plusminus 
+0x00b2   U00b2   # twosuperior 
+0x00b3   U00b3   # threesuperior 
+0x00b4   U00b4   # acute 
+0x00b5   U00b5   # mu 
+0x00b6   U00b6   # paragraph 
+0x00b7   U00b7   # periodcentered 
+0x00b8   U00b8   # cedilla 
+0x00b9   U00b9   # onesuperior 
+0x00ba   U00ba   # masculine 
+0x00bb   U00bb   # guillemotright      /* right angle quotation mark */ 
+0x00bc   U00bc   # onequarter 
+0x00bd   U00bd   # onehalf 
+0x00be   U00be   # threequarters 
+0x00bf   U00bf   # questiondown 
+0x00c0   U00c0   # Agrave 
+0x00c1   U00c1   # Aacute 
+0x00c2   U00c2   # Acircumflex 
+0x00c3   U00c3   # Atilde 
+0x00c4   U00c4   # Adiaeresis 
+0x00c5   U00c5   # Aring 
+0x00c6   U00c6   # AE 
+0x00c7   U00c7   # Ccedilla 
+0x00c8   U00c8   # Egrave 
+0x00c9   U00c9   # Eacute 
+0x00ca   U00ca   # Ecircumflex 
+0x00cb   U00cb   # Ediaeresis 
+0x00cc   U00cc   # Igrave 
+0x00cd   U00cd   # Iacute 
+0x00ce   U00ce   # Icircumflex 
+0x00cf   U00cf   # Idiaeresis 
+0x00d0   U00d0   # ETH 
+0x00d0   U00d0   # Eth /* deprecated */ 
+0x00d1   U00d1   # Ntilde 
+0x00d2   U00d2   # Ograve 
+0x00d3   U00d3   # Oacute 
+0x00d4   U00d4   # Ocircumflex 
+0x00d5   U00d5   # Otilde 
+0x00d6   U00d6   # Odiaeresis 
+0x00d7   U00d7   # multiply 
+0x00d8   U00d8   # Ooblique 
+0x00d9   U00d9   # Ugrave 
+0x00da   U00da   # Uacute 
+0x00db   U00db   # Ucircumflex 
+0x00dc   U00dc   # Udiaeresis 
+0x00dd   U00dd   # Yacute 
+0x00de   U00de   # THORN 
+0x00de   U00de   # Thorn       /* deprecated */ 
+0x00df   U00df   # ssharp 
+0x00e0   U00e0   # agrave 
+0x00e1   U00e1   # aacute 
+0x00e2   U00e2   # acircumflex 
+0x00e3   U00e3   # atilde 
+0x00e4   U00e4   # adiaeresis 
+0x00e5   U00e5   # aring 
+0x00e6   U00e6   # ae 
+0x00e7   U00e7   # ccedilla 
+0x00e8   U00e8   # egrave 
+0x00e9   U00e9   # eacute 
+0x00ea   U00ea   # ecircumflex 
+0x00eb   U00eb   # ediaeresis 
+0x00ec   U00ec   # igrave 
+0x00ed   U00ed   # iacute 
+0x00ee   U00ee   # icircumflex 
+0x00ef   U00ef   # idiaeresis 
+0x00f0   U00f0   # eth 
+0x00f1   U00f1   # ntilde 
+0x00f2   U00f2   # ograve 
+0x00f3   U00f3   # oacute 
+0x00f4   U00f4   # ocircumflex 
+0x00f5   U00f5   # otilde 
+0x00f6   U00f6   # odiaeresis 
+0x00f7   U00f7   # division 
+0x00f8   U00f8   # oslash 
+0x00f9   U00f9   # ugrave 
+0x00fa   U00fa   # uacute 
+0x00fb   U00fb   # ucircumflex 
+0x00fc   U00fc   # udiaeresis 
+0x00fd   U00fd   # yacute 
+0x00fe   U00fe   # thorn 
+0x00ff   U00ff   # ydiaeresis 
+0x01a1   U0104   # Aogonek 
+0x01a2   U02d8   # breve 
+0x01a3   U0141   # Lstroke 
+0x01a5   U013d   # Lcaron 
+0x01a6   U015a   # Sacute 
+0x01a9   U0160   # Scaron 
+0x01aa   U015e   # Scedilla 
+0x01ab   U0164   # Tcaron 
+0x01ac   U0179   # Zacute 
+0x01ae   U017d   # Zcaron 
+0x01af   U017b   # Zabovedot 
+0x01b1   U0105   # aogonek 
+0x01b2   U02db   # ogonek 
+0x01b3   U0142   # lstroke 
+0x01b5   U013e   # lcaron 
+0x01b6   U015b   # sacute 
+0x01b7   U02c7   # caron 
+0x01b9   U0161   # scaron 
+0x01ba   U015f   # scedilla 
+0x01bb   U0165   # tcaron 
+0x01bc   U017a   # zacute 
+0x01bd   U02dd   # doubleacute 
+0x01be   U017e   # zcaron 
+0x01bf   U017c   # zabovedot 
+0x01c0   U0154   # Racute 
+0x01c3   U0102   # Abreve 
+0x01c5   U0139   # Lacute 
+0x01c6   U0106   # Cacute 
+0x01c8   U010c   # Ccaron 
+0x01ca   U0118   # Eogonek 
+0x01cc   U011a   # Ecaron 
+0x01cf   U010e   # Dcaron 
+0x01d0   U0110   # Dstroke 
+0x01d1   U0143   # Nacute 
+0x01d2   U0147   # Ncaron 
+0x01d5   U0150   # Odoubleacute 
+0x01d8   U0158   # Rcaron 
+0x01d9   U016e   # Uring 
+0x01db   U0170   # Udoubleacute 
+0x01de   U0162   # Tcedilla 
+0x01e0   U0155   # racute 
+0x01e3   U0103   # abreve 
+0x01e5   U013a   # lacute 
+0x01e6   U0107   # cacute 
+0x01e8   U010d   # ccaron 
+0x01ea   U0119   # eogonek 
+0x01ec   U011b   # ecaron 
+0x01ef   U010f   # dcaron 
+0x01f0   U0111   # dstroke 
+0x01f1   U0144   # nacute 
+0x01f2   U0148   # ncaron 
+0x01f5   U0151   # odoubleacute 
+0x01f8   U0159   # rcaron 
+0x01f9   U016f   # uring 
+0x01fb   U0171   # udoubleacute 
+0x01fe   U0163   # tcedilla 
+0x01ff   U02d9   # abovedot 
+0x02a1   U0126   # Hstroke 
+0x02a6   U0124   # Hcircumflex 
+0x02a9   U0130   # Iabovedot 
+0x02ab   U011e   # Gbreve 
+0x02ac   U0134   # Jcircumflex 
+0x02b1   U0127   # hstroke 
+0x02b6   U0125   # hcircumflex 
+0x02b9   U0131   # idotless 
+0x02bb   U011f   # gbreve 
+0x02bc   U0135   # jcircumflex 
+0x02c5   U010a   # Cabovedot 
+0x02c6   U0108   # Ccircumflex 
+0x02d5   U0120   # Gabovedot 
+0x02d8   U011c   # Gcircumflex 
+0x02dd   U016c   # Ubreve 
+0x02de   U015c   # Scircumflex 
+0x02e5   U010b   # cabovedot 
+0x02e6   U0109   # ccircumflex 
+0x02f5   U0121   # gabovedot 
+0x02f8   U011d   # gcircumflex 
+0x02fd   U016d   # ubreve 
+0x02fe   U015d   # scircumflex 
+0x03a2   U0138   # kra 
+0x03a3   U0156   # Rcedilla 
+0x03a5   U0128   # Itilde 
+0x03a6   U013b   # Lcedilla 
+0x03aa   U0112   # Emacron 
+0x03ab   U0122   # Gcedilla 
+0x03ac   U0166   # Tslash 
+0x03b3   U0157   # rcedilla 
+0x03b5   U0129   # itilde 
+0x03b6   U013c   # lcedilla 
+0x03ba   U0113   # emacron 
+0x03bb   U0123   # gcedilla 
+0x03bc   U0167   # tslash 
+0x03bd   U014a   # ENG 
+0x03bf   U014b   # eng 
+0x03c0   U0100   # Amacron 
+0x03c7   U012e   # Iogonek 
+0x03cc   U0116   # Eabovedot 
+0x03cf   U012a   # Imacron 
+0x03d1   U0145   # Ncedilla 
+0x03d2   U014c   # Omacron 
+0x03d3   U0136   # Kcedilla 
+0x03d9   U0172   # Uogonek 
+0x03dd   U0168   # Utilde 
+0x03de   U016a   # Umacron 
+0x03e0   U0101   # amacron 
+0x03e7   U012f   # iogonek 
+0x03ec   U0117   # eabovedot 
+0x03ef   U012b   # imacron 
+0x03f1   U0146   # ncedilla 
+0x03f2   U014d   # omacron 
+0x03f3   U0137   # kcedilla 
+0x03f9   U0173   # uogonek 
+0x03fd   U0169   # utilde 
+0x03fe   U016b   # umacron 
+0x13bc   U0152   # OE                   
+0x13bd   U0153   # oe                   
+0x13be   U0178   # Ydiaeresis           
+0x047e   U203e   # overline 
+0x04a1   U3002   # kana_fullstop 
+0x04a2   U300c   # kana_openingbracket 
+0x04a3   U300d   # kana_closingbracket 
+0x04a4   U3001   # kana_comma 
+0x04a5   U30fb   # kana_conjunctive 
+0x04a6   U30f2   # kana_WO 
+0x04a7   U30a1   # kana_a 
+0x04a8   U30a3   # kana_i 
+0x04a9   U30a5   # kana_u 
+0x04aa   U30a7   # kana_e 
+0x04ab   U30a9   # kana_o 
+0x04ac   U30e3   # kana_ya 
+0x04ad   U30e5   # kana_yu 
+0x04ae   U30e7   # kana_yo 
+0x04af   U30c3   # kana_tsu 
+0x04b0   U30fc   # prolongedsound 
+0x04b1   U30a2   # kana_A 
+0x04b2   U30a4   # kana_I 
+0x04b3   U30a6   # kana_U 
+0x04b4   U30a8   # kana_E 
+0x04b5   U30aa   # kana_O 
+0x04b6   U30ab   # kana_KA 
+0x04b7   U30ad   # kana_KI 
+0x04b8   U30af   # kana_KU 
+0x04b9   U30b1   # kana_KE 
+0x04ba   U30b3   # kana_KO 
+0x04bb   U30b5   # kana_SA 
+0x04bc   U30b7   # kana_SHI 
+0x04bd   U30b9   # kana_SU 
+0x04be   U30bb   # kana_SE 
+0x04bf   U30bd   # kana_SO 
+0x04c0   U30bf   # kana_TA 
+0x04c1   U30c1   # kana_CHI 
+0x04c2   U30c4   # kana_TSU 
+0x04c3   U30c6   # kana_TE 
+0x04c4   U30c8   # kana_TO 
+0x04c5   U30ca   # kana_NA 
+0x04c6   U30cb   # kana_NI 
+0x04c7   U30cc   # kana_NU 
+0x04c8   U30cd   # kana_NE 
+0x04c9   U30ce   # kana_NO 
+0x04ca   U30cf   # kana_HA 
+0x04cb   U30d2   # kana_HI 
+0x04cc   U30d5   # kana_FU 
+0x04cd   U30d8   # kana_HE 
+0x04ce   U30db   # kana_HO 
+0x04cf   U30de   # kana_MA 
+0x04d0   U30df   # kana_MI 
+0x04d1   U30e0   # kana_MU 
+0x04d2   U30e1   # kana_ME 
+0x04d3   U30e2   # kana_MO 
+0x04d4   U30e4   # kana_YA 
+0x04d5   U30e6   # kana_YU 
+0x04d6   U30e8   # kana_YO 
+0x04d7   U30e9   # kana_RA 
+0x04d8   U30ea   # kana_RI 
+0x04d9   U30eb   # kana_RU 
+0x04da   U30ec   # kana_RE 
+0x04db   U30ed   # kana_RO 
+0x04dc   U30ef   # kana_WA 
+0x04dd   U30f3   # kana_N 
+0x04de   U309b   # voicedsound 
+0x04df   U309c   # semivoicedsound 
+0x05ac   U060c   # Arabic_comma 
+0x05bb   U061b   # Arabic_semicolon 
+0x05bf   U061f   # Arabic_question_mark 
+0x05c1   U0621   # Arabic_hamza 
+0x05c2   U0622   # Arabic_maddaonalef 
+0x05c3   U0623   # Arabic_hamzaonalef 
+0x05c4   U0624   # Arabic_hamzaonwaw 
+0x05c5   U0625   # Arabic_hamzaunderalef 
+0x05c6   U0626   # Arabic_hamzaonyeh 
+0x05c7   U0627   # Arabic_alef 
+0x05c8   U0628   # Arabic_beh 
+0x05c9   U0629   # Arabic_tehmarbuta 
+0x05ca   U062a   # Arabic_teh 
+0x05cb   U062b   # Arabic_theh 
+0x05cc   U062c   # Arabic_jeem 
+0x05cd   U062d   # Arabic_hah 
+0x05ce   U062e   # Arabic_khah 
+0x05cf   U062f   # Arabic_dal 
+0x05d0   U0630   # Arabic_thal 
+0x05d1   U0631   # Arabic_ra 
+0x05d2   U0632   # Arabic_zain 
+0x05d3   U0633   # Arabic_seen 
+0x05d4   U0634   # Arabic_sheen 
+0x05d5   U0635   # Arabic_sad 
+0x05d6   U0636   # Arabic_dad 
+0x05d7   U0637   # Arabic_tah 
+0x05d8   U0638   # Arabic_zah 
+0x05d9   U0639   # Arabic_ain 
+0x05da   U063a   # Arabic_ghain 
+0x05e0   U0640   # Arabic_tatweel 
+0x05e1   U0641   # Arabic_feh 
+0x05e2   U0642   # Arabic_qaf 
+0x05e3   U0643   # Arabic_kaf 
+0x05e4   U0644   # Arabic_lam 
+0x05e5   U0645   # Arabic_meem 
+0x05e6   U0646   # Arabic_noon 
+0x05e7   U0647   # Arabic_ha 
+0x05e8   U0648   # Arabic_waw 
+0x05e9   U0649   # Arabic_alefmaksura 
+0x05ea   U064a   # Arabic_yeh 
+0x05eb   U064b   # Arabic_fathatan 
+0x05ec   U064c   # Arabic_dammatan 
+0x05ed   U064d   # Arabic_kasratan 
+0x05ee   U064e   # Arabic_fatha 
+0x05ef   U064f   # Arabic_damma 
+0x05f0   U0650   # Arabic_kasra 
+0x05f1   U0651   # Arabic_shadda 
+0x05f2   U0652   # Arabic_sukun 
+0x06a1   U0452   # Serbian_dje 
+0x06a2   U0453   # Macedonia_gje 
+0x06a3   U0451   # Cyrillic_io 
+0x06a4   U0454   # Ukrainian_ie 
+0x06a5   U0455   # Macedonia_dse 
+0x06a6   U0456   # Ukrainian_i 
+0x06a7   U0457   # Ukrainian_yi 
+0x06a8   U0458   # Cyrillic_je 
+0x06a9   U0459   # Cyrillic_lje 
+0x06aa   U045a   # Cyrillic_nje 
+0x06ab   U045b   # Serbian_tshe 
+0x06ac   U045c   # Macedonia_kje 
+0x06ae   U045e   # Byelorussian_shortu 
+0x06af   U045f   # Cyrillic_dzhe 
+0x06b0   U2116   # numerosign 
+0x06b1   U0402   # Serbian_DJE 
+0x06b2   U0403   # Macedonia_GJE 
+0x06b3   U0401   # Cyrillic_IO 
+0x06b4   U0404   # Ukrainian_IE 
+0x06b5   U0405   # Macedonia_DSE 
+0x06b6   U0406   # Ukrainian_I 
+0x06b7   U0407   # Ukrainian_YI 
+0x06b8   U0408   # Cyrillic_JE 
+0x06b9   U0409   # Cyrillic_LJE 
+0x06ba   U040a   # Cyrillic_NJE 
+0x06bb   U040b   # Serbian_TSHE 
+0x06bc   U040c   # Macedonia_KJE 
+0x06be   U040e   # Byelorussian_SHORTU 
+0x06bf   U040f   # Cyrillic_DZHE 
+0x06c0   U044e   # Cyrillic_yu 
+0x06c1   U0430   # Cyrillic_a 
+0x06c2   U0431   # Cyrillic_be 
+0x06c3   U0446   # Cyrillic_tse 
+0x06c4   U0434   # Cyrillic_de 
+0x06c5   U0435   # Cyrillic_ie 
+0x06c6   U0444   # Cyrillic_ef 
+0x06c7   U0433   # Cyrillic_ghe 
+0x06c8   U0445   # Cyrillic_ha 
+0x06c9   U0438   # Cyrillic_i 
+0x06ca   U0439   # Cyrillic_shorti 
+0x06cb   U043a   # Cyrillic_ka 
+0x06cc   U043b   # Cyrillic_el 
+0x06cd   U043c   # Cyrillic_em 
+0x06ce   U043d   # Cyrillic_en 
+0x06cf   U043e   # Cyrillic_o 
+0x06d0   U043f   # Cyrillic_pe 
+0x06d1   U044f   # Cyrillic_ya 
+0x06d2   U0440   # Cyrillic_er 
+0x06d3   U0441   # Cyrillic_es 
+0x06d4   U0442   # Cyrillic_te 
+0x06d5   U0443   # Cyrillic_u 
+0x06d6   U0436   # Cyrillic_zhe 
+0x06d7   U0432   # Cyrillic_ve 
+0x06d8   U044c   # Cyrillic_softsign 
+0x06d9   U044b   # Cyrillic_yeru 
+0x06da   U0437   # Cyrillic_ze 
+0x06db   U0448   # Cyrillic_sha 
+0x06dc   U044d   # Cyrillic_e 
+0x06dd   U0449   # Cyrillic_shcha 
+0x06de   U0447   # Cyrillic_che 
+0x06df   U044a   # Cyrillic_hardsign 
+0x06e0   U042e   # Cyrillic_YU 
+0x06e1   U0410   # Cyrillic_A 
+0x06e2   U0411   # Cyrillic_BE 
+0x06e3   U0426   # Cyrillic_TSE 
+0x06e4   U0414   # Cyrillic_DE 
+0x06e5   U0415   # Cyrillic_IE 
+0x06e6   U0424   # Cyrillic_EF 
+0x06e7   U0413   # Cyrillic_GHE 
+0x06e8   U0425   # Cyrillic_HA 
+0x06e9   U0418   # Cyrillic_I 
+0x06ea   U0419   # Cyrillic_SHORTI 
+0x06eb   U041a   # Cyrillic_KA 
+0x06ec   U041b   # Cyrillic_EL 
+0x06ed   U041c   # Cyrillic_EM 
+0x06ee   U041d   # Cyrillic_EN 
+0x06ef   U041e   # Cyrillic_O 
+0x06f0   U041f   # Cyrillic_PE 
+0x06f1   U042f   # Cyrillic_YA 
+0x06f2   U0420   # Cyrillic_ER 
+0x06f3   U0421   # Cyrillic_ES 
+0x06f4   U0422   # Cyrillic_TE 
+0x06f5   U0423   # Cyrillic_U 
+0x06f6   U0416   # Cyrillic_ZHE 
+0x06f7   U0412   # Cyrillic_VE 
+0x06f8   U042c   # Cyrillic_SOFTSIGN 
+0x06f9   U042b   # Cyrillic_YERU 
+0x06fa   U0417   # Cyrillic_ZE 
+0x06fb   U0428   # Cyrillic_SHA 
+0x06fc   U042d   # Cyrillic_E 
+0x06fd   U0429   # Cyrillic_SHCHA 
+0x06fe   U0427   # Cyrillic_CHE 
+0x06ff   U042a   # Cyrillic_HARDSIGN 
+0x07a1   U0386   # Greek_ALPHAaccent 
+0x07a2   U0388   # Greek_EPSILONaccent 
+0x07a3   U0389   # Greek_ETAaccent 
+0x07a4   U038a   # Greek_IOTAaccent 
+0x07a5   U03aa   # Greek_IOTAdiaeresis 
+0x07a7   U038c   # Greek_OMICRONaccent 
+0x07a8   U038e   # Greek_UPSILONaccent 
+0x07a9   U03ab   # Greek_UPSILONdieresis 
+0x07ab   U038f   # Greek_OMEGAaccent 
+0x07ae   U0385   # Greek_accentdieresis 
+0x07af   U2015   # Greek_horizbar 
+0x07b1   U03ac   # Greek_alphaaccent 
+0x07b2   U03ad   # Greek_epsilonaccent 
+0x07b3   U03ae   # Greek_etaaccent 
+0x07b4   U03af   # Greek_iotaaccent 
+0x07b5   U03ca   # Greek_iotadieresis 
+0x07b6   U0390   # Greek_iotaaccentdieresis 
+0x07b7   U03cc   # Greek_omicronaccent 
+0x07b8   U03cd   # Greek_upsilonaccent 
+0x07b9   U03cb   # Greek_upsilondieresis 
+0x07ba   U03b0   # Greek_upsilonaccentdieresis 
+0x07bb   U03ce   # Greek_omegaaccent 
+0x07c1   U0391   # Greek_ALPHA 
+0x07c2   U0392   # Greek_BETA 
+0x07c3   U0393   # Greek_GAMMA 
+0x07c4   U0394   # Greek_DELTA 
+0x07c5   U0395   # Greek_EPSILON 
+0x07c6   U0396   # Greek_ZETA 
+0x07c7   U0397   # Greek_ETA 
+0x07c8   U0398   # Greek_THETA 
+0x07c9   U0399   # Greek_IOTA 
+0x07ca   U039a   # Greek_KAPPA 
+0x07cb   U039b   # Greek_LAMBDA 
+0x07cb   U039b   # Greek_LAMDA 
+0x07cc   U039c   # Greek_MU 
+0x07cd   U039d   # Greek_NU 
+0x07ce   U039e   # Greek_XI 
+0x07cf   U039f   # Greek_OMICRON 
+0x07d0   U03a0   # Greek_PI 
+0x07d1   U03a1   # Greek_RHO 
+0x07d2   U03a3   # Greek_SIGMA 
+0x07d4   U03a4   # Greek_TAU 
+0x07d5   U03a5   # Greek_UPSILON 
+0x07d6   U03a6   # Greek_PHI 
+0x07d7   U03a7   # Greek_CHI 
+0x07d8   U03a8   # Greek_PSI 
+0x07d9   U03a9   # Greek_OMEGA 
+0x07e1   U03b1   # Greek_alpha 
+0x07e2   U03b2   # Greek_beta 
+0x07e3   U03b3   # Greek_gamma 
+0x07e4   U03b4   # Greek_delta 
+0x07e5   U03b5   # Greek_epsilon 
+0x07e6   U03b6   # Greek_zeta 
+0x07e7   U03b7   # Greek_eta 
+0x07e8   U03b8   # Greek_theta 
+0x07e9   U03b9   # Greek_iota 
+0x07ea   U03ba   # Greek_kappa 
+0x07eb   U03bb   # Greek_lambda 
+0x07ec   U03bc   # Greek_mu 
+0x07ed   U03bd   # Greek_nu 
+0x07ee   U03be   # Greek_xi 
+0x07ef   U03bf   # Greek_omicron 
+0x07f0   U03c0   # Greek_pi 
+0x07f1   U03c1   # Greek_rho 
+0x07f2   U03c3   # Greek_sigma 
+0x07f3   U03c2   # Greek_finalsmallsigma 
+0x07f4   U03c4   # Greek_tau 
+0x07f5   U03c5   # Greek_upsilon 
+0x07f6   U03c6   # Greek_phi 
+0x07f7   U03c7   # Greek_chi 
+0x07f8   U03c8   # Greek_psi 
+0x07f9   U03c9   # Greek_omega 
+0x08a1   U0000   # leftradical 
+0x08a2   U0000   # topleftradical 
+0x08a3   U0000   # horizconnector 
+0x08a4   U2320   # topintegral 
+0x08a5   U2321   # botintegral 
+0x08a6   U2502   # vertconnector 
+0x08a7   U0000   # topleftsqbracket 
+0x08a8   U0000   # botleftsqbracket 
+0x08a9   U0000   # toprightsqbracket 
+0x08aa   U0000   # botrightsqbracket 
+0x08ab   U0000   # topleftparens 
+0x08ac   U0000   # botleftparens 
+0x08ad   U0000   # toprightparens 
+0x08ae   U0000   # botrightparens 
+0x08af   U0000   # leftmiddlecurlybrace 
+0x08b0   U0000   # rightmiddlecurlybrace 
+0x08b1   U0000   # topleftsummation 
+0x08b2   U0000   # botleftsummation 
+0x08b3   U0000   # topvertsummationconnector 
+0x08b4   U0000   # botvertsummationconnector 
+0x08b5   U0000   # toprightsummation 
+0x08b6   U0000   # botrightsummation 
+0x08b7   U0000   # rightmiddlesummation 
+0x08bc   U2264   # lessthanequal 
+0x08bd   U2260   # notequal 
+0x08be   U2265   # greaterthanequal 
+0x08bf   U222b   # integral 
+0x08c0   U2234   # therefore 
+0x08c1   U221d   # variation 
+0x08c2   U221e   # infinity 
+0x08c5   U2207   # nabla 
+0x08c8   U2245   # approximate 
+0x08c9   U0000   # similarequal 
+0x08cd   U21d4   # ifonlyif 
+0x08ce   U21d2   # implies 
+0x08cf   U2261   # identical 
+0x08d6   U221a   # radical 
+0x08da   U2282   # includedin 
+0x08db   U2283   # includes 
+0x08dc   U2229   # intersection 
+0x08dd   U222a   # union 
+0x08de   U2227   # logicaland 
+0x08df   U2228   # logicalor 
+0x08ef   U2202   # partialderivative 
+0x08f6   U0192   # function 
+0x08fb   U2190   # leftarrow 
+0x08fc   U2191   # uparrow 
+0x08fd   U2192   # rightarrow 
+0x08fe   U2193   # downarrow 
+0x09df   U2422   # blank 
+0x09e0   U25c6   # soliddiamond 
+0x09e1   U2592   # checkerboard 
+0x09e2   U2409   # ht 
+0x09e3   U240c   # ff 
+0x09e4   U240d   # cr 
+0x09e5   U240a   # lf 
+0x09e8   U2424   # nl 
+0x09e9   U240b   # vt 
+0x09ea   U2518   # lowrightcorner 
+0x09eb   U2510   # uprightcorner 
+0x09ec   U250c   # upleftcorner 
+0x09ed   U2514   # lowleftcorner 
+0x09ee   U253c   # crossinglines 
+0x09ef   U0000   # horizlinescan1 
+0x09f0   U0000   # horizlinescan3 
+0x09f1   U2500   # horizlinescan5 
+0x09f2   U0000   # horizlinescan7 
+0x09f3   U0000   # horizlinescan9 
+0x09f4   U251c   # leftt 
+0x09f5   U2524   # rightt 
+0x09f6   U2534   # bott 
+0x09f7   U252c   # topt 
+0x09f8   U2502   # vertbar 
+0xfe50   U0300   # dead_grave 
+0xfe51   U0301   # dead_acute 
+0xfe52   U0302   # dead_circumflex 
+0xfe53   U0303   # dead_tilde 
+0xfe54   U0304   # dead_macron 
+0xfe55   U0306   # dead_breve 
+0xfe56   U0307   # dead_abovedot 
+0xfe57   U0308   # dead_diaeresis 
+0xfe58   U030a   # dead_abovering 
+0xfe59   U030b   # dead_doubleacute 
+0xfe5a   U030c   # dead_caron 
+0xfe5b   U0327   # dead_cedilla 
+0xfe5c   U0328   # dead_ogonek 
+0xfe5d   U0345   # dead_iota 
+0xfe5e   U3099   # dead_voiced_sound 
+0xfe5f   U309a   # dead_semivoiced_sound 
+0xff08   U0008   # BackSpace   /* back space, back char */ 
+0xff09   U0009   # Tab 
+0xff0a   U000a   # Linefeed    /* Linefeed, LF */ 
+0xff0b   U000b   # Clear 
+0xff0d   U000d   # Return      /* Return, enter */ 
+0xff13   U0013   # Pause       /* Pause, hold */ 
+0xff14   U0014   # Scroll_Lock 
+0xff15   U0015   # Sys_Req 
+0xff1b   U001b   # Escape 
+0xff80   U0032   # KP_Space    /* space */ 
+0xff89   U0009   # KP_Tab 
+0xff8d   U000d   # KP_Enter    /* enter */ 
+0xffaa   U002a   # KP_Multiply 
+0xffab   U002b   # KP_Add 
+0xffac   U002c   # KP_Separator        /* separator, often comma */ 
+0xffad   U002d   # KP_Subtract 
+0xffae   U002e   # KP_Decimal 
+0xffaf   U002f   # KP_Divide 
+0xffb0   U0030   # KP_0 
+0xffb1   U0031   # KP_1 
+0xffb2   U0032   # KP_2 
+0xffb3   U0033   # KP_3 
+0xffb4   U0034   # KP_4 
+0xffb5   U0035   # KP_5 
+0xffb6   U0036   # KP_6 
+0xffb7   U0037   # KP_7 
+0xffb8   U0038   # KP_8 
+0xffb9   U0039   # KP_9 
+0xffbd   U003d   # KP_Equal    /* equals */ 
+0x0aa1   U2003   # emspace 
+0x0aa2   U2002   # enspace 
+0x0aa3   U2004   # em3space 
+0x0aa4   U2005   # em4space 
+0x0aa5   U2007   # digitspace 
+0x0aa6   U2008   # punctspace 
+0x0aa7   U2009   # thinspace 
+0x0aa8   U200a   # hairspace 
+0x0aa9   U2014   # emdash 
+0x0aaa   U2013   # endash 
+0x0aac   U0000   # signifblank 
+0x0aae   U2026   # ellipsis 
+0x0aaf   U0000   # doubbaselinedot 
+0x0ab0   U2153   # onethird 
+0x0ab1   U2154   # twothirds 
+0x0ab2   U2155   # onefifth 
+0x0ab3   U2156   # twofifths 
+0x0ab4   U2157   # threefifths 
+0x0ab5   U2158   # fourfifths 
+0x0ab6   U2159   # onesixth 
+0x0ab7   U215a   # fivesixths 
+0x0ab8   U2105   # careof 
+0x0abb   U2012   # figdash 
+0x0abc   U2329   # leftanglebracket 
+0x0abd   U002e   # decimalpoint 
+0x0abe   U232a   # rightanglebracket 
+0x0abf   U0000   # marker 
+0x0ac3   U215b   # oneeighth 
+0x0ac4   U215c   # threeeighths 
+0x0ac5   U215d   # fiveeighths 
+0x0ac6   U215e   # seveneighths 
+0x0ac9   U2122   # trademark 
+0x0aca   U2613   # signaturemark 
+0x0acb   U0000   # trademarkincircle 
+0x0acc   U25c1   # leftopentriangle 
+0x0acd   U25b7   # rightopentriangle 
+0x0ace   U25cb   # emopencircle 
+0x0acf   U25a1   # emopenrectangle 
+0x0ad0   U2018   # leftsinglequotemark 
+0x0ad1   U2019   # rightsinglequotemark 
+0x0ad2   U201c   # leftdoublequotemark 
+0x0ad3   U201d   # rightdoublequotemark 
+0x0ad4   U211e   # prescription 
+0x0ad6   U2032   # minutes 
+0x0ad7   U2033   # seconds 
+0x0ad9   U271d   # latincross 
+0x0ada   U0000   # hexagram 
+0x0adb   U25ac   # filledrectbullet 
+0x0adc   U25c0   # filledlefttribullet 
+0x0add   U25b6   # filledrighttribullet 
+0x0ade   U25cf   # emfilledcircle 
+0x0adf   U25a0   # emfilledrect 
+0x0ae0   U25e6   # enopencircbullet 
+0x0ae1   U25ab   # enopensquarebullet 
+0x0ae2   U25ad   # openrectbullet 
+0x0ae3   U25b3   # opentribulletup 
+0x0ae4   U25bd   # opentribulletdown 
+0x0ae5   U2606   # openstar 
+0x0ae6   U2022   # enfilledcircbullet 
+0x0ae7   U25aa   # enfilledsqbullet 
+0x0ae8   U25b2   # filledtribulletup 
+0x0ae9   U25bc   # filledtribulletdown 
+0x0aea   U261c   # leftpointer 
+0x0aeb   U261e   # rightpointer 
+0x0aec   U2663   # club 
+0x0aed   U2666   # diamond 
+0x0aee   U2665   # heart 
+0x0af0   U2720   # maltesecross 
+0x0af1   U2020   # dagger 
+0x0af2   U2021   # doubledagger 
+0x0af3   U2713   # checkmark 
+0x0af4   U2717   # ballotcross 
+0x0af5   U266f   # musicalsharp 
+0x0af6   U266d   # musicalflat 
+0x0af7   U2642   # malesymbol 
+0x0af8   U2640   # femalesymbol 
+0x0af9   U260e   # telephone 
+0x0afa   U2315   # telephonerecorder 
+0x0afb   U2117   # phonographcopyright 
+0x0afc   U2038   # caret 
+0x0afd   U201a   # singlelowquotemark 
+0x0afe   U201e   # doublelowquotemark 
+0x0aff   U0000   # cursor 
+0x0ba3   U003c   # leftcaret 
+0x0ba6   U003e   # rightcaret 
+0x0ba8   U2228   # downcaret 
+0x0ba9   U2227   # upcaret 
+0x0bc0   U00af   # overbar 
+0x0bc2   U22a4   # downtack 
+0x0bc3   U2229   # upshoe 
+0x0bc4   U230a   # downstile 
+0x0bc6   U005f   # underbar 
+0x0bca   U2218   # jot 
+0x0bcc   U2395   # quad 
+0x0bce   U22a5   # uptack 
+0x0bcf   U25cb   # circle 
+0x0bd3   U2308   # upstile 
+0x0bd6   U222a   # downshoe 
+0x0bd8   U2283   # rightshoe 
+0x0bda   U2282   # leftshoe 
+0x0bdc   U22a3   # lefttack 
+0x0bfc   U22a2   # righttack 
+0x0cdf   U2017   # hebrew_doublelowline 
+0x0ce0   U05d0   # hebrew_aleph 
+0x0ce1   U05d1   # hebrew_bet 
+0x0ce1   U05d1   # hebrew_beth  /* deprecated */ 
+0x0ce2   U05d2   # hebrew_gimel 
+0x0ce2   U05d2   # hebrew_gimmel  /* deprecated */ 
+0x0ce3   U05d3   # hebrew_dalet 
+0x0ce3   U05d3   # hebrew_daleth  /* deprecated */ 
+0x0ce4   U05d4   # hebrew_he 
+0x0ce5   U05d5   # hebrew_waw 
+0x0ce6   U05d6   # hebrew_zain 
+0x0ce6   U05d6   # hebrew_zayin  /* deprecated */ 
+0x0ce7   U05d7   # hebrew_chet 
+0x0ce7   U05d7   # hebrew_het  /* deprecated */ 
+0x0ce8   U05d8   # hebrew_tet 
+0x0ce8   U05d8   # hebrew_teth  /* deprecated */ 
+0x0ce9   U05d9   # hebrew_yod 
+0x0cea   U05da   # hebrew_finalkaph 
+0x0ceb   U05db   # hebrew_kaph 
+0x0cec   U05dc   # hebrew_lamed 
+0x0ced   U05dd   # hebrew_finalmem 
+0x0cee   U05de   # hebrew_mem 
+0x0cef   U05df   # hebrew_finalnun 
+0x0cf0   U05e0   # hebrew_nun 
+0x0cf1   U05e1   # hebrew_samech 
+0x0cf1   U05e1   # hebrew_samekh  /* deprecated */ 
+0x0cf2   U05e2   # hebrew_ayin 
+0x0cf3   U05e3   # hebrew_finalpe 
+0x0cf4   U05e4   # hebrew_pe 
+0x0cf5   U05e5   # hebrew_finalzade 
+0x0cf5   U05e5   # hebrew_finalzadi  /* deprecated */ 
+0x0cf6   U05e6   # hebrew_zade 
+0x0cf6   U05e6   # hebrew_zadi  /* deprecated */ 
+0x0cf7   U05e7   # hebrew_kuf  /* deprecated */ 
+0x0cf7   U05e7   # hebrew_qoph 
+0x0cf8   U05e8   # hebrew_resh 
+0x0cf9   U05e9   # hebrew_shin 
+0x0cfa   U05ea   # hebrew_taf  /* deprecated */ 
+0x0cfa   U05ea   # hebrew_taw 
+0x0da1   U0e01   # Thai_kokai 
+0x0da2   U0e02   # Thai_khokhai 
+0x0da3   U0e03   # Thai_khokhuat 
+0x0da4   U0e04   # Thai_khokhwai 
+0x0da5   U0e05   # Thai_khokhon 
+0x0da6   U0e06   # Thai_khorakhang   
+0x0da7   U0e07   # Thai_ngongu   
+0x0da8   U0e08   # Thai_chochan   
+0x0da9   U0e09   # Thai_choching    
+0x0daa   U0e0a   # Thai_chochang   
+0x0dab   U0e0b   # Thai_soso 
+0x0dac   U0e0c   # Thai_chochoe 
+0x0dad   U0e0d   # Thai_yoying 
+0x0dae   U0e0e   # Thai_dochada 
+0x0daf   U0e0f   # Thai_topatak 
+0x0db0   U0e10   # Thai_thothan 
+0x0db1   U0e11   # Thai_thonangmontho 
+0x0db2   U0e12   # Thai_thophuthao 
+0x0db3   U0e13   # Thai_nonen 
+0x0db4   U0e14   # Thai_dodek 
+0x0db5   U0e15   # Thai_totao 
+0x0db6   U0e16   # Thai_thothung 
+0x0db7   U0e17   # Thai_thothahan 
+0x0db8   U0e18   # Thai_thothong 
+0x0db9   U0e19   # Thai_nonu 
+0x0dba   U0e1a   # Thai_bobaimai 
+0x0dbb   U0e1b   # Thai_popla 
+0x0dbc   U0e1c   # Thai_phophung 
+0x0dbd   U0e1d   # Thai_fofa 
+0x0dbe   U0e1e   # Thai_phophan 
+0x0dbf   U0e1f   # Thai_fofan 
+0x0dc0   U0e20   # Thai_phosamphao 
+0x0dc1   U0e21   # Thai_moma 
+0x0dc2   U0e22   # Thai_yoyak 
+0x0dc3   U0e23   # Thai_rorua 
+0x0dc4   U0e24   # Thai_ru 
+0x0dc5   U0e25   # Thai_loling 
+0x0dc6   U0e26   # Thai_lu 
+0x0dc7   U0e27   # Thai_wowaen 
+0x0dc8   U0e28   # Thai_sosala 
+0x0dc9   U0e29   # Thai_sorusi 
+0x0dca   U0e2a   # Thai_sosua 
+0x0dcb   U0e2b   # Thai_hohip 
+0x0dcc   U0e2c   # Thai_lochula 
+0x0dcd   U0e2d   # Thai_oang 
+0x0dce   U0e2e   # Thai_honokhuk 
+0x0dcf   U0e2f   # Thai_paiyannoi 
+0x0dd0   U0e30   # Thai_saraa 
+0x0dd1   U0e31   # Thai_maihanakat 
+0x0dd2   U0e32   # Thai_saraaa 
+0x0dd3   U0e33   # Thai_saraam 
+0x0dd4   U0e34   # Thai_sarai    
+0x0dd5   U0e35   # Thai_saraii    
+0x0dd6   U0e36   # Thai_saraue     
+0x0dd7   U0e37   # Thai_sarauee     
+0x0dd8   U0e38   # Thai_sarau     
+0x0dd9   U0e39   # Thai_sarauu    
+0x0dda   U0e3a   # Thai_phinthu 
+0x0dde   U0e3e   # Thai_maihanakat_maitho 
+0x0ddf   U0e3f   # Thai_baht 
+0x0de0   U0e40   # Thai_sarae     
+0x0de1   U0e41   # Thai_saraae 
+0x0de2   U0e42   # Thai_sarao 
+0x0de3   U0e43   # Thai_saraaimaimuan    
+0x0de4   U0e44   # Thai_saraaimaimalai   
+0x0de5   U0e45   # Thai_lakkhangyao 
+0x0de6   U0e46   # Thai_maiyamok 
+0x0de7   U0e47   # Thai_maitaikhu 
+0x0de8   U0e48   # Thai_maiek    
+0x0de9   U0e49   # Thai_maitho 
+0x0dea   U0e4a   # Thai_maitri 
+0x0deb   U0e4b   # Thai_maichattawa 
+0x0dec   U0e4c   # Thai_thanthakhat 
+0x0ded   U0e4d   # Thai_nikhahit 
+0x0df0   U0e50   # Thai_leksun  
+0x0df1   U0e51   # Thai_leknung   
+0x0df2   U0e52   # Thai_leksong  
+0x0df3   U0e53   # Thai_leksam 
+0x0df4   U0e54   # Thai_leksi   
+0x0df5   U0e55   # Thai_lekha   
+0x0df6   U0e56   # Thai_lekhok   
+0x0df7   U0e57   # Thai_lekchet   
+0x0df8   U0e58   # Thai_lekpaet   
+0x0df9   U0e59   # Thai_lekkao  
+0x0ea1   U3131   # Hangul_Kiyeog 
+0x0ea2   U3132   # Hangul_SsangKiyeog 
+0x0ea3   U3133   # Hangul_KiyeogSios 
+0x0ea4   U3134   # Hangul_Nieun 
+0x0ea5   U3135   # Hangul_NieunJieuj 
+0x0ea6   U3136   # Hangul_NieunHieuh 
+0x0ea7   U3137   # Hangul_Dikeud 
+0x0ea8   U3138   # Hangul_SsangDikeud 
+0x0ea9   U3139   # Hangul_Rieul 
+0x0eaa   U313a   # Hangul_RieulKiyeog 
+0x0eab   U313b   # Hangul_RieulMieum 
+0x0eac   U313c   # Hangul_RieulPieub 
+0x0ead   U313d   # Hangul_RieulSios 
+0x0eae   U313e   # Hangul_RieulTieut 
+0x0eaf   U313f   # Hangul_RieulPhieuf 
+0x0eb0   U3140   # Hangul_RieulHieuh 
+0x0eb1   U3141   # Hangul_Mieum 
+0x0eb2   U3142   # Hangul_Pieub 
+0x0eb3   U3143   # Hangul_SsangPieub 
+0x0eb4   U3144   # Hangul_PieubSios 
+0x0eb5   U3145   # Hangul_Sios 
+0x0eb6   U3146   # Hangul_SsangSios 
+0x0eb7   U3147   # Hangul_Ieung 
+0x0eb8   U3148   # Hangul_Jieuj 
+0x0eb9   U3149   # Hangul_SsangJieuj 
+0x0eba   U314a   # Hangul_Cieuc 
+0x0ebb   U314b   # Hangul_Khieuq 
+0x0ebc   U314c   # Hangul_Tieut 
+0x0ebd   U314d   # Hangul_Phieuf 
+0x0ebe   U314e   # Hangul_Hieuh 
+0x0ebf   U314f   # Hangul_A 
+0x0ec0   U3150   # Hangul_AE 
+0x0ec1   U3151   # Hangul_YA 
+0x0ec2   U3152   # Hangul_YAE 
+0x0ec3   U3153   # Hangul_EO 
+0x0ec4   U3154   # Hangul_E 
+0x0ec5   U3155   # Hangul_YEO 
+0x0ec6   U3156   # Hangul_YE 
+0x0ec7   U3157   # Hangul_O 
+0x0ec8   U3158   # Hangul_WA 
+0x0ec9   U3159   # Hangul_WAE 
+0x0eca   U315a   # Hangul_OE 
+0x0ecb   U315b   # Hangul_YO 
+0x0ecc   U315c   # Hangul_U 
+0x0ecd   U315d   # Hangul_WEO 
+0x0ece   U315e   # Hangul_WE 
+0x0ecf   U315f   # Hangul_WI 
+0x0ed0   U3160   # Hangul_YU 
+0x0ed1   U3161   # Hangul_EU 
+0x0ed2   U3162   # Hangul_YI 
+0x0ed3   U3163   # Hangul_I 
+0x0ed4   U11a8   # Hangul_J_Kiyeog 
+0x0ed5   U11a9   # Hangul_J_SsangKiyeog 
+0x0ed6   U11aa   # Hangul_J_KiyeogSios 
+0x0ed7   U11ab   # Hangul_J_Nieun 
+0x0ed8   U11ac   # Hangul_J_NieunJieuj 
+0x0ed9   U11ad   # Hangul_J_NieunHieuh 
+0x0eda   U11ae   # Hangul_J_Dikeud 
+0x0edb   U11af   # Hangul_J_Rieul 
+0x0edc   U11b0   # Hangul_J_RieulKiyeog 
+0x0edd   U11b1   # Hangul_J_RieulMieum 
+0x0ede   U11b2   # Hangul_J_RieulPieub 
+0x0edf   U11b3   # Hangul_J_RieulSios 
+0x0ee0   U11b4   # Hangul_J_RieulTieut 
+0x0ee1   U11b5   # Hangul_J_RieulPhieuf 
+0x0ee2   U11b6   # Hangul_J_RieulHieuh 
+0x0ee3   U11b7   # Hangul_J_Mieum 
+0x0ee4   U11b8   # Hangul_J_Pieub 
+0x0ee5   U11b9   # Hangul_J_PieubSios 
+0x0ee6   U11ba   # Hangul_J_Sios 
+0x0ee7   U11bb   # Hangul_J_SsangSios 
+0x0ee8   U11bc   # Hangul_J_Ieung 
+0x0ee9   U11bd   # Hangul_J_Jieuj 
+0x0eea   U11be   # Hangul_J_Cieuc 
+0x0eeb   U11bf   # Hangul_J_Khieuq 
+0x0eec   U11c0   # Hangul_J_Tieut 
+0x0eed   U11c1   # Hangul_J_Phieuf 
+0x0eee   U11c2   # Hangul_J_Hieuh 
+0x0eef   U316d   # Hangul_RieulYeorinHieuh 
+0x0ef0   U3171   # Hangul_SunkyeongeumMieum 
+0x0ef1   U3178   # Hangul_SunkyeongeumPieub 
+0x0ef2   U317f   # Hangul_PanSios 
+0x0ef3   U0000   # Hangul_KkogjiDalrinIeung 
+0x0ef4   U3184   # Hangul_SunkyeongeumPhieuf 
+0x0ef5   U3186   # Hangul_YeorinHieuh 
+0x0ef6   U318d   # Hangul_AraeA 
+0x0ef7   U318e   # Hangul_AraeAE 
+0x0ef8   U11eb   # Hangul_J_PanSios 
+0x0ef9   U0000   # Hangul_J_KkogjiDalrinIeung 
+0x0efa   U11f9   # Hangul_J_YeorinHieuh 
+0x0eff   U20a9   # Korean_Won 
+0x20a0   U20a0   # EcuSign                                       
+0x20a1   U20a1   # ColonSign                                     
+0x20a2   U20a2   # CruzeiroSign                                  
+0x20a3   U20a3   # FFrancSign                                    
+0x20a4   U20a4   # LiraSign                                      
+0x20a5   U20a5   # MillSign                                      
+0x20a6   U20a6   # NairaSign                                     
+0x20a7   U20a7   # PesetaSign                                    
+0x20a8   U20a8   # RupeeSign                                     
+0x20a9   U20a9   # WonSign                                       
+0x20aa   U20aa   # NewSheqelSign                                 
+0x20ab   U20ab   # DongSign                                      
+0x20ac   U20ac   # EuroSign                                      
diff --git a/i3-input/keysym2ucs.c b/i3-input/keysym2ucs.c
new file mode 100644 (file)
index 0000000..3da51ed
--- /dev/null
@@ -0,0 +1,847 @@
+/* $XFree86$
+ * This module converts keysym values into the corresponding ISO 10646-1
+ * (UCS, Unicode) values.
+ *
+ * The array keysymtab[] contains pairs of X11 keysym values for graphical
+ * characters and the corresponding Unicode value. The function
+ * keysym2ucs() maps a keysym onto a Unicode value using a binary search,
+ * therefore keysymtab[] must remain SORTED by keysym value.
+ *
+ * The keysym -> UTF-8 conversion will hopefully one day be provided
+ * by Xlib via XmbLookupString() and should ideally not have to be
+ * done in X applications. But we are not there yet.
+ *
+ * We allow to represent any UCS character in the range U+00000000 to
+ * U+00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
+ * This admittedly does not cover the entire 31-bit space of UCS, but
+ * it does cover all of the characters up to U+10FFFF, which can be
+ * represented by UTF-16, and more, and it is very unlikely that higher
+ * UCS codes will ever be assigned by ISO. So to get Unicode character
+ * U+ABCD you can directly use keysym 0x1000abcd.
+ *
+ * NOTE: The comments in the table below contain the actual character
+ * encoded in UTF-8, so for viewing and editing best use an editor in
+ * UTF-8 mode.
+ *
+ * Author: Markus G. Kuhn <mkuhn@acm.org>, University of Cambridge, June 1999
+ *
+ * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
+ * an initial draft of the mapping table.
+ *
+ * This software is in the public domain. Share and enjoy!
+ */
+
+#include <xcb/xcb.h>
+#include "keysym2ucs.h"
+
+struct codepair {
+  unsigned short keysym;
+  unsigned short ucs;
+} keysymtab[] = {
+  { 0x01a1, 0x0104 }, /*                     Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
+  { 0x01a2, 0x02d8 }, /*                       breve ˘ BREVE */
+  { 0x01a3, 0x0141 }, /*                     Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */
+  { 0x01a5, 0x013d }, /*                      Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */
+  { 0x01a6, 0x015a }, /*                      Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */
+  { 0x01a9, 0x0160 }, /*                      Scaron Š LATIN CAPITAL LETTER S WITH CARON */
+  { 0x01aa, 0x015e }, /*                    Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */
+  { 0x01ab, 0x0164 }, /*                      Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */
+  { 0x01ac, 0x0179 }, /*                      Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */
+  { 0x01ae, 0x017d }, /*                      Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */
+  { 0x01af, 0x017b }, /*                   Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+  { 0x01b1, 0x0105 }, /*                     aogonek ą LATIN SMALL LETTER A WITH OGONEK */
+  { 0x01b2, 0x02db }, /*                      ogonek ˛ OGONEK */
+  { 0x01b3, 0x0142 }, /*                     lstroke ł LATIN SMALL LETTER L WITH STROKE */
+  { 0x01b5, 0x013e }, /*                      lcaron ľ LATIN SMALL LETTER L WITH CARON */
+  { 0x01b6, 0x015b }, /*                      sacute ś LATIN SMALL LETTER S WITH ACUTE */
+  { 0x01b7, 0x02c7 }, /*                       caron ˇ CARON */
+  { 0x01b9, 0x0161 }, /*                      scaron š LATIN SMALL LETTER S WITH CARON */
+  { 0x01ba, 0x015f }, /*                    scedilla ş LATIN SMALL LETTER S WITH CEDILLA */
+  { 0x01bb, 0x0165 }, /*                      tcaron ť LATIN SMALL LETTER T WITH CARON */
+  { 0x01bc, 0x017a }, /*                      zacute ź LATIN SMALL LETTER Z WITH ACUTE */
+  { 0x01bd, 0x02dd }, /*                 doubleacute ˝ DOUBLE ACUTE ACCENT */
+  { 0x01be, 0x017e }, /*                      zcaron ž LATIN SMALL LETTER Z WITH CARON */
+  { 0x01bf, 0x017c }, /*                   zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */
+  { 0x01c0, 0x0154 }, /*                      Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */
+  { 0x01c3, 0x0102 }, /*                      Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */
+  { 0x01c5, 0x0139 }, /*                      Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */
+  { 0x01c6, 0x0106 }, /*                      Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */
+  { 0x01c8, 0x010c }, /*                      Ccaron Č LATIN CAPITAL LETTER C WITH CARON */
+  { 0x01ca, 0x0118 }, /*                     Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */
+  { 0x01cc, 0x011a }, /*                      Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */
+  { 0x01cf, 0x010e }, /*                      Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */
+  { 0x01d0, 0x0110 }, /*                     Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */
+  { 0x01d1, 0x0143 }, /*                      Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */
+  { 0x01d2, 0x0147 }, /*                      Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */
+  { 0x01d5, 0x0150 }, /*                Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+  { 0x01d8, 0x0158 }, /*                      Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */
+  { 0x01d9, 0x016e }, /*                       Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */
+  { 0x01db, 0x0170 }, /*                Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+  { 0x01de, 0x0162 }, /*                    Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */
+  { 0x01e0, 0x0155 }, /*                      racute ŕ LATIN SMALL LETTER R WITH ACUTE */
+  { 0x01e3, 0x0103 }, /*                      abreve ă LATIN SMALL LETTER A WITH BREVE */
+  { 0x01e5, 0x013a }, /*                      lacute ĺ LATIN SMALL LETTER L WITH ACUTE */
+  { 0x01e6, 0x0107 }, /*                      cacute ć LATIN SMALL LETTER C WITH ACUTE */
+  { 0x01e8, 0x010d }, /*                      ccaron č LATIN SMALL LETTER C WITH CARON */
+  { 0x01ea, 0x0119 }, /*                     eogonek ę LATIN SMALL LETTER E WITH OGONEK */
+  { 0x01ec, 0x011b }, /*                      ecaron ě LATIN SMALL LETTER E WITH CARON */
+  { 0x01ef, 0x010f }, /*                      dcaron ď LATIN SMALL LETTER D WITH CARON */
+  { 0x01f0, 0x0111 }, /*                     dstroke đ LATIN SMALL LETTER D WITH STROKE */
+  { 0x01f1, 0x0144 }, /*                      nacute ń LATIN SMALL LETTER N WITH ACUTE */
+  { 0x01f2, 0x0148 }, /*                      ncaron ň LATIN SMALL LETTER N WITH CARON */
+  { 0x01f5, 0x0151 }, /*                odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+  { 0x01f8, 0x0159 }, /*                      rcaron ř LATIN SMALL LETTER R WITH CARON */
+  { 0x01f9, 0x016f }, /*                       uring ů LATIN SMALL LETTER U WITH RING ABOVE */
+  { 0x01fb, 0x0171 }, /*                udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+  { 0x01fe, 0x0163 }, /*                    tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */
+  { 0x01ff, 0x02d9 }, /*                    abovedot ˙ DOT ABOVE */
+  { 0x02a1, 0x0126 }, /*                     Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */
+  { 0x02a6, 0x0124 }, /*                 Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+  { 0x02a9, 0x0130 }, /*                   Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */
+  { 0x02ab, 0x011e }, /*                      Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */
+  { 0x02ac, 0x0134 }, /*                 Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+  { 0x02b1, 0x0127 }, /*                     hstroke ħ LATIN SMALL LETTER H WITH STROKE */
+  { 0x02b6, 0x0125 }, /*                 hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */
+  { 0x02b9, 0x0131 }, /*                    idotless ı LATIN SMALL LETTER DOTLESS I */
+  { 0x02bb, 0x011f }, /*                      gbreve ğ LATIN SMALL LETTER G WITH BREVE */
+  { 0x02bc, 0x0135 }, /*                 jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */
+  { 0x02c5, 0x010a }, /*                   Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */
+  { 0x02c6, 0x0108 }, /*                 Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+  { 0x02d5, 0x0120 }, /*                   Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */
+  { 0x02d8, 0x011c }, /*                 Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+  { 0x02dd, 0x016c }, /*                      Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */
+  { 0x02de, 0x015c }, /*                 Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+  { 0x02e5, 0x010b }, /*                   cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */
+  { 0x02e6, 0x0109 }, /*                 ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */
+  { 0x02f5, 0x0121 }, /*                   gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */
+  { 0x02f8, 0x011d }, /*                 gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */
+  { 0x02fd, 0x016d }, /*                      ubreve ŭ LATIN SMALL LETTER U WITH BREVE */
+  { 0x02fe, 0x015d }, /*                 scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */
+  { 0x03a2, 0x0138 }, /*                         kra ĸ LATIN SMALL LETTER KRA */
+  { 0x03a3, 0x0156 }, /*                    Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */
+  { 0x03a5, 0x0128 }, /*                      Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */
+  { 0x03a6, 0x013b }, /*                    Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */
+  { 0x03aa, 0x0112 }, /*                     Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */
+  { 0x03ab, 0x0122 }, /*                    Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */
+  { 0x03ac, 0x0166 }, /*                      Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */
+  { 0x03b3, 0x0157 }, /*                    rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */
+  { 0x03b5, 0x0129 }, /*                      itilde ĩ LATIN SMALL LETTER I WITH TILDE */
+  { 0x03b6, 0x013c }, /*                    lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */
+  { 0x03ba, 0x0113 }, /*                     emacron ē LATIN SMALL LETTER E WITH MACRON */
+  { 0x03bb, 0x0123 }, /*                    gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */
+  { 0x03bc, 0x0167 }, /*                      tslash ŧ LATIN SMALL LETTER T WITH STROKE */
+  { 0x03bd, 0x014a }, /*                         ENG Ŋ LATIN CAPITAL LETTER ENG */
+  { 0x03bf, 0x014b }, /*                         eng ŋ LATIN SMALL LETTER ENG */
+  { 0x03c0, 0x0100 }, /*                     Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */
+  { 0x03c7, 0x012e }, /*                     Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */
+  { 0x03cc, 0x0116 }, /*                   Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */
+  { 0x03cf, 0x012a }, /*                     Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */
+  { 0x03d1, 0x0145 }, /*                    Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */
+  { 0x03d2, 0x014c }, /*                     Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */
+  { 0x03d3, 0x0136 }, /*                    Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */
+  { 0x03d9, 0x0172 }, /*                     Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */
+  { 0x03dd, 0x0168 }, /*                      Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */
+  { 0x03de, 0x016a }, /*                     Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */
+  { 0x03e0, 0x0101 }, /*                     amacron ā LATIN SMALL LETTER A WITH MACRON */
+  { 0x03e7, 0x012f }, /*                     iogonek į LATIN SMALL LETTER I WITH OGONEK */
+  { 0x03ec, 0x0117 }, /*                   eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */
+  { 0x03ef, 0x012b }, /*                     imacron ī LATIN SMALL LETTER I WITH MACRON */
+  { 0x03f1, 0x0146 }, /*                    ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */
+  { 0x03f2, 0x014d }, /*                     omacron ō LATIN SMALL LETTER O WITH MACRON */
+  { 0x03f3, 0x0137 }, /*                    kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */
+  { 0x03f9, 0x0173 }, /*                     uogonek ų LATIN SMALL LETTER U WITH OGONEK */
+  { 0x03fd, 0x0169 }, /*                      utilde ũ LATIN SMALL LETTER U WITH TILDE */
+  { 0x03fe, 0x016b }, /*                     umacron ū LATIN SMALL LETTER U WITH MACRON */
+  { 0x047e, 0x203e }, /*                    overline ‾ OVERLINE */
+  { 0x04a1, 0x3002 }, /*               kana_fullstop 。 IDEOGRAPHIC FULL STOP */
+  { 0x04a2, 0x300c }, /*         kana_openingbracket 「 LEFT CORNER BRACKET */
+  { 0x04a3, 0x300d }, /*         kana_closingbracket 」 RIGHT CORNER BRACKET */
+  { 0x04a4, 0x3001 }, /*                  kana_comma 、 IDEOGRAPHIC COMMA */
+  { 0x04a5, 0x30fb }, /*            kana_conjunctive ・ KATAKANA MIDDLE DOT */
+  { 0x04a6, 0x30f2 }, /*                     kana_WO ヲ KATAKANA LETTER WO */
+  { 0x04a7, 0x30a1 }, /*                      kana_a ァ KATAKANA LETTER SMALL A */
+  { 0x04a8, 0x30a3 }, /*                      kana_i ィ KATAKANA LETTER SMALL I */
+  { 0x04a9, 0x30a5 }, /*                      kana_u ゥ KATAKANA LETTER SMALL U */
+  { 0x04aa, 0x30a7 }, /*                      kana_e ェ KATAKANA LETTER SMALL E */
+  { 0x04ab, 0x30a9 }, /*                      kana_o ォ KATAKANA LETTER SMALL O */
+  { 0x04ac, 0x30e3 }, /*                     kana_ya ャ KATAKANA LETTER SMALL YA */
+  { 0x04ad, 0x30e5 }, /*                     kana_yu ュ KATAKANA LETTER SMALL YU */
+  { 0x04ae, 0x30e7 }, /*                     kana_yo ョ KATAKANA LETTER SMALL YO */
+  { 0x04af, 0x30c3 }, /*                    kana_tsu ッ KATAKANA LETTER SMALL TU */
+  { 0x04b0, 0x30fc }, /*              prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+  { 0x04b1, 0x30a2 }, /*                      kana_A ア KATAKANA LETTER A */
+  { 0x04b2, 0x30a4 }, /*                      kana_I イ KATAKANA LETTER I */
+  { 0x04b3, 0x30a6 }, /*                      kana_U ウ KATAKANA LETTER U */
+  { 0x04b4, 0x30a8 }, /*                      kana_E エ KATAKANA LETTER E */
+  { 0x04b5, 0x30aa }, /*                      kana_O オ KATAKANA LETTER O */
+  { 0x04b6, 0x30ab }, /*                     kana_KA カ KATAKANA LETTER KA */
+  { 0x04b7, 0x30ad }, /*                     kana_KI キ KATAKANA LETTER KI */
+  { 0x04b8, 0x30af }, /*                     kana_KU ク KATAKANA LETTER KU */
+  { 0x04b9, 0x30b1 }, /*                     kana_KE ケ KATAKANA LETTER KE */
+  { 0x04ba, 0x30b3 }, /*                     kana_KO コ KATAKANA LETTER KO */
+  { 0x04bb, 0x30b5 }, /*                     kana_SA サ KATAKANA LETTER SA */
+  { 0x04bc, 0x30b7 }, /*                    kana_SHI シ KATAKANA LETTER SI */
+  { 0x04bd, 0x30b9 }, /*                     kana_SU ス KATAKANA LETTER SU */
+  { 0x04be, 0x30bb }, /*                     kana_SE セ KATAKANA LETTER SE */
+  { 0x04bf, 0x30bd }, /*                     kana_SO ソ KATAKANA LETTER SO */
+  { 0x04c0, 0x30bf }, /*                     kana_TA タ KATAKANA LETTER TA */
+  { 0x04c1, 0x30c1 }, /*                    kana_CHI チ KATAKANA LETTER TI */
+  { 0x04c2, 0x30c4 }, /*                    kana_TSU ツ KATAKANA LETTER TU */
+  { 0x04c3, 0x30c6 }, /*                     kana_TE テ KATAKANA LETTER TE */
+  { 0x04c4, 0x30c8 }, /*                     kana_TO ト KATAKANA LETTER TO */
+  { 0x04c5, 0x30ca }, /*                     kana_NA ナ KATAKANA LETTER NA */
+  { 0x04c6, 0x30cb }, /*                     kana_NI ニ KATAKANA LETTER NI */
+  { 0x04c7, 0x30cc }, /*                     kana_NU ヌ KATAKANA LETTER NU */
+  { 0x04c8, 0x30cd }, /*                     kana_NE ネ KATAKANA LETTER NE */
+  { 0x04c9, 0x30ce }, /*                     kana_NO ノ KATAKANA LETTER NO */
+  { 0x04ca, 0x30cf }, /*                     kana_HA ハ KATAKANA LETTER HA */
+  { 0x04cb, 0x30d2 }, /*                     kana_HI ヒ KATAKANA LETTER HI */
+  { 0x04cc, 0x30d5 }, /*                     kana_FU フ KATAKANA LETTER HU */
+  { 0x04cd, 0x30d8 }, /*                     kana_HE ヘ KATAKANA LETTER HE */
+  { 0x04ce, 0x30db }, /*                     kana_HO ホ KATAKANA LETTER HO */
+  { 0x04cf, 0x30de }, /*                     kana_MA マ KATAKANA LETTER MA */
+  { 0x04d0, 0x30df }, /*                     kana_MI ミ KATAKANA LETTER MI */
+  { 0x04d1, 0x30e0 }, /*                     kana_MU ム KATAKANA LETTER MU */
+  { 0x04d2, 0x30e1 }, /*                     kana_ME メ KATAKANA LETTER ME */
+  { 0x04d3, 0x30e2 }, /*                     kana_MO モ KATAKANA LETTER MO */
+  { 0x04d4, 0x30e4 }, /*                     kana_YA ヤ KATAKANA LETTER YA */
+  { 0x04d5, 0x30e6 }, /*                     kana_YU ユ KATAKANA LETTER YU */
+  { 0x04d6, 0x30e8 }, /*                     kana_YO ヨ KATAKANA LETTER YO */
+  { 0x04d7, 0x30e9 }, /*                     kana_RA ラ KATAKANA LETTER RA */
+  { 0x04d8, 0x30ea }, /*                     kana_RI リ KATAKANA LETTER RI */
+  { 0x04d9, 0x30eb }, /*                     kana_RU ル KATAKANA LETTER RU */
+  { 0x04da, 0x30ec }, /*                     kana_RE レ KATAKANA LETTER RE */
+  { 0x04db, 0x30ed }, /*                     kana_RO ロ KATAKANA LETTER RO */
+  { 0x04dc, 0x30ef }, /*                     kana_WA ワ KATAKANA LETTER WA */
+  { 0x04dd, 0x30f3 }, /*                      kana_N ン KATAKANA LETTER N */
+  { 0x04de, 0x309b }, /*                 voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */
+  { 0x04df, 0x309c }, /*             semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+  { 0x05ac, 0x060c }, /*                Arabic_comma ، ARABIC COMMA */
+  { 0x05bb, 0x061b }, /*            Arabic_semicolon ؛ ARABIC SEMICOLON */
+  { 0x05bf, 0x061f }, /*        Arabic_question_mark ؟ ARABIC QUESTION MARK */
+  { 0x05c1, 0x0621 }, /*                Arabic_hamza ء ARABIC LETTER HAMZA */
+  { 0x05c2, 0x0622 }, /*          Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */
+  { 0x05c3, 0x0623 }, /*          Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */
+  { 0x05c4, 0x0624 }, /*           Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */
+  { 0x05c5, 0x0625 }, /*       Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */
+  { 0x05c6, 0x0626 }, /*           Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */
+  { 0x05c7, 0x0627 }, /*                 Arabic_alef ا ARABIC LETTER ALEF */
+  { 0x05c8, 0x0628 }, /*                  Arabic_beh ب ARABIC LETTER BEH */
+  { 0x05c9, 0x0629 }, /*           Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */
+  { 0x05ca, 0x062a }, /*                  Arabic_teh ت ARABIC LETTER TEH */
+  { 0x05cb, 0x062b }, /*                 Arabic_theh ث ARABIC LETTER THEH */
+  { 0x05cc, 0x062c }, /*                 Arabic_jeem ج ARABIC LETTER JEEM */
+  { 0x05cd, 0x062d }, /*                  Arabic_hah ح ARABIC LETTER HAH */
+  { 0x05ce, 0x062e }, /*                 Arabic_khah خ ARABIC LETTER KHAH */
+  { 0x05cf, 0x062f }, /*                  Arabic_dal د ARABIC LETTER DAL */
+  { 0x05d0, 0x0630 }, /*                 Arabic_thal ذ ARABIC LETTER THAL */
+  { 0x05d1, 0x0631 }, /*                   Arabic_ra ر ARABIC LETTER REH */
+  { 0x05d2, 0x0632 }, /*                 Arabic_zain ز ARABIC LETTER ZAIN */
+  { 0x05d3, 0x0633 }, /*                 Arabic_seen س ARABIC LETTER SEEN */
+  { 0x05d4, 0x0634 }, /*                Arabic_sheen ش ARABIC LETTER SHEEN */
+  { 0x05d5, 0x0635 }, /*                  Arabic_sad ص ARABIC LETTER SAD */
+  { 0x05d6, 0x0636 }, /*                  Arabic_dad ض ARABIC LETTER DAD */
+  { 0x05d7, 0x0637 }, /*                  Arabic_tah ط ARABIC LETTER TAH */
+  { 0x05d8, 0x0638 }, /*                  Arabic_zah ظ ARABIC LETTER ZAH */
+  { 0x05d9, 0x0639 }, /*                  Arabic_ain ع ARABIC LETTER AIN */
+  { 0x05da, 0x063a }, /*                Arabic_ghain غ ARABIC LETTER GHAIN */
+  { 0x05e0, 0x0640 }, /*              Arabic_tatweel ـ ARABIC TATWEEL */
+  { 0x05e1, 0x0641 }, /*                  Arabic_feh ف ARABIC LETTER FEH */
+  { 0x05e2, 0x0642 }, /*                  Arabic_qaf ق ARABIC LETTER QAF */
+  { 0x05e3, 0x0643 }, /*                  Arabic_kaf ك ARABIC LETTER KAF */
+  { 0x05e4, 0x0644 }, /*                  Arabic_lam ل ARABIC LETTER LAM */
+  { 0x05e5, 0x0645 }, /*                 Arabic_meem م ARABIC LETTER MEEM */
+  { 0x05e6, 0x0646 }, /*                 Arabic_noon ن ARABIC LETTER NOON */
+  { 0x05e7, 0x0647 }, /*                   Arabic_ha ه ARABIC LETTER HEH */
+  { 0x05e8, 0x0648 }, /*                  Arabic_waw و ARABIC LETTER WAW */
+  { 0x05e9, 0x0649 }, /*          Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */
+  { 0x05ea, 0x064a }, /*                  Arabic_yeh ي ARABIC LETTER YEH */
+  { 0x05eb, 0x064b }, /*             Arabic_fathatan ً ARABIC FATHATAN */
+  { 0x05ec, 0x064c }, /*             Arabic_dammatan ٌ ARABIC DAMMATAN */
+  { 0x05ed, 0x064d }, /*             Arabic_kasratan ٍ ARABIC KASRATAN */
+  { 0x05ee, 0x064e }, /*                Arabic_fatha َ ARABIC FATHA */
+  { 0x05ef, 0x064f }, /*                Arabic_damma ُ ARABIC DAMMA */
+  { 0x05f0, 0x0650 }, /*                Arabic_kasra ِ ARABIC KASRA */
+  { 0x05f1, 0x0651 }, /*               Arabic_shadda ّ ARABIC SHADDA */
+  { 0x05f2, 0x0652 }, /*                Arabic_sukun ْ ARABIC SUKUN */
+  { 0x06a1, 0x0452 }, /*                 Serbian_dje ђ CYRILLIC SMALL LETTER DJE */
+  { 0x06a2, 0x0453 }, /*               Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */
+  { 0x06a3, 0x0451 }, /*                 Cyrillic_io ё CYRILLIC SMALL LETTER IO */
+  { 0x06a4, 0x0454 }, /*                Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */
+  { 0x06a5, 0x0455 }, /*               Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */
+  { 0x06a6, 0x0456 }, /*                 Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+  { 0x06a7, 0x0457 }, /*                Ukrainian_yi ї CYRILLIC SMALL LETTER YI */
+  { 0x06a8, 0x0458 }, /*                 Cyrillic_je ј CYRILLIC SMALL LETTER JE */
+  { 0x06a9, 0x0459 }, /*                Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */
+  { 0x06aa, 0x045a }, /*                Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */
+  { 0x06ab, 0x045b }, /*                Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */
+  { 0x06ac, 0x045c }, /*               Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */
+/*  0x06ad                 Ukrainian_ghe_with_upturn ? ??? */
+  { 0x06ae, 0x045e }, /*         Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */
+  { 0x06af, 0x045f }, /*               Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */
+  { 0x06b0, 0x2116 }, /*                  numerosign № NUMERO SIGN */
+  { 0x06b1, 0x0402 }, /*                 Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */
+  { 0x06b2, 0x0403 }, /*               Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */
+  { 0x06b3, 0x0401 }, /*                 Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */
+  { 0x06b4, 0x0404 }, /*                Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+  { 0x06b5, 0x0405 }, /*               Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */
+  { 0x06b6, 0x0406 }, /*                 Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+  { 0x06b7, 0x0407 }, /*                Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */
+  { 0x06b8, 0x0408 }, /*                 Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */
+  { 0x06b9, 0x0409 }, /*                Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */
+  { 0x06ba, 0x040a }, /*                Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */
+  { 0x06bb, 0x040b }, /*                Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */
+  { 0x06bc, 0x040c }, /*               Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */
+/*  0x06bd                 Ukrainian_GHE_WITH_UPTURN ? ??? */
+  { 0x06be, 0x040e }, /*         Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */
+  { 0x06bf, 0x040f }, /*               Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */
+  { 0x06c0, 0x044e }, /*                 Cyrillic_yu ю CYRILLIC SMALL LETTER YU */
+  { 0x06c1, 0x0430 }, /*                  Cyrillic_a а CYRILLIC SMALL LETTER A */
+  { 0x06c2, 0x0431 }, /*                 Cyrillic_be б CYRILLIC SMALL LETTER BE */
+  { 0x06c3, 0x0446 }, /*                Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */
+  { 0x06c4, 0x0434 }, /*                 Cyrillic_de д CYRILLIC SMALL LETTER DE */
+  { 0x06c5, 0x0435 }, /*                 Cyrillic_ie е CYRILLIC SMALL LETTER IE */
+  { 0x06c6, 0x0444 }, /*                 Cyrillic_ef ф CYRILLIC SMALL LETTER EF */
+  { 0x06c7, 0x0433 }, /*                Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */
+  { 0x06c8, 0x0445 }, /*                 Cyrillic_ha х CYRILLIC SMALL LETTER HA */
+  { 0x06c9, 0x0438 }, /*                  Cyrillic_i и CYRILLIC SMALL LETTER I */
+  { 0x06ca, 0x0439 }, /*             Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */
+  { 0x06cb, 0x043a }, /*                 Cyrillic_ka к CYRILLIC SMALL LETTER KA */
+  { 0x06cc, 0x043b }, /*                 Cyrillic_el л CYRILLIC SMALL LETTER EL */
+  { 0x06cd, 0x043c }, /*                 Cyrillic_em м CYRILLIC SMALL LETTER EM */
+  { 0x06ce, 0x043d }, /*                 Cyrillic_en н CYRILLIC SMALL LETTER EN */
+  { 0x06cf, 0x043e }, /*                  Cyrillic_o о CYRILLIC SMALL LETTER O */
+  { 0x06d0, 0x043f }, /*                 Cyrillic_pe п CYRILLIC SMALL LETTER PE */
+  { 0x06d1, 0x044f }, /*                 Cyrillic_ya я CYRILLIC SMALL LETTER YA */
+  { 0x06d2, 0x0440 }, /*                 Cyrillic_er р CYRILLIC SMALL LETTER ER */
+  { 0x06d3, 0x0441 }, /*                 Cyrillic_es с CYRILLIC SMALL LETTER ES */
+  { 0x06d4, 0x0442 }, /*                 Cyrillic_te т CYRILLIC SMALL LETTER TE */
+  { 0x06d5, 0x0443 }, /*                  Cyrillic_u у CYRILLIC SMALL LETTER U */
+  { 0x06d6, 0x0436 }, /*                Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */
+  { 0x06d7, 0x0432 }, /*                 Cyrillic_ve в CYRILLIC SMALL LETTER VE */
+  { 0x06d8, 0x044c }, /*           Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */
+  { 0x06d9, 0x044b }, /*               Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */
+  { 0x06da, 0x0437 }, /*                 Cyrillic_ze з CYRILLIC SMALL LETTER ZE */
+  { 0x06db, 0x0448 }, /*                Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */
+  { 0x06dc, 0x044d }, /*                  Cyrillic_e э CYRILLIC SMALL LETTER E */
+  { 0x06dd, 0x0449 }, /*              Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */
+  { 0x06de, 0x0447 }, /*                Cyrillic_che ч CYRILLIC SMALL LETTER CHE */
+  { 0x06df, 0x044a }, /*           Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */
+  { 0x06e0, 0x042e }, /*                 Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */
+  { 0x06e1, 0x0410 }, /*                  Cyrillic_A А CYRILLIC CAPITAL LETTER A */
+  { 0x06e2, 0x0411 }, /*                 Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */
+  { 0x06e3, 0x0426 }, /*                Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */
+  { 0x06e4, 0x0414 }, /*                 Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */
+  { 0x06e5, 0x0415 }, /*                 Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */
+  { 0x06e6, 0x0424 }, /*                 Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */
+  { 0x06e7, 0x0413 }, /*                Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */
+  { 0x06e8, 0x0425 }, /*                 Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */
+  { 0x06e9, 0x0418 }, /*                  Cyrillic_I И CYRILLIC CAPITAL LETTER I */
+  { 0x06ea, 0x0419 }, /*             Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */
+  { 0x06eb, 0x041a }, /*                 Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */
+  { 0x06ec, 0x041b }, /*                 Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */
+  { 0x06ed, 0x041c }, /*                 Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */
+  { 0x06ee, 0x041d }, /*                 Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */
+  { 0x06ef, 0x041e }, /*                  Cyrillic_O О CYRILLIC CAPITAL LETTER O */
+  { 0x06f0, 0x041f }, /*                 Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */
+  { 0x06f1, 0x042f }, /*                 Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */
+  { 0x06f2, 0x0420 }, /*                 Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */
+  { 0x06f3, 0x0421 }, /*                 Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */
+  { 0x06f4, 0x0422 }, /*                 Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */
+  { 0x06f5, 0x0423 }, /*                  Cyrillic_U У CYRILLIC CAPITAL LETTER U */
+  { 0x06f6, 0x0416 }, /*                Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */
+  { 0x06f7, 0x0412 }, /*                 Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */
+  { 0x06f8, 0x042c }, /*           Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */
+  { 0x06f9, 0x042b }, /*               Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */
+  { 0x06fa, 0x0417 }, /*                 Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */
+  { 0x06fb, 0x0428 }, /*                Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */
+  { 0x06fc, 0x042d }, /*                  Cyrillic_E Э CYRILLIC CAPITAL LETTER E */
+  { 0x06fd, 0x0429 }, /*              Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */
+  { 0x06fe, 0x0427 }, /*                Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */
+  { 0x06ff, 0x042a }, /*           Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */
+  { 0x07a1, 0x0386 }, /*           Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */
+  { 0x07a2, 0x0388 }, /*         Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */
+  { 0x07a3, 0x0389 }, /*             Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */
+  { 0x07a4, 0x038a }, /*            Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */
+  { 0x07a5, 0x03aa }, /*         Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+  { 0x07a7, 0x038c }, /*         Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */
+  { 0x07a8, 0x038e }, /*         Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */
+  { 0x07a9, 0x03ab }, /*       Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+  { 0x07ab, 0x038f }, /*           Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */
+  { 0x07ae, 0x0385 }, /*        Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */
+  { 0x07af, 0x2015 }, /*              Greek_horizbar ― HORIZONTAL BAR */
+  { 0x07b1, 0x03ac }, /*           Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */
+  { 0x07b2, 0x03ad }, /*         Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */
+  { 0x07b3, 0x03ae }, /*             Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */
+  { 0x07b4, 0x03af }, /*            Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */
+  { 0x07b5, 0x03ca }, /*          Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+  { 0x07b6, 0x0390 }, /*    Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+  { 0x07b7, 0x03cc }, /*         Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */
+  { 0x07b8, 0x03cd }, /*         Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */
+  { 0x07b9, 0x03cb }, /*       Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+  { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+  { 0x07bb, 0x03ce }, /*           Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */
+  { 0x07c1, 0x0391 }, /*                 Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */
+  { 0x07c2, 0x0392 }, /*                  Greek_BETA Β GREEK CAPITAL LETTER BETA */
+  { 0x07c3, 0x0393 }, /*                 Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */
+  { 0x07c4, 0x0394 }, /*                 Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */
+  { 0x07c5, 0x0395 }, /*               Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */
+  { 0x07c6, 0x0396 }, /*                  Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */
+  { 0x07c7, 0x0397 }, /*                   Greek_ETA Η GREEK CAPITAL LETTER ETA */
+  { 0x07c8, 0x0398 }, /*                 Greek_THETA Θ GREEK CAPITAL LETTER THETA */
+  { 0x07c9, 0x0399 }, /*                  Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */
+  { 0x07ca, 0x039a }, /*                 Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */
+  { 0x07cb, 0x039b }, /*                Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */
+  { 0x07cc, 0x039c }, /*                    Greek_MU Μ GREEK CAPITAL LETTER MU */
+  { 0x07cd, 0x039d }, /*                    Greek_NU Ν GREEK CAPITAL LETTER NU */
+  { 0x07ce, 0x039e }, /*                    Greek_XI Ξ GREEK CAPITAL LETTER XI */
+  { 0x07cf, 0x039f }, /*               Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */
+  { 0x07d0, 0x03a0 }, /*                    Greek_PI Π GREEK CAPITAL LETTER PI */
+  { 0x07d1, 0x03a1 }, /*                   Greek_RHO Ρ GREEK CAPITAL LETTER RHO */
+  { 0x07d2, 0x03a3 }, /*                 Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */
+  { 0x07d4, 0x03a4 }, /*                   Greek_TAU Τ GREEK CAPITAL LETTER TAU */
+  { 0x07d5, 0x03a5 }, /*               Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */
+  { 0x07d6, 0x03a6 }, /*                   Greek_PHI Φ GREEK CAPITAL LETTER PHI */
+  { 0x07d7, 0x03a7 }, /*                   Greek_CHI Χ GREEK CAPITAL LETTER CHI */
+  { 0x07d8, 0x03a8 }, /*                   Greek_PSI Ψ GREEK CAPITAL LETTER PSI */
+  { 0x07d9, 0x03a9 }, /*                 Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */
+  { 0x07e1, 0x03b1 }, /*                 Greek_alpha α GREEK SMALL LETTER ALPHA */
+  { 0x07e2, 0x03b2 }, /*                  Greek_beta β GREEK SMALL LETTER BETA */
+  { 0x07e3, 0x03b3 }, /*                 Greek_gamma γ GREEK SMALL LETTER GAMMA */
+  { 0x07e4, 0x03b4 }, /*                 Greek_delta δ GREEK SMALL LETTER DELTA */
+  { 0x07e5, 0x03b5 }, /*               Greek_epsilon ε GREEK SMALL LETTER EPSILON */
+  { 0x07e6, 0x03b6 }, /*                  Greek_zeta ζ GREEK SMALL LETTER ZETA */
+  { 0x07e7, 0x03b7 }, /*                   Greek_eta η GREEK SMALL LETTER ETA */
+  { 0x07e8, 0x03b8 }, /*                 Greek_theta θ GREEK SMALL LETTER THETA */
+  { 0x07e9, 0x03b9 }, /*                  Greek_iota ι GREEK SMALL LETTER IOTA */
+  { 0x07ea, 0x03ba }, /*                 Greek_kappa κ GREEK SMALL LETTER KAPPA */
+  { 0x07eb, 0x03bb }, /*                Greek_lambda λ GREEK SMALL LETTER LAMDA */
+  { 0x07ec, 0x03bc }, /*                    Greek_mu μ GREEK SMALL LETTER MU */
+  { 0x07ed, 0x03bd }, /*                    Greek_nu ν GREEK SMALL LETTER NU */
+  { 0x07ee, 0x03be }, /*                    Greek_xi ξ GREEK SMALL LETTER XI */
+  { 0x07ef, 0x03bf }, /*               Greek_omicron ο GREEK SMALL LETTER OMICRON */
+  { 0x07f0, 0x03c0 }, /*                    Greek_pi π GREEK SMALL LETTER PI */
+  { 0x07f1, 0x03c1 }, /*                   Greek_rho ρ GREEK SMALL LETTER RHO */
+  { 0x07f2, 0x03c3 }, /*                 Greek_sigma σ GREEK SMALL LETTER SIGMA */
+  { 0x07f3, 0x03c2 }, /*       Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */
+  { 0x07f4, 0x03c4 }, /*                   Greek_tau τ GREEK SMALL LETTER TAU */
+  { 0x07f5, 0x03c5 }, /*               Greek_upsilon υ GREEK SMALL LETTER UPSILON */
+  { 0x07f6, 0x03c6 }, /*                   Greek_phi φ GREEK SMALL LETTER PHI */
+  { 0x07f7, 0x03c7 }, /*                   Greek_chi χ GREEK SMALL LETTER CHI */
+  { 0x07f8, 0x03c8 }, /*                   Greek_psi ψ GREEK SMALL LETTER PSI */
+  { 0x07f9, 0x03c9 }, /*                 Greek_omega ω GREEK SMALL LETTER OMEGA */
+/*  0x08a1                               leftradical ? ??? */
+/*  0x08a2                            topleftradical ? ??? */
+/*  0x08a3                            horizconnector ? ??? */
+  { 0x08a4, 0x2320 }, /*                 topintegral ⌠ TOP HALF INTEGRAL */
+  { 0x08a5, 0x2321 }, /*                 botintegral ⌡ BOTTOM HALF INTEGRAL */
+  { 0x08a6, 0x2502 }, /*               vertconnector │ BOX DRAWINGS LIGHT VERTICAL */
+/*  0x08a7                          topleftsqbracket ? ??? */
+/*  0x08a8                          botleftsqbracket ? ??? */
+/*  0x08a9                         toprightsqbracket ? ??? */
+/*  0x08aa                         botrightsqbracket ? ??? */
+/*  0x08ab                             topleftparens ? ??? */
+/*  0x08ac                             botleftparens ? ??? */
+/*  0x08ad                            toprightparens ? ??? */
+/*  0x08ae                            botrightparens ? ??? */
+/*  0x08af                      leftmiddlecurlybrace ? ??? */
+/*  0x08b0                     rightmiddlecurlybrace ? ??? */
+/*  0x08b1                          topleftsummation ? ??? */
+/*  0x08b2                          botleftsummation ? ??? */
+/*  0x08b3                 topvertsummationconnector ? ??? */
+/*  0x08b4                 botvertsummationconnector ? ??? */
+/*  0x08b5                         toprightsummation ? ??? */
+/*  0x08b6                         botrightsummation ? ??? */
+/*  0x08b7                      rightmiddlesummation ? ??? */
+  { 0x08bc, 0x2264 }, /*               lessthanequal ≤ LESS-THAN OR EQUAL TO */
+  { 0x08bd, 0x2260 }, /*                    notequal ≠ NOT EQUAL TO */
+  { 0x08be, 0x2265 }, /*            greaterthanequal ≥ GREATER-THAN OR EQUAL TO */
+  { 0x08bf, 0x222b }, /*                    integral ∫ INTEGRAL */
+  { 0x08c0, 0x2234 }, /*                   therefore ∴ THEREFORE */
+  { 0x08c1, 0x221d }, /*                   variation ∝ PROPORTIONAL TO */
+  { 0x08c2, 0x221e }, /*                    infinity ∞ INFINITY */
+  { 0x08c5, 0x2207 }, /*                       nabla ∇ NABLA */
+  { 0x08c8, 0x2245 }, /*                 approximate ≅ APPROXIMATELY EQUAL TO */
+/*  0x08c9                              similarequal ? ??? */
+  { 0x08cd, 0x21d4 }, /*                    ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */
+  { 0x08ce, 0x21d2 }, /*                     implies ⇒ RIGHTWARDS DOUBLE ARROW */
+  { 0x08cf, 0x2261 }, /*                   identical ≡ IDENTICAL TO */
+  { 0x08d6, 0x221a }, /*                     radical √ SQUARE ROOT */
+  { 0x08da, 0x2282 }, /*                  includedin ⊂ SUBSET OF */
+  { 0x08db, 0x2283 }, /*                    includes ⊃ SUPERSET OF */
+  { 0x08dc, 0x2229 }, /*                intersection ∩ INTERSECTION */
+  { 0x08dd, 0x222a }, /*                       union ∪ UNION */
+  { 0x08de, 0x2227 }, /*                  logicaland ∧ LOGICAL AND */
+  { 0x08df, 0x2228 }, /*                   logicalor ∨ LOGICAL OR */
+  { 0x08ef, 0x2202 }, /*           partialderivative ∂ PARTIAL DIFFERENTIAL */
+  { 0x08f6, 0x0192 }, /*                    function ƒ LATIN SMALL LETTER F WITH HOOK */
+  { 0x08fb, 0x2190 }, /*                   leftarrow ← LEFTWARDS ARROW */
+  { 0x08fc, 0x2191 }, /*                     uparrow ↑ UPWARDS ARROW */
+  { 0x08fd, 0x2192 }, /*                  rightarrow → RIGHTWARDS ARROW */
+  { 0x08fe, 0x2193 }, /*                   downarrow ↓ DOWNWARDS ARROW */
+  { 0x09df, 0x2422 }, /*                       blank ␢ BLANK SYMBOL */
+  { 0x09e0, 0x25c6 }, /*                soliddiamond ◆ BLACK DIAMOND */
+  { 0x09e1, 0x2592 }, /*                checkerboard ▒ MEDIUM SHADE */
+  { 0x09e2, 0x2409 }, /*                          ht ␉ SYMBOL FOR HORIZONTAL TABULATION */
+  { 0x09e3, 0x240c }, /*                          ff ␌ SYMBOL FOR FORM FEED */
+  { 0x09e4, 0x240d }, /*                          cr ␍ SYMBOL FOR CARRIAGE RETURN */
+  { 0x09e5, 0x240a }, /*                          lf ␊ SYMBOL FOR LINE FEED */
+  { 0x09e8, 0x2424 }, /*                          nl ␤ SYMBOL FOR NEWLINE */
+  { 0x09e9, 0x240b }, /*                          vt ␋ SYMBOL FOR VERTICAL TABULATION */
+  { 0x09ea, 0x2518 }, /*              lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */
+  { 0x09eb, 0x2510 }, /*               uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */
+  { 0x09ec, 0x250c }, /*                upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
+  { 0x09ed, 0x2514 }, /*               lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */
+  { 0x09ee, 0x253c }, /*               crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+/*  0x09ef                            horizlinescan1 ? ??? */
+/*  0x09f0                            horizlinescan3 ? ??? */
+  { 0x09f1, 0x2500 }, /*              horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */
+/*  0x09f2                            horizlinescan7 ? ??? */
+/*  0x09f3                            horizlinescan9 ? ??? */
+  { 0x09f4, 0x251c }, /*                       leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+  { 0x09f5, 0x2524 }, /*                      rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+  { 0x09f6, 0x2534 }, /*                        bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+  { 0x09f7, 0x252c }, /*                        topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+  { 0x09f8, 0x2502 }, /*                     vertbar │ BOX DRAWINGS LIGHT VERTICAL */
+  { 0x0aa1, 0x2003 }, /*                     emspace   EM SPACE */
+  { 0x0aa2, 0x2002 }, /*                     enspace   EN SPACE */
+  { 0x0aa3, 0x2004 }, /*                    em3space   THREE-PER-EM SPACE */
+  { 0x0aa4, 0x2005 }, /*                    em4space   FOUR-PER-EM SPACE */
+  { 0x0aa5, 0x2007 }, /*                  digitspace   FIGURE SPACE */
+  { 0x0aa6, 0x2008 }, /*                  punctspace   PUNCTUATION SPACE */
+  { 0x0aa7, 0x2009 }, /*                   thinspace   THIN SPACE */
+  { 0x0aa8, 0x200a }, /*                   hairspace   HAIR SPACE */
+  { 0x0aa9, 0x2014 }, /*                      emdash — EM DASH */
+  { 0x0aaa, 0x2013 }, /*                      endash – EN DASH */
+/*  0x0aac                               signifblank ? ??? */
+  { 0x0aae, 0x2026 }, /*                    ellipsis … HORIZONTAL ELLIPSIS */
+/*  0x0aaf                           doubbaselinedot ? ??? */
+  { 0x0ab0, 0x2153 }, /*                    onethird ⅓ VULGAR FRACTION ONE THIRD */
+  { 0x0ab1, 0x2154 }, /*                   twothirds ⅔ VULGAR FRACTION TWO THIRDS */
+  { 0x0ab2, 0x2155 }, /*                    onefifth ⅕ VULGAR FRACTION ONE FIFTH */
+  { 0x0ab3, 0x2156 }, /*                   twofifths ⅖ VULGAR FRACTION TWO FIFTHS */
+  { 0x0ab4, 0x2157 }, /*                 threefifths ⅗ VULGAR FRACTION THREE FIFTHS */
+  { 0x0ab5, 0x2158 }, /*                  fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */
+  { 0x0ab6, 0x2159 }, /*                    onesixth ⅙ VULGAR FRACTION ONE SIXTH */
+  { 0x0ab7, 0x215a }, /*                  fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */
+  { 0x0ab8, 0x2105 }, /*                      careof ℅ CARE OF */
+  { 0x0abb, 0x2012 }, /*                     figdash ‒ FIGURE DASH */
+  { 0x0abc, 0x2329 }, /*            leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */
+  { 0x0abd, 0x002e }, /*                decimalpoint . FULL STOP */
+  { 0x0abe, 0x232a }, /*           rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */
+/*  0x0abf                                    marker ? ??? */
+  { 0x0ac3, 0x215b }, /*                   oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */
+  { 0x0ac4, 0x215c }, /*                threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */
+  { 0x0ac5, 0x215d }, /*                 fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */
+  { 0x0ac6, 0x215e }, /*                seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */
+  { 0x0ac9, 0x2122 }, /*                   trademark ™ TRADE MARK SIGN */
+  { 0x0aca, 0x2613 }, /*               signaturemark ☓ SALTIRE */
+/*  0x0acb                         trademarkincircle ? ??? */
+  { 0x0acc, 0x25c1 }, /*            leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */
+  { 0x0acd, 0x25b7 }, /*           rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */
+  { 0x0ace, 0x25cb }, /*                emopencircle ○ WHITE CIRCLE */
+  { 0x0acf, 0x25a1 }, /*             emopenrectangle □ WHITE SQUARE */
+  { 0x0ad0, 0x2018 }, /*         leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */
+  { 0x0ad1, 0x2019 }, /*        rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */
+  { 0x0ad2, 0x201c }, /*         leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */
+  { 0x0ad3, 0x201d }, /*        rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */
+  { 0x0ad4, 0x211e }, /*                prescription ℞ PRESCRIPTION TAKE */
+  { 0x0ad6, 0x2032 }, /*                     minutes ′ PRIME */
+  { 0x0ad7, 0x2033 }, /*                     seconds ″ DOUBLE PRIME */
+  { 0x0ad9, 0x271d }, /*                  latincross ✝ LATIN CROSS */
+/*  0x0ada                                  hexagram ? ??? */
+  { 0x0adb, 0x25ac }, /*            filledrectbullet ▬ BLACK RECTANGLE */
+  { 0x0adc, 0x25c0 }, /*         filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */
+  { 0x0add, 0x25b6 }, /*        filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */
+  { 0x0ade, 0x25cf }, /*              emfilledcircle ● BLACK CIRCLE */
+  { 0x0adf, 0x25a0 }, /*                emfilledrect ■ BLACK SQUARE */
+  { 0x0ae0, 0x25e6 }, /*            enopencircbullet ◦ WHITE BULLET */
+  { 0x0ae1, 0x25ab }, /*          enopensquarebullet ▫ WHITE SMALL SQUARE */
+  { 0x0ae2, 0x25ad }, /*              openrectbullet ▭ WHITE RECTANGLE */
+  { 0x0ae3, 0x25b3 }, /*             opentribulletup △ WHITE UP-POINTING TRIANGLE */
+  { 0x0ae4, 0x25bd }, /*           opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */
+  { 0x0ae5, 0x2606 }, /*                    openstar ☆ WHITE STAR */
+  { 0x0ae6, 0x2022 }, /*          enfilledcircbullet • BULLET */
+  { 0x0ae7, 0x25aa }, /*            enfilledsqbullet ▪ BLACK SMALL SQUARE */
+  { 0x0ae8, 0x25b2 }, /*           filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */
+  { 0x0ae9, 0x25bc }, /*         filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */
+  { 0x0aea, 0x261c }, /*                 leftpointer ☜ WHITE LEFT POINTING INDEX */
+  { 0x0aeb, 0x261e }, /*                rightpointer ☞ WHITE RIGHT POINTING INDEX */
+  { 0x0aec, 0x2663 }, /*                        club ♣ BLACK CLUB SUIT */
+  { 0x0aed, 0x2666 }, /*                     diamond ♦ BLACK DIAMOND SUIT */
+  { 0x0aee, 0x2665 }, /*                       heart ♥ BLACK HEART SUIT */
+  { 0x0af0, 0x2720 }, /*                maltesecross ✠ MALTESE CROSS */
+  { 0x0af1, 0x2020 }, /*                      dagger † DAGGER */
+  { 0x0af2, 0x2021 }, /*                doubledagger ‡ DOUBLE DAGGER */
+  { 0x0af3, 0x2713 }, /*                   checkmark ✓ CHECK MARK */
+  { 0x0af4, 0x2717 }, /*                 ballotcross ✗ BALLOT X */
+  { 0x0af5, 0x266f }, /*                musicalsharp ♯ MUSIC SHARP SIGN */
+  { 0x0af6, 0x266d }, /*                 musicalflat ♭ MUSIC FLAT SIGN */
+  { 0x0af7, 0x2642 }, /*                  malesymbol ♂ MALE SIGN */
+  { 0x0af8, 0x2640 }, /*                femalesymbol ♀ FEMALE SIGN */
+  { 0x0af9, 0x260e }, /*                   telephone ☎ BLACK TELEPHONE */
+  { 0x0afa, 0x2315 }, /*           telephonerecorder ⌕ TELEPHONE RECORDER */
+  { 0x0afb, 0x2117 }, /*         phonographcopyright ℗ SOUND RECORDING COPYRIGHT */
+  { 0x0afc, 0x2038 }, /*                       caret ‸ CARET */
+  { 0x0afd, 0x201a }, /*          singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */
+  { 0x0afe, 0x201e }, /*          doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */
+/*  0x0aff                                    cursor ? ??? */
+  { 0x0ba3, 0x003c }, /*                   leftcaret < LESS-THAN SIGN */
+  { 0x0ba6, 0x003e }, /*                  rightcaret > GREATER-THAN SIGN */
+  { 0x0ba8, 0x2228 }, /*                   downcaret ∨ LOGICAL OR */
+  { 0x0ba9, 0x2227 }, /*                     upcaret ∧ LOGICAL AND */
+  { 0x0bc0, 0x00af }, /*                     overbar ¯ MACRON */
+  { 0x0bc2, 0x22a4 }, /*                    downtack ⊤ DOWN TACK */
+  { 0x0bc3, 0x2229 }, /*                      upshoe ∩ INTERSECTION */
+  { 0x0bc4, 0x230a }, /*                   downstile ⌊ LEFT FLOOR */
+  { 0x0bc6, 0x005f }, /*                    underbar _ LOW LINE */
+  { 0x0bca, 0x2218 }, /*                         jot ∘ RING OPERATOR */
+  { 0x0bcc, 0x2395 }, /*                        quad ⎕ APL FUNCTIONAL SYMBOL QUAD */
+  { 0x0bce, 0x22a5 }, /*                      uptack ⊥ UP TACK */
+  { 0x0bcf, 0x25cb }, /*                      circle ○ WHITE CIRCLE */
+  { 0x0bd3, 0x2308 }, /*                     upstile ⌈ LEFT CEILING */
+  { 0x0bd6, 0x222a }, /*                    downshoe ∪ UNION */
+  { 0x0bd8, 0x2283 }, /*                   rightshoe ⊃ SUPERSET OF */
+  { 0x0bda, 0x2282 }, /*                    leftshoe ⊂ SUBSET OF */
+  { 0x0bdc, 0x22a3 }, /*                    lefttack ⊣ LEFT TACK */
+  { 0x0bfc, 0x22a2 }, /*                   righttack ⊢ RIGHT TACK */
+  { 0x0cdf, 0x2017 }, /*        hebrew_doublelowline ‗ DOUBLE LOW LINE */
+  { 0x0ce0, 0x05d0 }, /*                hebrew_aleph א HEBREW LETTER ALEF */
+  { 0x0ce1, 0x05d1 }, /*                  hebrew_bet ב HEBREW LETTER BET */
+  { 0x0ce2, 0x05d2 }, /*                hebrew_gimel ג HEBREW LETTER GIMEL */
+  { 0x0ce3, 0x05d3 }, /*                hebrew_dalet ד HEBREW LETTER DALET */
+  { 0x0ce4, 0x05d4 }, /*                   hebrew_he ה HEBREW LETTER HE */
+  { 0x0ce5, 0x05d5 }, /*                  hebrew_waw ו HEBREW LETTER VAV */
+  { 0x0ce6, 0x05d6 }, /*                 hebrew_zain ז HEBREW LETTER ZAYIN */
+  { 0x0ce7, 0x05d7 }, /*                 hebrew_chet ח HEBREW LETTER HET */
+  { 0x0ce8, 0x05d8 }, /*                  hebrew_tet ט HEBREW LETTER TET */
+  { 0x0ce9, 0x05d9 }, /*                  hebrew_yod י HEBREW LETTER YOD */
+  { 0x0cea, 0x05da }, /*            hebrew_finalkaph ך HEBREW LETTER FINAL KAF */
+  { 0x0ceb, 0x05db }, /*                 hebrew_kaph כ HEBREW LETTER KAF */
+  { 0x0cec, 0x05dc }, /*                hebrew_lamed ל HEBREW LETTER LAMED */
+  { 0x0ced, 0x05dd }, /*             hebrew_finalmem ם HEBREW LETTER FINAL MEM */
+  { 0x0cee, 0x05de }, /*                  hebrew_mem מ HEBREW LETTER MEM */
+  { 0x0cef, 0x05df }, /*             hebrew_finalnun ן HEBREW LETTER FINAL NUN */
+  { 0x0cf0, 0x05e0 }, /*                  hebrew_nun נ HEBREW LETTER NUN */
+  { 0x0cf1, 0x05e1 }, /*               hebrew_samech ס HEBREW LETTER SAMEKH */
+  { 0x0cf2, 0x05e2 }, /*                 hebrew_ayin ע HEBREW LETTER AYIN */
+  { 0x0cf3, 0x05e3 }, /*              hebrew_finalpe ף HEBREW LETTER FINAL PE */
+  { 0x0cf4, 0x05e4 }, /*                   hebrew_pe פ HEBREW LETTER PE */
+  { 0x0cf5, 0x05e5 }, /*            hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */
+  { 0x0cf6, 0x05e6 }, /*                 hebrew_zade צ HEBREW LETTER TSADI */
+  { 0x0cf7, 0x05e7 }, /*                 hebrew_qoph ק HEBREW LETTER QOF */
+  { 0x0cf8, 0x05e8 }, /*                 hebrew_resh ר HEBREW LETTER RESH */
+  { 0x0cf9, 0x05e9 }, /*                 hebrew_shin ש HEBREW LETTER SHIN */
+  { 0x0cfa, 0x05ea }, /*                  hebrew_taw ת HEBREW LETTER TAV */
+  { 0x0da1, 0x0e01 }, /*                  Thai_kokai ก THAI CHARACTER KO KAI */
+  { 0x0da2, 0x0e02 }, /*                Thai_khokhai ข THAI CHARACTER KHO KHAI */
+  { 0x0da3, 0x0e03 }, /*               Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */
+  { 0x0da4, 0x0e04 }, /*               Thai_khokhwai ค THAI CHARACTER KHO KHWAI */
+  { 0x0da5, 0x0e05 }, /*                Thai_khokhon ฅ THAI CHARACTER KHO KHON */
+  { 0x0da6, 0x0e06 }, /*             Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */
+  { 0x0da7, 0x0e07 }, /*                 Thai_ngongu ง THAI CHARACTER NGO NGU */
+  { 0x0da8, 0x0e08 }, /*                Thai_chochan จ THAI CHARACTER CHO CHAN */
+  { 0x0da9, 0x0e09 }, /*               Thai_choching ฉ THAI CHARACTER CHO CHING */
+  { 0x0daa, 0x0e0a }, /*               Thai_chochang ช THAI CHARACTER CHO CHANG */
+  { 0x0dab, 0x0e0b }, /*                   Thai_soso ซ THAI CHARACTER SO SO */
+  { 0x0dac, 0x0e0c }, /*                Thai_chochoe ฌ THAI CHARACTER CHO CHOE */
+  { 0x0dad, 0x0e0d }, /*                 Thai_yoying ญ THAI CHARACTER YO YING */
+  { 0x0dae, 0x0e0e }, /*                Thai_dochada ฎ THAI CHARACTER DO CHADA */
+  { 0x0daf, 0x0e0f }, /*                Thai_topatak ฏ THAI CHARACTER TO PATAK */
+  { 0x0db0, 0x0e10 }, /*                Thai_thothan ฐ THAI CHARACTER THO THAN */
+  { 0x0db1, 0x0e11 }, /*          Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */
+  { 0x0db2, 0x0e12 }, /*             Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */
+  { 0x0db3, 0x0e13 }, /*                  Thai_nonen ณ THAI CHARACTER NO NEN */
+  { 0x0db4, 0x0e14 }, /*                  Thai_dodek ด THAI CHARACTER DO DEK */
+  { 0x0db5, 0x0e15 }, /*                  Thai_totao ต THAI CHARACTER TO TAO */
+  { 0x0db6, 0x0e16 }, /*               Thai_thothung ถ THAI CHARACTER THO THUNG */
+  { 0x0db7, 0x0e17 }, /*              Thai_thothahan ท THAI CHARACTER THO THAHAN */
+  { 0x0db8, 0x0e18 }, /*               Thai_thothong ธ THAI CHARACTER THO THONG */
+  { 0x0db9, 0x0e19 }, /*                   Thai_nonu น THAI CHARACTER NO NU */
+  { 0x0dba, 0x0e1a }, /*               Thai_bobaimai บ THAI CHARACTER BO BAIMAI */
+  { 0x0dbb, 0x0e1b }, /*                  Thai_popla ป THAI CHARACTER PO PLA */
+  { 0x0dbc, 0x0e1c }, /*               Thai_phophung ผ THAI CHARACTER PHO PHUNG */
+  { 0x0dbd, 0x0e1d }, /*                   Thai_fofa ฝ THAI CHARACTER FO FA */
+  { 0x0dbe, 0x0e1e }, /*                Thai_phophan พ THAI CHARACTER PHO PHAN */
+  { 0x0dbf, 0x0e1f }, /*                  Thai_fofan ฟ THAI CHARACTER FO FAN */
+  { 0x0dc0, 0x0e20 }, /*             Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */
+  { 0x0dc1, 0x0e21 }, /*                   Thai_moma ม THAI CHARACTER MO MA */
+  { 0x0dc2, 0x0e22 }, /*                  Thai_yoyak ย THAI CHARACTER YO YAK */
+  { 0x0dc3, 0x0e23 }, /*                  Thai_rorua ร THAI CHARACTER RO RUA */
+  { 0x0dc4, 0x0e24 }, /*                     Thai_ru ฤ THAI CHARACTER RU */
+  { 0x0dc5, 0x0e25 }, /*                 Thai_loling ล THAI CHARACTER LO LING */
+  { 0x0dc6, 0x0e26 }, /*                     Thai_lu ฦ THAI CHARACTER LU */
+  { 0x0dc7, 0x0e27 }, /*                 Thai_wowaen ว THAI CHARACTER WO WAEN */
+  { 0x0dc8, 0x0e28 }, /*                 Thai_sosala ศ THAI CHARACTER SO SALA */
+  { 0x0dc9, 0x0e29 }, /*                 Thai_sorusi ษ THAI CHARACTER SO RUSI */
+  { 0x0dca, 0x0e2a }, /*                  Thai_sosua ส THAI CHARACTER SO SUA */
+  { 0x0dcb, 0x0e2b }, /*                  Thai_hohip ห THAI CHARACTER HO HIP */
+  { 0x0dcc, 0x0e2c }, /*                Thai_lochula ฬ THAI CHARACTER LO CHULA */
+  { 0x0dcd, 0x0e2d }, /*                   Thai_oang อ THAI CHARACTER O ANG */
+  { 0x0dce, 0x0e2e }, /*               Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */
+  { 0x0dcf, 0x0e2f }, /*              Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */
+  { 0x0dd0, 0x0e30 }, /*                  Thai_saraa ะ THAI CHARACTER SARA A */
+  { 0x0dd1, 0x0e31 }, /*             Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */
+  { 0x0dd2, 0x0e32 }, /*                 Thai_saraaa า THAI CHARACTER SARA AA */
+  { 0x0dd3, 0x0e33 }, /*                 Thai_saraam ำ THAI CHARACTER SARA AM */
+  { 0x0dd4, 0x0e34 }, /*                  Thai_sarai ิ THAI CHARACTER SARA I */
+  { 0x0dd5, 0x0e35 }, /*                 Thai_saraii ี THAI CHARACTER SARA II */
+  { 0x0dd6, 0x0e36 }, /*                 Thai_saraue ึ THAI CHARACTER SARA UE */
+  { 0x0dd7, 0x0e37 }, /*                Thai_sarauee ื THAI CHARACTER SARA UEE */
+  { 0x0dd8, 0x0e38 }, /*                  Thai_sarau ุ THAI CHARACTER SARA U */
+  { 0x0dd9, 0x0e39 }, /*                 Thai_sarauu ู THAI CHARACTER SARA UU */
+  { 0x0dda, 0x0e3a }, /*                Thai_phinthu ฺ THAI CHARACTER PHINTHU */
+  { 0x0dde, 0x0e3e }, /*      Thai_maihanakat_maitho ฾ ??? */
+  { 0x0ddf, 0x0e3f }, /*                   Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */
+  { 0x0de0, 0x0e40 }, /*                  Thai_sarae เ THAI CHARACTER SARA E */
+  { 0x0de1, 0x0e41 }, /*                 Thai_saraae แ THAI CHARACTER SARA AE */
+  { 0x0de2, 0x0e42 }, /*                  Thai_sarao โ THAI CHARACTER SARA O */
+  { 0x0de3, 0x0e43 }, /*          Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */
+  { 0x0de4, 0x0e44 }, /*         Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */
+  { 0x0de5, 0x0e45 }, /*            Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */
+  { 0x0de6, 0x0e46 }, /*               Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */
+  { 0x0de7, 0x0e47 }, /*              Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */
+  { 0x0de8, 0x0e48 }, /*                  Thai_maiek ่ THAI CHARACTER MAI EK */
+  { 0x0de9, 0x0e49 }, /*                 Thai_maitho ้ THAI CHARACTER MAI THO */
+  { 0x0dea, 0x0e4a }, /*                 Thai_maitri ๊ THAI CHARACTER MAI TRI */
+  { 0x0deb, 0x0e4b }, /*            Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */
+  { 0x0dec, 0x0e4c }, /*            Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */
+  { 0x0ded, 0x0e4d }, /*               Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */
+  { 0x0df0, 0x0e50 }, /*                 Thai_leksun ๐ THAI DIGIT ZERO */
+  { 0x0df1, 0x0e51 }, /*                Thai_leknung ๑ THAI DIGIT ONE */
+  { 0x0df2, 0x0e52 }, /*                Thai_leksong ๒ THAI DIGIT TWO */
+  { 0x0df3, 0x0e53 }, /*                 Thai_leksam ๓ THAI DIGIT THREE */
+  { 0x0df4, 0x0e54 }, /*                  Thai_leksi ๔ THAI DIGIT FOUR */
+  { 0x0df5, 0x0e55 }, /*                  Thai_lekha ๕ THAI DIGIT FIVE */
+  { 0x0df6, 0x0e56 }, /*                 Thai_lekhok ๖ THAI DIGIT SIX */
+  { 0x0df7, 0x0e57 }, /*                Thai_lekchet ๗ THAI DIGIT SEVEN */
+  { 0x0df8, 0x0e58 }, /*                Thai_lekpaet ๘ THAI DIGIT EIGHT */
+  { 0x0df9, 0x0e59 }, /*                 Thai_lekkao ๙ THAI DIGIT NINE */
+  { 0x0ea1, 0x3131 }, /*               Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */
+  { 0x0ea2, 0x3132 }, /*          Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */
+  { 0x0ea3, 0x3133 }, /*           Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */
+  { 0x0ea4, 0x3134 }, /*                Hangul_Nieun ㄴ HANGUL LETTER NIEUN */
+  { 0x0ea5, 0x3135 }, /*           Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */
+  { 0x0ea6, 0x3136 }, /*           Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */
+  { 0x0ea7, 0x3137 }, /*               Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */
+  { 0x0ea8, 0x3138 }, /*          Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */
+  { 0x0ea9, 0x3139 }, /*                Hangul_Rieul ㄹ HANGUL LETTER RIEUL */
+  { 0x0eaa, 0x313a }, /*          Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */
+  { 0x0eab, 0x313b }, /*           Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */
+  { 0x0eac, 0x313c }, /*           Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */
+  { 0x0ead, 0x313d }, /*            Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */
+  { 0x0eae, 0x313e }, /*           Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */
+  { 0x0eaf, 0x313f }, /*          Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */
+  { 0x0eb0, 0x3140 }, /*           Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */
+  { 0x0eb1, 0x3141 }, /*                Hangul_Mieum ㅁ HANGUL LETTER MIEUM */
+  { 0x0eb2, 0x3142 }, /*                Hangul_Pieub ㅂ HANGUL LETTER PIEUP */
+  { 0x0eb3, 0x3143 }, /*           Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */
+  { 0x0eb4, 0x3144 }, /*            Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */
+  { 0x0eb5, 0x3145 }, /*                 Hangul_Sios ㅅ HANGUL LETTER SIOS */
+  { 0x0eb6, 0x3146 }, /*            Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */
+  { 0x0eb7, 0x3147 }, /*                Hangul_Ieung ㅇ HANGUL LETTER IEUNG */
+  { 0x0eb8, 0x3148 }, /*                Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */
+  { 0x0eb9, 0x3149 }, /*           Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */
+  { 0x0eba, 0x314a }, /*                Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */
+  { 0x0ebb, 0x314b }, /*               Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */
+  { 0x0ebc, 0x314c }, /*                Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */
+  { 0x0ebd, 0x314d }, /*               Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */
+  { 0x0ebe, 0x314e }, /*                Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */
+  { 0x0ebf, 0x314f }, /*                    Hangul_A ㅏ HANGUL LETTER A */
+  { 0x0ec0, 0x3150 }, /*                   Hangul_AE ㅐ HANGUL LETTER AE */
+  { 0x0ec1, 0x3151 }, /*                   Hangul_YA ㅑ HANGUL LETTER YA */
+  { 0x0ec2, 0x3152 }, /*                  Hangul_YAE ㅒ HANGUL LETTER YAE */
+  { 0x0ec3, 0x3153 }, /*                   Hangul_EO ㅓ HANGUL LETTER EO */
+  { 0x0ec4, 0x3154 }, /*                    Hangul_E ㅔ HANGUL LETTER E */
+  { 0x0ec5, 0x3155 }, /*                  Hangul_YEO ㅕ HANGUL LETTER YEO */
+  { 0x0ec6, 0x3156 }, /*                   Hangul_YE ㅖ HANGUL LETTER YE */
+  { 0x0ec7, 0x3157 }, /*                    Hangul_O ㅗ HANGUL LETTER O */
+  { 0x0ec8, 0x3158 }, /*                   Hangul_WA ㅘ HANGUL LETTER WA */
+  { 0x0ec9, 0x3159 }, /*                  Hangul_WAE ㅙ HANGUL LETTER WAE */
+  { 0x0eca, 0x315a }, /*                   Hangul_OE ㅚ HANGUL LETTER OE */
+  { 0x0ecb, 0x315b }, /*                   Hangul_YO ㅛ HANGUL LETTER YO */
+  { 0x0ecc, 0x315c }, /*                    Hangul_U ㅜ HANGUL LETTER U */
+  { 0x0ecd, 0x315d }, /*                  Hangul_WEO ㅝ HANGUL LETTER WEO */
+  { 0x0ece, 0x315e }, /*                   Hangul_WE ㅞ HANGUL LETTER WE */
+  { 0x0ecf, 0x315f }, /*                   Hangul_WI ㅟ HANGUL LETTER WI */
+  { 0x0ed0, 0x3160 }, /*                   Hangul_YU ㅠ HANGUL LETTER YU */
+  { 0x0ed1, 0x3161 }, /*                   Hangul_EU ㅡ HANGUL LETTER EU */
+  { 0x0ed2, 0x3162 }, /*                   Hangul_YI ㅢ HANGUL LETTER YI */
+  { 0x0ed3, 0x3163 }, /*                    Hangul_I ㅣ HANGUL LETTER I */
+  { 0x0ed4, 0x11a8 }, /*             Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */
+  { 0x0ed5, 0x11a9 }, /*        Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */
+  { 0x0ed6, 0x11aa }, /*         Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */
+  { 0x0ed7, 0x11ab }, /*              Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */
+  { 0x0ed8, 0x11ac }, /*         Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */
+  { 0x0ed9, 0x11ad }, /*         Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */
+  { 0x0eda, 0x11ae }, /*             Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */
+  { 0x0edb, 0x11af }, /*              Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */
+  { 0x0edc, 0x11b0 }, /*        Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */
+  { 0x0edd, 0x11b1 }, /*         Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */
+  { 0x0ede, 0x11b2 }, /*         Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */
+  { 0x0edf, 0x11b3 }, /*          Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */
+  { 0x0ee0, 0x11b4 }, /*         Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */
+  { 0x0ee1, 0x11b5 }, /*        Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */
+  { 0x0ee2, 0x11b6 }, /*         Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */
+  { 0x0ee3, 0x11b7 }, /*              Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */
+  { 0x0ee4, 0x11b8 }, /*              Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */
+  { 0x0ee5, 0x11b9 }, /*          Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */
+  { 0x0ee6, 0x11ba }, /*               Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */
+  { 0x0ee7, 0x11bb }, /*          Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */
+  { 0x0ee8, 0x11bc }, /*              Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */
+  { 0x0ee9, 0x11bd }, /*              Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */
+  { 0x0eea, 0x11be }, /*              Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */
+  { 0x0eeb, 0x11bf }, /*             Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */
+  { 0x0eec, 0x11c0 }, /*              Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */
+  { 0x0eed, 0x11c1 }, /*             Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */
+  { 0x0eee, 0x11c2 }, /*              Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */
+  { 0x0eef, 0x316d }, /*     Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */
+  { 0x0ef0, 0x3171 }, /*    Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */
+  { 0x0ef1, 0x3178 }, /*    Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */
+  { 0x0ef2, 0x317f }, /*              Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */
+/*  0x0ef3                  Hangul_KkogjiDalrinIeung ? ??? */
+  { 0x0ef4, 0x3184 }, /*   Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */
+  { 0x0ef5, 0x3186 }, /*          Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
+  { 0x0ef6, 0x318d }, /*                Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
+  { 0x0ef7, 0x318e }, /*               Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
+  { 0x0ef8, 0x11eb }, /*            Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */
+/*  0x0ef9                Hangul_J_KkogjiDalrinIeung ? ??? */
+  { 0x0efa, 0x11f9 }, /*        Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */
+  { 0x0eff, 0x20a9 }, /*                  Korean_Won ₩ WON SIGN */
+  { 0x13bc, 0x0152 }, /*                          OE Œ LATIN CAPITAL LIGATURE OE */
+  { 0x13bd, 0x0153 }, /*                          oe œ LATIN SMALL LIGATURE OE */
+  { 0x13be, 0x0178 }, /*                  Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */
+  { 0x20ac, 0x20ac }, /*                    EuroSign € EURO SIGN */
+};
+
+long keysym2ucs(xcb_keysym_t keysym)
+{
+    int min = 0;
+    int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
+    int mid;
+
+    /* first check for Latin-1 characters (1:1 mapping) */
+    if ((keysym >= 0x0020 && keysym <= 0x007e) ||
+        (keysym >= 0x00a0 && keysym <= 0x00ff))
+        return keysym;
+
+    /* also check for directly encoded 24-bit UCS characters */
+    if ((keysym & 0xff000000) == 0x01000000)
+       return keysym & 0x00ffffff;
+
+    /* binary search in table */
+    while (max >= min) {
+       mid = (min + max) / 2;
+       if (keysymtab[mid].keysym < keysym)
+           min = mid + 1;
+       else if (keysymtab[mid].keysym > keysym)
+           max = mid - 1;
+       else {
+           /* found it */
+           return keysymtab[mid].ucs;
+       }
+    }
+
+    /* no matching Unicode value found */
+    return -1;
+}
diff --git a/i3-input/keysym2ucs.h b/i3-input/keysym2ucs.h
new file mode 100644 (file)
index 0000000..f9fbe81
--- /dev/null
@@ -0,0 +1,3 @@
+#include <xcb/xcb.h>
+
+long keysym2ucs(xcb_keysym_t keysym);
diff --git a/i3-input/main.c b/i3-input/main.c
new file mode 100644 (file)
index 0000000..fb2635a
--- /dev/null
@@ -0,0 +1,423 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * i3-input/main.c: Utility which lets the user input commands and sends them
+ * to i3.
+ *
+ */
+#include <ev.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <err.h>
+#include <stdint.h>
+#include <getopt.h>
+#include <limits.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_event.h>
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/keysym.h>
+
+#include "keysym2ucs.h"
+
+#include "i3-input.h"
+
+static char *socket_path;
+static int sockfd;
+static xcb_key_symbols_t *symbols;
+static int modeswitchmask;
+static int numlockmask;
+static bool modeswitch_active = false;
+static xcb_window_t win;
+static xcb_pixmap_t pixmap;
+static xcb_gcontext_t pixmap_gc;
+static char *glyphs_ucs[512];
+static char *glyphs_utf8[512];
+static int input_position;
+static int font_height;
+static char *command_prefix;
+static char *prompt;
+static int prompt_len;
+static int limit;
+xcb_window_t root;
+
+/*
+ * Try to get the socket path from X11 and return NULL if it doesn’t work.
+ * As i3-msg is a short-running tool, we don’t bother with cleaning up the
+ * connection and leave it up to the operating system on exit.
+ *
+ */
+static char *socket_path_from_x11() {
+        xcb_connection_t *conn;
+        int screen;
+        if ((conn = xcb_connect(NULL, &screen)) == NULL ||
+            xcb_connection_has_error(conn))
+                return NULL;
+        xcb_screen_t *root_screen = xcb_aux_get_screen(conn, screen);
+        xcb_window_t root = root_screen->root;
+
+        xcb_intern_atom_cookie_t atom_cookie;
+        xcb_intern_atom_reply_t *atom_reply;
+
+        atom_cookie = xcb_intern_atom(conn, 0, strlen("I3_SOCKET_PATH"), "I3_SOCKET_PATH");
+        atom_reply = xcb_intern_atom_reply(conn, atom_cookie, NULL);
+        if (atom_reply == NULL)
+                return NULL;
+
+        xcb_get_property_cookie_t prop_cookie;
+        xcb_get_property_reply_t *prop_reply;
+        prop_cookie = xcb_get_property_unchecked(conn, false, root, atom_reply->atom,
+                                                 XCB_GET_PROPERTY_TYPE_ANY, 0, PATH_MAX);
+        prop_reply = xcb_get_property_reply(conn, prop_cookie, NULL);
+        if (prop_reply == NULL || xcb_get_property_value_length(prop_reply) == 0)
+                return NULL;
+        if (asprintf(&socket_path, "%.*s", xcb_get_property_value_length(prop_reply),
+                     (char*)xcb_get_property_value(prop_reply)) == -1)
+                return NULL;
+        return socket_path;
+}
+
+/*
+ * Concats the glyphs (either UCS-2 or UTF-8) to a single string, suitable for
+ * rendering it (UCS-2) or sending it to i3 (UTF-8).
+ *
+ */
+static uint8_t *concat_strings(char **glyphs, int max) {
+        uint8_t *output = calloc(max+1, 4);
+        uint8_t *walk = output;
+        for (int c = 0; c < max; c++) {
+                printf("at %c\n", glyphs[c][0]);
+                /* if the first byte is 0, this has to be UCS2 */
+                if (glyphs[c][0] == '\0') {
+                        memcpy(walk, glyphs[c], 2);
+                        walk += 2;
+                } else {
+                        strcpy((char*)walk, glyphs[c]);
+                        walk += strlen(glyphs[c]);
+                }
+        }
+        printf("output = %s\n", output);
+        return output;
+}
+
+/*
+ * Handles expose events (redraws of the window) and rendering in general. Will
+ * be called from the code with event == NULL or from X with event != NULL.
+ *
+ */
+static int handle_expose(void *data, xcb_connection_t *conn, xcb_expose_event_t *event) {
+        printf("expose!\n");
+
+        /* re-draw the background */
+        xcb_rectangle_t border = {0, 0, 500, font_height + 8}, inner = {2, 2, 496, font_height + 8 - 4};
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#FF0000"));
+        xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &border);
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#000000"));
+        xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &inner);
+
+        /* restore font color */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#FFFFFF"));
+        uint8_t *con = concat_strings(glyphs_ucs, input_position);
+        char *full_text = (char*)con;
+        if (prompt != NULL) {
+                full_text = malloc((prompt_len + input_position) * 2 + 1);
+                if (full_text == NULL)
+                        err(EXIT_FAILURE, "malloc() failed\n");
+                memcpy(full_text, prompt, prompt_len * 2);
+                memcpy(full_text + (prompt_len * 2), con, input_position * 2);
+        }
+        xcb_image_text_16(conn, input_position + prompt_len, pixmap, pixmap_gc, 4 /* X */,
+                          font_height + 2 /* Y = baseline of font */, (xcb_char2b_t*)full_text);
+
+        /* Copy the contents of the pixmap to the real window */
+        xcb_copy_area(conn, pixmap, win, pixmap_gc, 0, 0, 0, 0, /* */ 500, font_height + 8);
+        xcb_flush(conn);
+        free(con);
+        if (prompt != NULL)
+                free(full_text);
+
+        return 1;
+}
+
+/*
+ * Deactivates the Mode_switch bit upon release of the Mode_switch key.
+ *
+ */
+static int handle_key_release(void *ignored, xcb_connection_t *conn, xcb_key_release_event_t *event) {
+        printf("releasing %d, state raw = %d\n", event->detail, event->state);
+
+        /* fix state */
+        event->state &= ~numlockmask;
+
+        xcb_keysym_t sym = xcb_key_press_lookup_keysym(symbols, event, event->state);
+        if (sym == XK_Mode_switch) {
+                printf("Mode switch disabled\n");
+                modeswitch_active = false;
+        }
+
+        return 1;
+}
+
+static void finish_input() {
+        uint8_t *command = concat_strings(glyphs_utf8, input_position);
+        char *full_command = (char*)command;
+        /* prefix the command if a prefix was specified on commandline */
+        if (command_prefix != NULL) {
+                if (asprintf(&full_command, "%s%s", command_prefix, command) == -1)
+                        err(EXIT_FAILURE, "asprintf() failed\n");
+        }
+        printf("command = %s\n", full_command);
+
+        ipc_send_message(sockfd, strlen(full_command), 0, (uint8_t*)full_command);
+
+#if 0
+        free(command);
+        return 1;
+#endif
+        exit(0);
+}
+
+/*
+ * Handles keypresses by converting the keycodes to keysymbols, then the
+ * keysymbols to UCS-2. If the conversion succeeded, the glyph is saved in the
+ * internal buffers and displayed in the input window.
+ *
+ * Also handles backspace (deleting one character) and return (sending the
+ * command to i3).
+ *
+ */
+static int handle_key_press(void *ignored, xcb_connection_t *conn, xcb_key_press_event_t *event) {
+        printf("Keypress %d, state raw = %d\n", event->detail, event->state);
+
+        /* fix state */
+        if (modeswitch_active)
+                event->state |= modeswitchmask;
+
+        /* Apparantly, after activating numlock once, the numlock modifier
+         * stays turned on (use xev(1) to verify). So, to resolve useful
+         * keysyms, we remove the numlock flag from the event state */
+        event->state &= ~numlockmask;
+
+        xcb_keysym_t sym = xcb_key_press_lookup_keysym(symbols, event, event->state);
+        if (sym == XK_Mode_switch) {
+                printf("Mode switch enabled\n");
+                modeswitch_active = true;
+                return 1;
+        }
+
+        if (sym == XK_Return)
+                finish_input();
+
+        if (sym == XK_BackSpace) {
+                if (input_position == 0)
+                        return 1;
+
+                input_position--;
+                free(glyphs_ucs[input_position]);
+                free(glyphs_utf8[input_position]);
+
+                handle_expose(NULL, conn, NULL);
+                return 1;
+        }
+        if (sym == XK_Escape) {
+                exit(0);
+        }
+
+        /* TODO: handle all of these? */
+        printf("is_keypad_key = %d\n", xcb_is_keypad_key(sym));
+        printf("is_private_keypad_key = %d\n", xcb_is_private_keypad_key(sym));
+        printf("xcb_is_cursor_key = %d\n", xcb_is_cursor_key(sym));
+        printf("xcb_is_pf_key = %d\n", xcb_is_pf_key(sym));
+        printf("xcb_is_function_key = %d\n", xcb_is_function_key(sym));
+        printf("xcb_is_misc_function_key = %d\n", xcb_is_misc_function_key(sym));
+        printf("xcb_is_modifier_key = %d\n", xcb_is_modifier_key(sym));
+
+        if (xcb_is_modifier_key(sym) || xcb_is_cursor_key(sym))
+                return 1;
+
+        printf("sym = %c (%d)\n", sym, sym);
+
+        /* convert the keysym to UCS */
+        uint16_t ucs = keysym2ucs(sym);
+        if ((int16_t)ucs == -1) {
+                fprintf(stderr, "Keysym could not be converted to UCS, skipping\n");
+                return 1;
+        }
+
+        /* store the UCS into a string */
+        uint8_t inp[3] = {(ucs & 0xFF00) >> 8, (ucs & 0xFF), 0};
+
+        printf("inp[0] = %02x, inp[1] = %02x, inp[2] = %02x\n", inp[0], inp[1], inp[2]);
+        /* convert it to UTF-8 */
+        char *out = convert_ucs_to_utf8((char*)inp);
+        printf("converted to %s\n", out);
+
+        glyphs_ucs[input_position] = malloc(3 * sizeof(uint8_t));
+        if (glyphs_ucs[input_position] == NULL)
+                err(EXIT_FAILURE, "malloc() failed\n");
+        memcpy(glyphs_ucs[input_position], inp, 3);
+        glyphs_utf8[input_position] = strdup(out);
+        input_position++;
+
+        if (input_position == limit)
+                finish_input();
+
+        handle_expose(NULL, conn, NULL);
+        return 1;
+}
+
+int main(int argc, char *argv[]) {
+        socket_path = getenv("I3SOCK");
+        char *pattern = "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+        int o, option_index = 0;
+
+        static struct option long_options[] = {
+                {"socket", required_argument, 0, 's'},
+                {"version", no_argument, 0, 'v'},
+                {"limit", required_argument, 0, 'l'},
+                {"prompt", required_argument, 0, 'P'},
+                {"prefix", required_argument, 0, 'p'},
+                {"font", required_argument, 0, 'f'},
+                {"help", no_argument, 0, 'h'},
+                {0, 0, 0, 0}
+        };
+
+        char *options_string = "s:p:P:f:l:vh";
+
+        while ((o = getopt_long(argc, argv, options_string, long_options, &option_index)) != -1) {
+                switch (o) {
+                        case 's':
+                                FREE(socket_path);
+                                socket_path = strdup(optarg);
+                                break;
+                        case 'v':
+                                printf("i3-input " I3_VERSION);
+                                return 0;
+                        case 'p':
+                                FREE(command_prefix);
+                                command_prefix = strdup(optarg);
+                                break;
+                        case 'l':
+                                limit = atoi(optarg);
+                                break;
+                        case 'P':
+                                FREE(prompt);
+                                prompt = strdup(optarg);
+                                break;
+                        case 'f':
+                                FREE(pattern);
+                                pattern = strdup(optarg);
+                                break;
+                        case 'h':
+                                printf("i3-input " I3_VERSION);
+                                printf("i3-input [-s <socket>] [-p <prefix>] [-l <limit>] [-P <prompt>] [-f <font>] [-v]\n");
+                                return 0;
+                }
+        }
+
+        if (socket_path == NULL)
+                socket_path = socket_path_from_x11();
+
+        if (socket_path == NULL)
+                socket_path = "/tmp/i3-ipc.sock";
+
+        sockfd = connect_ipc(socket_path);
+
+        if (prompt != NULL)
+                prompt = convert_utf8_to_ucs2(prompt, &prompt_len);
+
+        int screens;
+        xcb_connection_t *conn = xcb_connect(NULL, &screens);
+        if (xcb_connection_has_error(conn))
+                die("Cannot open display\n");
+
+        xcb_screen_t *root_screen = xcb_aux_get_screen(conn, screens);
+        root = root_screen->root;
+
+        modeswitchmask = get_mod_mask(conn, XK_Mode_switch);
+        numlockmask = get_mod_mask(conn, XK_Num_Lock);
+       symbols = xcb_key_symbols_alloc(conn);
+
+        uint32_t font_id = get_font_id(conn, pattern, &font_height);
+
+        /* Open an input window */
+        win = open_input_window(conn, 500, font_height + 8);
+
+        /* Create pixmap */
+        pixmap = xcb_generate_id(conn);
+        pixmap_gc = xcb_generate_id(conn);
+        xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, 500, font_height + 8);
+        xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
+
+        /* Set input focus (we have override_redirect=1, so the wm will not do
+         * this for us) */
+        xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, win, XCB_CURRENT_TIME);
+
+        /* Create graphics context */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_id);
+
+        /* Grab the keyboard to get all input */
+        xcb_flush(conn);
+
+        /* Try (repeatedly, if necessary) to grab the keyboard. We might not
+         * get the keyboard at the first attempt because of the keybinding
+         * still being active when started via a wm’s keybinding. */
+        xcb_grab_keyboard_cookie_t cookie;
+        xcb_grab_keyboard_reply_t *reply = NULL;
+
+        int count = 0;
+        while ((reply == NULL || reply->status != XCB_GRAB_STATUS_SUCCESS) && (count++ < 500)) {
+                cookie = xcb_grab_keyboard(conn, false, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+                reply = xcb_grab_keyboard_reply(conn, cookie, NULL);
+                usleep(1000);
+        }
+
+        if (reply->status != XCB_GRAB_STATUS_SUCCESS) {
+                fprintf(stderr, "Could not grab keyboard, status = %d\n", reply->status);
+                exit(-1);
+        }
+
+        xcb_flush(conn);
+
+        xcb_generic_event_t *event;
+        while ((event = xcb_wait_for_event(conn)) != NULL) {
+                if (event->response_type == 0) {
+                        fprintf(stderr, "X11 Error received! sequence %x\n", event->sequence);
+                        continue;
+                }
+
+                /* Strip off the highest bit (set if the event is generated) */
+                int type = (event->response_type & 0x7F);
+
+                switch (type) {
+                        case XCB_KEY_PRESS:
+                                handle_key_press(NULL, conn, (xcb_key_press_event_t*)event);
+                                break;
+
+                        case XCB_KEY_RELEASE:
+                                handle_key_release(NULL, conn, (xcb_key_release_event_t*)event);
+                                break;
+
+                        case XCB_EXPOSE:
+                                handle_expose(NULL, conn, (xcb_expose_event_t*)event);
+                                break;
+                }
+
+                free(event);
+        }
+
+        return 0;
+}
diff --git a/i3-input/ucs2_to_utf8.c b/i3-input/ucs2_to_utf8.c
new file mode 100644 (file)
index 0000000..4557c9d
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <err.h>
+#include <iconv.h>
+
+static iconv_t conversion_descriptor = 0;
+static iconv_t conversion_descriptor2 = 0;
+
+/*
+ * Returns the input string, but converted from UCS-2 to UTF-8. Memory will be
+ * allocated, thus the caller has to free the output.
+ *
+ */
+char *convert_ucs_to_utf8(char *input) {
+       size_t input_size = 2;
+       /* UTF-8 may consume up to 4 byte */
+       int buffer_size = 8;
+
+       char *buffer = calloc(buffer_size, 1);
+        if (buffer == NULL)
+                err(EXIT_FAILURE, "malloc() failed\n");
+       size_t output_size = buffer_size;
+       /* We need to use an additional pointer, because iconv() modifies it */
+       char *output = buffer;
+
+       /* We convert the input into UCS-2 big endian */
+        if (conversion_descriptor == 0) {
+                conversion_descriptor = iconv_open("UTF-8", "UCS-2BE");
+                if (conversion_descriptor == 0) {
+                        fprintf(stderr, "error opening the conversion context\n");
+                        exit(1);
+                }
+        }
+
+       /* Get the conversion descriptor back to original state */
+       iconv(conversion_descriptor, NULL, NULL, NULL, NULL);
+
+       /* Convert our text */
+       int rc = iconv(conversion_descriptor, (void*)&input, &input_size, &output, &output_size);
+        if (rc == (size_t)-1) {
+                perror("Converting to UCS-2 failed");
+                return NULL;
+       }
+
+       return buffer;
+}
+
+/*
+ * Converts the given string to UCS-2 big endian for use with
+ * xcb_image_text_16(). The amount of real glyphs is stored in real_strlen,
+ * a buffer containing the UCS-2 encoded string (16 bit per glyph) is
+ * returned. It has to be freed when done.
+ *
+ */
+char *convert_utf8_to_ucs2(char *input, int *real_strlen) {
+       size_t input_size = strlen(input) + 1;
+       /* UCS-2 consumes exactly two bytes for each glyph */
+       int buffer_size = input_size * 2;
+
+       char *buffer = malloc(buffer_size);
+        if (buffer == NULL)
+                err(EXIT_FAILURE, "malloc() failed\n");
+       size_t output_size = buffer_size;
+       /* We need to use an additional pointer, because iconv() modifies it */
+       char *output = buffer;
+
+       /* We convert the input into UCS-2 big endian */
+        if (conversion_descriptor2 == 0) {
+                conversion_descriptor2 = iconv_open("UCS-2BE", "UTF-8");
+                if (conversion_descriptor2 == 0) {
+                        fprintf(stderr, "error opening the conversion context\n");
+                        exit(1);
+                }
+        }
+
+       /* Get the conversion descriptor back to original state */
+       iconv(conversion_descriptor2, NULL, NULL, NULL, NULL);
+
+       /* Convert our text */
+       int rc = iconv(conversion_descriptor2, (void*)&input, &input_size, &output, &output_size);
+        if (rc == (size_t)-1) {
+                perror("Converting to UCS-2 failed");
+                if (real_strlen != NULL)
+                       *real_strlen = 0;
+                return NULL;
+       }
+
+        if (real_strlen != NULL)
+               *real_strlen = ((buffer_size - output_size) / 2) - 1;
+
+       return buffer;
+}
+
diff --git a/i3-input/xcb.c b/i3-input/xcb.c
new file mode 100644 (file)
index 0000000..3c1d99e
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/keysym.h>
+
+#include "i3-input.h"
+
+/*
+ * Convenience-wrapper around xcb_change_gc which saves us declaring a variable
+ *
+ */
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value) {
+        xcb_change_gc(conn, gc, mask, &value);
+}
+
+/*
+ * Returns the colorpixel to use for the given hex color (think of HTML).
+ *
+ * The hex_color has to start with #, for example #FF00FF.
+ *
+ * NOTE that get_colorpixel() does _NOT_ check the given color code for validity.
+ * This has to be done by the caller.
+ *
+ */
+uint32_t get_colorpixel(xcb_connection_t *conn, char *hex) {
+        char strgroups[3][3] = {{hex[1], hex[2], '\0'},
+                                {hex[3], hex[4], '\0'},
+                                {hex[5], hex[6], '\0'}};
+        uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)),
+                             (strtol(strgroups[1], NULL, 16)),
+                             (strtol(strgroups[2], NULL, 16))};
+
+        return (rgb16[0] << 16) + (rgb16[1] << 8) + rgb16[2];
+}
+
+/*
+ * Returns the mask for Mode_switch (to be used for looking up keysymbols by
+ * keycode).
+ *
+ */
+uint32_t get_mod_mask(xcb_connection_t *conn, uint32_t keycode) {
+       xcb_key_symbols_t *symbols = xcb_key_symbols_alloc(conn);
+
+       xcb_get_modifier_mapping_reply_t *modmap_r;
+       xcb_keycode_t *modmap, kc;
+       xcb_keycode_t *modeswitchcodes = xcb_key_symbols_get_keycode(symbols, keycode);
+       if (modeswitchcodes == NULL)
+               return 0;
+
+       modmap_r = xcb_get_modifier_mapping_reply(conn, xcb_get_modifier_mapping(conn), NULL);
+       modmap = xcb_get_modifier_mapping_keycodes(modmap_r);
+
+       for (int i = 0; i < 8; i++)
+               for (int j = 0; j < modmap_r->keycodes_per_modifier; j++) {
+                       kc = modmap[i * modmap_r->keycodes_per_modifier + j];
+                       for (xcb_keycode_t *ktest = modeswitchcodes; *ktest; ktest++) {
+                               if (*ktest != kc)
+                                       continue;
+
+                               free(modeswitchcodes);
+                               free(modmap_r);
+                               return (1 << i);
+                       }
+               }
+
+       return 0;
+}
+
+/*
+ * Opens the window we use for input/output and maps it
+ *
+ */
+xcb_window_t open_input_window(xcb_connection_t *conn, uint32_t width, uint32_t height) {
+        xcb_window_t win = xcb_generate_id(conn);
+        //xcb_cursor_t cursor_id = xcb_generate_id(conn);
+
+#if 0
+        /* Use the default cursor (left pointer) */
+        if (cursor > -1) {
+                i3Font *cursor_font = load_font(conn, "cursor");
+                xcb_create_glyph_cursor(conn, cursor_id, cursor_font->id, cursor_font->id,
+                                XCB_CURSOR_LEFT_PTR, XCB_CURSOR_LEFT_PTR + 1,
+                                0, 0, 0, 65535, 65535, 65535);
+        }
+#endif
+
+        uint32_t mask = 0;
+        uint32_t values[3];
+
+        mask |= XCB_CW_BACK_PIXEL;
+        values[0] = 0;
+
+        mask |= XCB_CW_OVERRIDE_REDIRECT;
+        values[1] = 1;
+
+       mask |= XCB_CW_EVENT_MASK;
+       values[2] = XCB_EVENT_MASK_EXPOSURE;
+
+        xcb_create_window(conn,
+                          XCB_COPY_FROM_PARENT,
+                          win, /* the window id */
+                          root, /* parent == root */
+                          50, 50, width, height, /* dimensions */
+                          0, /* border = 0, we draw our own */
+                          XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                          XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
+                          mask,
+                          values);
+
+#if 0
+        if (cursor > -1)
+                xcb_change_window_attributes(conn, result, XCB_CW_CURSOR, &cursor_id);
+#endif
+
+        /* Map the window (= make it visible) */
+        xcb_map_window(conn, win);
+
+       return win;
+}
+
+/*
+ * Returns the ID of the font matching the given pattern and stores the height
+ * of the font (in pixels) in *font_height. die()s if no font matches.
+ *
+ */
+int get_font_id(xcb_connection_t *conn, char *pattern, int *font_height) {
+        xcb_void_cookie_t font_cookie;
+        xcb_list_fonts_with_info_cookie_t info_cookie;
+
+        /* Send all our requests first */
+        int result;
+        result = xcb_generate_id(conn);
+        font_cookie = xcb_open_font_checked(conn, result, strlen(pattern), pattern);
+        info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
+
+        xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
+        if (error != NULL) {
+                fprintf(stderr, "ERROR: Could not open font: %d\n", error->error_code);
+                exit(1);
+        }
+
+        /* Get information (height/name) for this font */
+        xcb_list_fonts_with_info_reply_t *reply = xcb_list_fonts_with_info_reply(conn, info_cookie, NULL);
+        if (reply == NULL)
+                die("Could not load font \"%s\"\n", pattern);
+
+        *font_height = reply->font_ascent + reply->font_descent;
+
+        return result;
+}
diff --git a/i3-migrate-config-to-v4 b/i3-migrate-config-to-v4
new file mode 100755 (executable)
index 0000000..5f20cba
--- /dev/null
@@ -0,0 +1,358 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+#
+# script to migrate an old config file (i3 < 4.0) to the new format (>= 4.0)
+# this script only uses modules which come with perl 5.10
+#
+# reads an i3 v3 config from stdin and spits out a v4 config on stdout
+# exit codes:
+#     0 = the input was a v3 config
+#     1 = the input was already a v4 config
+#         (the config is printed to stdout nevertheless)
+#
+# © 2011 Michael Stapelberg and contributors, see LICENSE
+
+use strict;
+use warnings;
+use Getopt::Long;
+use v5.10;
+
+# is this a version 3 config file? disables auto-detection
+my $v3 = 0;
+my $result = GetOptions('v3' => \$v3);
+
+# reads stdin
+sub slurp {
+    local $/;
+    <>;
+}
+
+my @unchanged = qw(
+    font
+    set
+    mode
+    exec
+    assign
+    floating_modifier
+    focus_follows_mouse
+    ipc-socket
+    ipc_socket
+    client.focused
+    client.focused_inactive
+    client.unfocused
+    client.urgent
+    client.background
+);
+
+my %workspace_names;
+my $workspace_bar = 1;
+
+my $input = slurp();
+my @lines = split /\n/, $input;
+
+# remove whitespaces in the beginning of lines
+@lines = map { s/^[ \t]*//g; $_ } @lines;
+
+# Try to auto-detect if this is a v3 config file.
+sub need_to_convert {
+    # If the user passed --v3, we need to convert in any case
+    return 1 if $v3;
+
+    for my $line (@lines) {
+        # only v4 configfiles can use bindcode or workspace_layout
+        return 0 if $line =~ /^bindcode/ ||
+                    $line =~ /^workspace_layout/ ||
+                    $line =~ /^force_focus_wrapping/;
+
+        # have a look at bindings
+        next unless $line =~ /^bind/;
+
+        my ($statement, $key, $command) = ($line =~ /([a-zA-Z_-]+)[ \t]+([^ \t]+)[ \t]+(.*)/);
+        return 0 if $command =~ /^layout/ ||
+                    $command =~ /^floating/ ||
+                    $command =~ /^workspace/ ||
+                    $command =~ /^focus (left|right|up|down)/ ||
+                    $command =~ /^border (normal|1pixel|none)/;
+    }
+
+    return 1;
+}
+
+if (!need_to_convert()) {
+    # If this is already a v4 config file, we will spit out the lines
+    # and exit with return code 1
+    print $input;
+    exit 1;
+}
+
+# first pass: get workspace names
+for my $line (@lines) {
+    next if $line =~ /^#/ || $line =~ /^$/;
+
+    my ($statement, $parameters) = ($line =~ /([a-zA-Z._-]+)(.*)/);
+
+    # skip everything but workspace lines
+    next unless defined($statement) and $statement eq 'workspace';
+
+    my ($number, $params) = ($parameters =~ /[ \t]+([0-9]+) (.+)/);
+
+    # save workspace name (unless the line is actually a workspace assignment)
+    $workspace_names{$number} = $params unless $params =~ /^output/;
+}
+
+for my $line (@lines) {
+    # directly use comments and empty lines
+    if ($line =~ /^#/ || $line =~ /^$/) {
+        print "$line\n";
+        next;
+    }
+
+    my ($statement, $parameters) = ($line =~ /([a-zA-Z._-]+)(.*)/);
+
+    # directly use lines which have not changed between 3.x and 4.x
+    if (!defined($statement) || (lc $statement ~~ @unchanged)) {
+        print "$line\n";
+        next;
+    }
+
+    # new_container changed only the statement name to workspace_layout
+    if ($statement eq 'new_container') {
+        # TODO: new_container stack-limit
+        print "workspace_layout$parameters\n";
+        next;
+    }
+
+    # workspace_bar is gone, you should use i3bar now
+    if ($statement eq 'workspace_bar') {
+        $workspace_bar = ($parameters =~ /[ \t+](yes|true|on|enable|active)/);
+        print "# XXX: REMOVED workspace_bar line. There is no internal workspace bar in v4.\n";
+        next;
+    }
+
+    # new_window changed the parameters from bb to none etc.
+    if ($statement eq 'new_window') {
+        if ($parameters =~ /bb/) {
+            print "new_window none\n";
+        } elsif ($parameters =~ /bp/) {
+            print "new_window 1pixel\n";
+        } elsif ($parameters =~ /bn/) {
+            print "new_window normal\n";
+        } else {
+            print "# XXX: Invalid parameter for new_window, not touching line:\n";
+            print "$line\n";
+        }
+        next;
+    }
+
+    # bar colors are obsolete, need to be configured in i3bar
+    if ($statement =~ /^bar\./) {
+        print "# XXX: REMOVED $statement, configure i3bar instead.\n";
+        print "# Old line: $line\n";
+        next;
+    }
+
+    # one form of this is still ok (workspace assignments), the other (named workspaces) isn’t
+    if ($statement eq 'workspace') {
+        my ($number, $params) = ($parameters =~ /[ \t]+([0-9]+) (.+)/);
+        if ($params =~ /^output/) {
+            print "$line\n";
+            next;
+        } else {
+            print "# XXX: workspace name will end up in the corresponding bindings.\n";
+            next;
+        }
+    }
+
+    if ($statement eq 'bind' || $statement eq 'bindsym') {
+        convert_command($line);
+        next;
+    }
+
+    print "# XXX: migration script could not handle line: $line\n";
+}
+
+#
+# Converts a command (after bind/bindsym)
+#
+sub convert_command {
+    my ($line) = @_;
+
+    my @unchanged_cmds = qw(
+        exec
+        mark
+        kill
+        restart
+        reload
+        exit
+        stack-limit
+    );
+
+    my ($statement, $key, $command) = ($line =~ /([a-zA-Z_-]+)[ \t]+([^ \t]+)[ \t]+(.*)/);
+
+    # turn 'bind' to 'bindcode'
+    $statement = 'bindcode' if $statement eq 'bind';
+
+    # check if it’s one of the unchanged commands
+    my ($cmd) = ($command =~ /([a-zA-Z_-]+)/);
+    if ($cmd ~~ @unchanged_cmds) {
+        print "$statement $key $command\n";
+        return;
+    }
+
+    # simple replacements
+    my @replace = (
+        qr/^s/ => 'layout stacking',
+        qr/^d/ => 'layout default',
+        qr/^T/ => 'layout tabbed',
+        qr/^f($|[^go])/ => 'fullscreen',
+        qr/^fg/ => 'fullscreen global',
+        qr/^t/ => 'floating toggle',
+        qr/^h/ => 'focus left',
+        qr/^j($|[^u])/ => 'focus down',
+        qr/^k/ => 'focus up',
+        qr/^l/ => 'focus right',
+        qr/^mh/ => 'move left',
+        qr/^mj/ => 'move down',
+        qr/^mk/ => 'move up',
+        qr/^ml/ => 'move right',
+        qr/^bn/ => 'border normal',
+        qr/^bp/ => 'border 1pixel',
+        qr/^bb/ => 'border none',
+        qr/^bt/ => 'border toggle',
+        qr/^pw/ => 'workspace prev',
+        qr/^nw/ => 'workspace next',
+    );
+
+    my $replaced = 0;
+    for (my $c = 0; $c < @replace; $c += 2) {
+        if ($command =~ $replace[$c]) {
+            $command = $replace[$c+1];
+            $replaced = 1;
+            last;
+        }
+    }
+
+    # goto command is now obsolete due to criteria + focus command
+    if ($command =~ /^goto/) {
+        my ($mark) = ($command =~ /^goto (.*)/);
+        print qq|$statement $key [con_mark="$mark"] focus\n|;
+        return;
+    }
+
+    # the jump command is also obsolete due to criteria + focus
+    if ($command =~ /^jump/) {
+        my ($params) = ($command =~ /^jump (.*)/);
+        if ($params =~ /^"/) {
+            # jump ["]window class[/window title]["]
+            ($params) = ($params =~ /^"([^"]+)"/);
+
+            # check if a window title was specified
+            if ($params =~ m,/,) {
+                my ($class, $title) = ($params =~ m,([^/]+)/(.+),);
+                print qq|$statement $key [class="$class" title="$title"] focus\n|;
+            } else {
+                print qq|$statement $key [class="$params"] focus\n|;
+            }
+            return;
+        } else {
+            # jump <workspace> [ column row ]
+            print "# XXX: jump workspace is obsolete in 4.x: $line\n";
+            return;
+        }
+    }
+
+    if (!$replaced && $command =~ /^focus/) {
+        my ($what) = ($command =~ /^focus (.*)/);
+        $what =~ s/[ \t]//g;
+        if ($what eq 'ft') {
+            $what = 'mode_toggle';
+        } elsif ($what eq 'floating' || $what eq 'tiling') {
+            # those are unchanged
+        } else {
+            print "# XXX: focus <number> is obsolete in 4.x: $line\n";
+            return;
+        }
+        print qq|$statement $key focus $what\n|;
+        return;
+    }
+
+    if ($command =~ /^mode/) {
+        my ($parameters) = ($command =~ /^mode (.*)/);
+        print qq|$statement $key mode "$parameters"\n|;
+        return;
+    }
+
+    # the parameters of the resize command have changed
+    if ($command =~ /^resize/) {
+        # OLD: resize <left|right|top|bottom> [+|-]<pixels>\n")
+        # NEW: resize <grow|shrink> <direction> [<px> px] [or <ppt> ppt]
+        my ($direction, $sign, $px) = ($command =~ /^resize (left|right|top|bottom) ([+-])([0-9]+)/);
+        my $cmd = 'resize ';
+        $cmd .= ($sign eq '+' ? 'grow' : 'shrink') . ' ';
+        $cmd .= "$direction ";
+        $cmd .= "$px px";
+        print qq|$statement $key $cmd\n|;
+        return;
+    }
+
+    # switch workspace
+    if ($command =~ /^[0-9]+/) {
+        my ($number) = ($command =~ /^([0-9]+)/);
+        if (exists $workspace_names{$number}) {
+            print qq|$statement $key workspace $workspace_names{$number}\n|;
+            return;
+        } else {
+            print qq|$statement $key workspace $number\n|;
+            return;
+        }
+    }
+
+    # move to workspace
+    if ($command =~ /^m[0-9]+/) {
+        my ($number) = ($command =~ /^m([0-9]+)/);
+        if (exists $workspace_names{$number}) {
+            print qq|$statement $key move workspace $workspace_names{$number}\n|;
+            return;
+        } else {
+            print qq|$statement $key move workspace $number\n|;
+            return;
+        }
+    }
+
+    # With Container-commands are now obsolete due to different abstraction
+    if ($command =~ /^wc/) {
+        $command =~ s/^wc//g;
+        my $wc_replaced = 0;
+        for (my $c = 0; $c < @replace; $c += 2) {
+            if ($command =~ $replace[$c]) {
+                $command = $replace[$c+1];
+                $wc_replaced = 1;
+                last;
+            }
+        }
+        if (!$wc_replaced) {
+            print "# XXX: migration script could not handle command: $line\n";
+        } else {
+            # NOTE: This is not 100% accurate, as it only works for one level
+            # of nested containers. As this is a common use case, we use 'focus
+            # parent; $command' nevertheless. For advanced use cases, the user
+            # has to modify his config.
+            print "$statement $key focus parent; $command\n";
+        }
+        return;
+    }
+
+    if ($replaced) {
+        print "$statement $key $command\n";
+    } else {
+        print "# XXX: migration script could not handle command: $line\n";
+    }
+}
+
+
+# add an i3bar invocation automatically if no 'workspace_bar no' was found
+if ($workspace_bar) {
+    print "\n";
+    print "# XXX: Automatically added a call to i3bar to provide a workspace bar\n";
+    print "exec i3status | i3bar -d\n";
+}
diff --git a/i3-msg/Makefile b/i3-msg/Makefile
new file mode 100644 (file)
index 0000000..1b7c1c0
--- /dev/null
@@ -0,0 +1,32 @@
+# Default value so one can compile i3-msg standalone
+TOPDIR=..
+
+include $(TOPDIR)/common.mk
+
+CFLAGS += -I$(TOPDIR)/include
+
+# Depend on the object files of all source-files in src/*.c and on all header files
+FILES=$(patsubst %.c,%.o,$(wildcard *.c))
+HEADERS=$(wildcard *.h)
+
+# Depend on the specific file (.c for each .o) and on all headers
+%.o: %.c ${HEADERS}
+       echo "CC $<"
+       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+
+all: i3-msg
+
+i3-msg: ${FILES}
+       echo "LINK i3-msg"
+       $(CC) $(LDFLAGS) -o i3-msg ${FILES} $(LIBS)
+
+install: all
+       echo "INSTALL"
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/bin
+       $(INSTALL) -m 0755 i3-msg $(DESTDIR)$(PREFIX)/bin/
+
+clean:
+       rm -f *.o
+
+distclean: clean
+       rm -f i3-msg
diff --git a/i3-msg/main.c b/i3-msg/main.c
new file mode 100644 (file)
index 0000000..630a345
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * i3-msg/main.c: Utility which sends messages to a running i3-instance using
+ * IPC via UNIX domain sockets.
+ *
+ * This serves as an example for how to send your own messages to i3.
+ * Additionally, it’s even useful sometimes :-).
+ *
+ */
+#include <ev.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <err.h>
+#include <stdint.h>
+#include <getopt.h>
+#include <limits.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
+
+#include <i3/ipc.h>
+
+static char *socket_path;
+
+/*
+ * Try to get the socket path from X11 and return NULL if it doesn’t work.
+ * As i3-msg is a short-running tool, we don’t bother with cleaning up the
+ * connection and leave it up to the operating system on exit.
+ *
+ */
+static char *socket_path_from_x11() {
+    xcb_connection_t *conn;
+    int screen;
+    if ((conn = xcb_connect(NULL, &screen)) == NULL ||
+        xcb_connection_has_error(conn))
+        return NULL;
+    xcb_screen_t *root_screen = xcb_aux_get_screen(conn, screen);
+    xcb_window_t root = root_screen->root;
+
+    xcb_intern_atom_cookie_t atom_cookie;
+    xcb_intern_atom_reply_t *atom_reply;
+
+    atom_cookie = xcb_intern_atom(conn, 0, strlen("I3_SOCKET_PATH"), "I3_SOCKET_PATH");
+    atom_reply = xcb_intern_atom_reply(conn, atom_cookie, NULL);
+    if (atom_reply == NULL)
+        return NULL;
+
+    xcb_get_property_cookie_t prop_cookie;
+    xcb_get_property_reply_t *prop_reply;
+    prop_cookie = xcb_get_property_unchecked(conn, false, root, atom_reply->atom,
+                                             XCB_GET_PROPERTY_TYPE_ANY, 0, PATH_MAX);
+    prop_reply = xcb_get_property_reply(conn, prop_cookie, NULL);
+    if (prop_reply == NULL || xcb_get_property_value_length(prop_reply) == 0)
+        return NULL;
+    if (asprintf(&socket_path, "%.*s", xcb_get_property_value_length(prop_reply),
+                 (char*)xcb_get_property_value(prop_reply)) == -1)
+        return NULL;
+    return socket_path;
+}
+
+/*
+ * Formats a message (payload) of the given size and type and sends it to i3 via
+ * the given socket file descriptor.
+ *
+ */
+static void ipc_send_message(int sockfd, uint32_t message_size,
+                             uint32_t message_type, uint8_t *payload) {
+    int buffer_size = strlen(I3_IPC_MAGIC) + sizeof(uint32_t) + sizeof(uint32_t) + message_size;
+    char msg[buffer_size];
+    char *walk = msg;
+
+    strcpy(walk, I3_IPC_MAGIC);
+    walk += strlen(I3_IPC_MAGIC);
+    memcpy(walk, &message_size, sizeof(uint32_t));
+    walk += sizeof(uint32_t);
+    memcpy(walk, &message_type, sizeof(uint32_t));
+    walk += sizeof(uint32_t);
+    memcpy(walk, payload, message_size);
+
+    int sent_bytes = 0;
+    int bytes_to_go = buffer_size;
+    while (sent_bytes < bytes_to_go) {
+        int n = write(sockfd, msg + sent_bytes, bytes_to_go);
+        if (n == -1)
+            err(EXIT_FAILURE, "write() failed");
+
+        sent_bytes += n;
+        bytes_to_go -= n;
+    }
+}
+
+static void ipc_recv_message(int sockfd, uint32_t message_type,
+                             uint32_t *reply_length, uint8_t **reply) {
+    /* Read the message header first */
+    uint32_t to_read = strlen(I3_IPC_MAGIC) + sizeof(uint32_t) + sizeof(uint32_t);
+    char msg[to_read];
+    char *walk = msg;
+
+    uint32_t read_bytes = 0;
+    while (read_bytes < to_read) {
+        int n = read(sockfd, msg + read_bytes, to_read);
+        if (n == -1)
+            err(EXIT_FAILURE, "read() failed");
+        if (n == 0)
+            errx(EXIT_FAILURE, "received EOF instead of reply");
+
+        read_bytes += n;
+        to_read -= n;
+    }
+
+    if (memcmp(walk, I3_IPC_MAGIC, strlen(I3_IPC_MAGIC)) != 0)
+        errx(EXIT_FAILURE, "invalid magic in reply");
+
+    walk += strlen(I3_IPC_MAGIC);
+    *reply_length = *((uint32_t*)walk);
+    walk += sizeof(uint32_t);
+    if (*((uint32_t*)walk) != message_type)
+        errx(EXIT_FAILURE, "unexpected reply type (got %d, expected %d)", *((uint32_t*)walk), message_type);
+    walk += sizeof(uint32_t);
+
+    *reply = malloc(*reply_length);
+    if ((*reply) == NULL)
+        err(EXIT_FAILURE, "malloc() failed");
+
+    to_read = *reply_length;
+    read_bytes = 0;
+    while (read_bytes < to_read) {
+        int n = read(sockfd, *reply + read_bytes, to_read);
+        if (n == -1)
+            err(EXIT_FAILURE, "read() failed");
+
+        read_bytes += n;
+        to_read -= n;
+    }
+}
+
+int main(int argc, char *argv[]) {
+    socket_path = getenv("I3SOCK");
+    int o, option_index = 0;
+    int message_type = I3_IPC_MESSAGE_TYPE_COMMAND;
+    char *payload = NULL;
+    bool quiet = false;
+
+    static struct option long_options[] = {
+        {"socket", required_argument, 0, 's'},
+        {"type", required_argument, 0, 't'},
+        {"version", no_argument, 0, 'v'},
+        {"quiet", no_argument, 0, 'q'},
+        {"help", no_argument, 0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    char *options_string = "s:t:vhq";
+
+    while ((o = getopt_long(argc, argv, options_string, long_options, &option_index)) != -1) {
+        if (o == 's') {
+            if (socket_path != NULL)
+                free(socket_path);
+            socket_path = strdup(optarg);
+        } else if (o == 't') {
+            if (strcasecmp(optarg, "command") == 0)
+                message_type = I3_IPC_MESSAGE_TYPE_COMMAND;
+            else if (strcasecmp(optarg, "get_workspaces") == 0)
+                message_type = I3_IPC_MESSAGE_TYPE_GET_WORKSPACES;
+            else if (strcasecmp(optarg, "get_outputs") == 0)
+                message_type = I3_IPC_MESSAGE_TYPE_GET_OUTPUTS;
+            else if (strcasecmp(optarg, "get_tree") == 0)
+                message_type = I3_IPC_MESSAGE_TYPE_GET_TREE;
+            else {
+                printf("Unknown message type\n");
+                printf("Known types: command, get_workspaces, get_outputs, get_tree\n");
+                exit(EXIT_FAILURE);
+            }
+        } else if (o == 'q') {
+            quiet = true;
+        } else if (o == 'v') {
+            printf("i3-msg " I3_VERSION "\n");
+            return 0;
+        } else if (o == 'h') {
+            printf("i3-msg " I3_VERSION "\n");
+            printf("i3-msg [-s <socket>] [-t <type>] <message>\n");
+            return 0;
+        }
+    }
+
+    if (socket_path == NULL)
+        socket_path = socket_path_from_x11();
+
+    /* Fall back to the default socket path */
+    if (socket_path == NULL)
+        socket_path = strdup("/tmp/i3-ipc.sock");
+
+    /* Use all arguments, separated by whitespace, as payload.
+     * This way, you don’t have to do i3-msg 'mark foo', you can use
+     * i3-msg mark foo */
+    while (optind < argc) {
+        if (!payload) {
+            if (!(payload = strdup(argv[optind])))
+                err(EXIT_FAILURE, "strdup(argv[optind])");
+        } else {
+            char *both;
+            if (asprintf(&both, "%s %s", payload, argv[optind]) == -1)
+                err(EXIT_FAILURE, "asprintf");
+            free(payload);
+            payload = both;
+        }
+        optind++;
+    }
+
+    if (!payload)
+        payload = "";
+
+    int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
+    if (sockfd == -1)
+        err(EXIT_FAILURE, "Could not create socket");
+
+    struct sockaddr_un addr;
+    memset(&addr, 0, sizeof(struct sockaddr_un));
+    addr.sun_family = AF_LOCAL;
+    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
+    if (connect(sockfd, (const struct sockaddr*)&addr, sizeof(struct sockaddr_un)) < 0)
+        err(EXIT_FAILURE, "Could not connect to i3");
+
+    ipc_send_message(sockfd, strlen(payload), message_type, (uint8_t*)payload);
+
+    if (quiet)
+        return 0;
+
+    uint32_t reply_length;
+    uint8_t *reply;
+    ipc_recv_message(sockfd, message_type, &reply_length, &reply);
+    printf("%.*s", reply_length, reply);
+    free(reply);
+
+    close(sockfd);
+
+    return 0;
+}
diff --git a/i3-nagbar/Makefile b/i3-nagbar/Makefile
new file mode 100644 (file)
index 0000000..933ae76
--- /dev/null
@@ -0,0 +1,30 @@
+# Default value so one can compile i3-nagbar standalone
+TOPDIR=..
+
+include $(TOPDIR)/common.mk
+
+# Depend on the object files of all source-files in src/*.c and on all header files
+FILES=$(patsubst %.c,%.o,$(wildcard *.c))
+HEADERS=$(wildcard *.h)
+
+# Depend on the specific file (.c for each .o) and on all headers
+%.o: %.c ${HEADERS}
+       echo "CC $<"
+       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+
+all: i3-nagbar
+
+i3-nagbar: ${FILES}
+       echo "LINK i3-nagbar"
+       $(CC) $(LDFLAGS) -o $@ ${FILES} $(LIBS)
+
+install: all
+       echo "INSTALL"
+       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/bin
+       $(INSTALL) -m 0755 i3-nagbar $(DESTDIR)$(PREFIX)/bin/
+
+clean:
+       rm -f *.o
+
+distclean: clean
+       rm -f i3-nagbar
diff --git a/i3-nagbar/atoms.xmacro b/i3-nagbar/atoms.xmacro
new file mode 100644 (file)
index 0000000..333ba2d
--- /dev/null
@@ -0,0 +1,6 @@
+xmacro(_NET_WM_WINDOW_TYPE)
+xmacro(_NET_WM_WINDOW_TYPE_DOCK)
+xmacro(_NET_WM_STRUT_PARTIAL)
+xmacro(I3_SOCKET_PATH)
+xmacro(ATOM)
+xmacro(CARDINAL)
diff --git a/i3-nagbar/i3-nagbar.h b/i3-nagbar/i3-nagbar.h
new file mode 100644 (file)
index 0000000..2fbe3cb
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef _I3_NAGBAR
+#define _I3_NAGBAR
+
+#include <err.h>
+
+#define die(...) errx(EXIT_FAILURE, __VA_ARGS__);
+#define FREE(pointer) do { \
+        if (pointer != NULL) { \
+                free(pointer); \
+                pointer = NULL; \
+        } \
+} \
+while (0)
+
+#define xmacro(atom) xcb_atom_t A_ ## atom;
+#include "atoms.xmacro"
+#undef xmacro
+
+extern xcb_window_t root;
+
+uint32_t get_colorpixel(xcb_connection_t *conn, char *hex);
+xcb_window_t open_input_window(xcb_connection_t *conn, uint32_t width, uint32_t height);
+int get_font_id(xcb_connection_t *conn, char *pattern, int *font_height);
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value);
+
+#endif
diff --git a/i3-nagbar/main.c b/i3-nagbar/main.c
new file mode 100644 (file)
index 0000000..d0d7e77
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * i3-nagbar is a utility which displays a nag message.
+ *
+ */
+#include <ev.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <err.h>
+#include <stdint.h>
+#include <getopt.h>
+#include <limits.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_event.h>
+
+#include "i3-nagbar.h"
+
+typedef struct {
+    char *label;
+    char *action;
+    int16_t x;
+    uint16_t width;
+} button_t;
+
+static xcb_window_t win;
+static xcb_pixmap_t pixmap;
+static xcb_gcontext_t pixmap_gc;
+static xcb_rectangle_t rect = { 0, 0, 600, 20 };
+static int font_height;
+static char *prompt = "Please do not run this program.";
+static button_t *buttons;
+static int buttoncnt;
+xcb_window_t root;
+
+/*
+ * Starts the given application by passing it through a shell. We use double fork
+ * to avoid zombie processes. As the started application’s parent exits (immediately),
+ * the application is reparented to init (process-id 1), which correctly handles
+ * childs, so we don’t have to do it :-).
+ *
+ * The shell is determined by looking for the SHELL environment variable. If it
+ * does not exist, /bin/sh is used.
+ *
+ */
+static void start_application(const char *command) {
+    printf("executing: %s\n", command);
+    if (fork() == 0) {
+        /* Child process */
+        setsid();
+        if (fork() == 0) {
+            /* Stores the path of the shell */
+            static const char *shell = NULL;
+
+            if (shell == NULL)
+                if ((shell = getenv("SHELL")) == NULL)
+                    shell = "/bin/sh";
+
+            /* This is the child */
+            execl(shell, shell, "-c", command, (void*)NULL);
+            /* not reached */
+        }
+        exit(0);
+    }
+    wait(0);
+}
+
+static button_t *get_button_at(int16_t x, int16_t y) {
+    for (int c = 0; c < buttoncnt; c++)
+        if (x >= (buttons[c].x) && x <= (buttons[c].x + buttons[c].width))
+            return &buttons[c];
+
+    return NULL;
+}
+
+static void handle_button_press(xcb_connection_t *conn, xcb_button_press_event_t *event) {
+    printf("button pressed on x = %d, y = %d\n",
+            event->event_x, event->event_y);
+    /* TODO: set a flag for the button, re-render */
+}
+
+/*
+ * Called when the user releases the mouse button. Checks whether the
+ * coordinates are over a button and executes the appropriate action.
+ *
+ */
+static void handle_button_release(xcb_connection_t *conn, xcb_button_release_event_t *event) {
+    printf("button released on x = %d, y = %d\n",
+            event->event_x, event->event_y);
+    /* If the user hits the close button, we exit(0) */
+    if (event->event_x >= (rect.width - 32))
+        exit(0);
+    button_t *button = get_button_at(event->event_x, event->event_y);
+    if (!button)
+        return;
+    start_application(button->action);
+
+    /* TODO: unset flag, re-render */
+}
+
+/*
+ * Handles expose events (redraws of the window) and rendering in general. Will
+ * be called from the code with event == NULL or from X with event != NULL.
+ *
+ */
+static int handle_expose(xcb_connection_t *conn, xcb_expose_event_t *event) {
+    printf("expose!\n");
+
+    /* re-draw the background */
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#900000"));
+    xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &rect);
+
+    /* restore font color */
+    uint32_t values[3];
+    values[0] = get_colorpixel(conn, "#FFFFFF");
+    values[1] = get_colorpixel(conn, "#900000");
+    xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND | XCB_GC_BACKGROUND, values);
+    xcb_image_text_8(conn, strlen(prompt), pixmap, pixmap_gc, 4 + 4/* X */,
+                      font_height + 2 + 4 /* Y = baseline of font */, prompt);
+
+    /* render close button */
+    int line_width = 4;
+    int w = 20;
+    int y = rect.width;
+    values[0] = get_colorpixel(conn, "#680a0a");
+    values[1] = line_width;
+    xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND | XCB_GC_LINE_WIDTH, values);
+
+    xcb_rectangle_t close = { y - w - (2 * line_width), 0, w + (2 * line_width), rect.height };
+    xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &close);
+
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#d92424"));
+    xcb_point_t points[] = {
+        { y - w - (2 * line_width), line_width / 2 },
+        { y - (line_width / 2), line_width / 2 },
+        { y - (line_width / 2), (rect.height - (line_width / 2)) - 2 },
+        { y - w - (2 * line_width), (rect.height - (line_width / 2)) - 2 },
+        { y - w - (2 * line_width), line_width / 2 }
+    };
+    xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, pixmap, pixmap_gc, 5, points);
+
+    values[0] = get_colorpixel(conn, "#ffffff");
+    values[1] = get_colorpixel(conn, "#680a0a");
+    values[2] = 1;
+    xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_LINE_WIDTH, values);
+    xcb_image_text_8(conn, strlen("x"), pixmap, pixmap_gc, y - w - line_width + (w / 2) - 4/* X */,
+                      font_height + 2 + 4 - 1/* Y = baseline of font */, "X");
+    y -= w;
+
+    y -= 20;
+
+    /* render custom buttons */
+    line_width = 1;
+    for (int c = 0; c < buttoncnt; c++) {
+        /* TODO: make w = text extents of the label */
+        w = 90;
+        y -= 30;
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#680a0a"));
+        close = (xcb_rectangle_t){ y - w - (2 * line_width), 2, w + (2 * line_width), rect.height - 6 };
+        xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &close);
+
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel(conn, "#d92424"));
+        buttons[c].x = y - w - (2 * line_width);
+        buttons[c].width = w;
+        xcb_point_t points2[] = {
+            { y - w - (2 * line_width), (line_width / 2) + 2 },
+            { y - (line_width / 2), (line_width / 2) + 2 },
+            { y - (line_width / 2), (rect.height - 4 - (line_width / 2)) },
+            { y - w - (2 * line_width), (rect.height - 4 - (line_width / 2)) },
+            { y - w - (2 * line_width), (line_width / 2) + 2 }
+        };
+        xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, pixmap, pixmap_gc, 5, points2);
+
+        values[0] = get_colorpixel(conn, "#ffffff");
+        values[1] = get_colorpixel(conn, "#680a0a");
+        xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND | XCB_GC_BACKGROUND, values);
+        xcb_image_text_8(conn, strlen(buttons[c].label), pixmap, pixmap_gc, y - w - line_width + 6/* X */,
+                          font_height + 2 + 3/* Y = baseline of font */, buttons[c].label);
+
+        y -= w;
+    }
+
+    /* border line at the bottom */
+    line_width = 2;
+    values[0] = get_colorpixel(conn, "#470909");
+    values[1] = line_width;
+    xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND | XCB_GC_LINE_WIDTH, values);
+    xcb_point_t bottom[] = {
+        { 0, rect.height - 0 },
+        { rect.width, rect.height - 0 }
+    };
+    xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, pixmap, pixmap_gc, 2, bottom);
+
+
+    /* Copy the contents of the pixmap to the real window */
+    xcb_copy_area(conn, pixmap, win, pixmap_gc, 0, 0, 0, 0, rect.width, rect.height);
+    xcb_flush(conn);
+
+    return 1;
+}
+
+int main(int argc, char *argv[]) {
+    char *pattern = "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+    int o, option_index = 0;
+
+    static struct option long_options[] = {
+        {"version", no_argument, 0, 'v'},
+        {"font", required_argument, 0, 'f'},
+        {"button", required_argument, 0, 'b'},
+        {"help", no_argument, 0, 'h'},
+        {"message", no_argument, 0, 'm'},
+        {0, 0, 0, 0}
+    };
+
+    char *options_string = "b:f:m:vh";
+
+    while ((o = getopt_long(argc, argv, options_string, long_options, &option_index)) != -1) {
+        switch (o) {
+            case 'v':
+                printf("i3-nagbar " I3_VERSION);
+                return 0;
+            case 'f':
+                FREE(pattern);
+                pattern = strdup(optarg);
+                break;
+            case 'm':
+                prompt = strdup(optarg);
+                break;
+            case 'h':
+                printf("i3-nagbar " I3_VERSION "\n");
+                printf("i3-nagbar [-m <message>] [-b <button> <action>] [-f <font>] [-v]\n");
+                return 0;
+            case 'b':
+                buttons = realloc(buttons, sizeof(button_t) * (buttoncnt + 1));
+                buttons[buttoncnt].label = optarg;
+                buttons[buttoncnt].action = argv[optind];
+                printf("button with label *%s* and action *%s*\n",
+                        buttons[buttoncnt].label,
+                        buttons[buttoncnt].action);
+                buttoncnt++;
+                printf("now %d buttons\n", buttoncnt);
+                if (optind < argc)
+                    optind++;
+                break;
+        }
+    }
+
+    int screens;
+    xcb_connection_t *conn;
+    if ((conn = xcb_connect(NULL, &screens)) == NULL ||
+        xcb_connection_has_error(conn))
+        die("Cannot open display\n");
+
+    /* Place requests for the atoms we need as soon as possible */
+    #define xmacro(atom) \
+        xcb_intern_atom_cookie_t atom ## _cookie = xcb_intern_atom(conn, 0, strlen(#atom), #atom);
+    #include "atoms.xmacro"
+    #undef xmacro
+
+    xcb_screen_t *root_screen = xcb_aux_get_screen(conn, screens);
+    root = root_screen->root;
+
+    uint32_t font_id = get_font_id(conn, pattern, &font_height);
+
+    /* Open an input window */
+    win = open_input_window(conn, 500, font_height + 8 + 8 /* 8px padding */);
+
+    /* Setup NetWM atoms */
+    #define xmacro(name) \
+        do { \
+            xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(conn, name ## _cookie, NULL); \
+            if (!reply) \
+                die("Could not get atom " # name "\n"); \
+            \
+            A_ ## name = reply->atom; \
+            free(reply); \
+        } while (0);
+    #include "atoms.xmacro"
+    #undef xmacro
+
+    /* Set dock mode */
+    xcb_change_property(conn,
+        XCB_PROP_MODE_REPLACE,
+        win,
+        A__NET_WM_WINDOW_TYPE,
+        A_ATOM,
+        32,
+        1,
+        (unsigned char*) &A__NET_WM_WINDOW_TYPE_DOCK);
+
+    /* Reserve some space at the top of the screen */
+    struct {
+        uint32_t left;
+        uint32_t right;
+        uint32_t top;
+        uint32_t bottom;
+        uint32_t left_start_y;
+        uint32_t left_end_y;
+        uint32_t right_start_y;
+        uint32_t right_end_y;
+        uint32_t top_start_x;
+        uint32_t top_end_x;
+        uint32_t bottom_start_x;
+        uint32_t bottom_end_x;
+    } __attribute__((__packed__)) strut_partial = {0,};
+
+    strut_partial.top = font_height + 6;
+    strut_partial.top_start_x = 0;
+    strut_partial.top_end_x = 800;
+
+    xcb_change_property(conn,
+        XCB_PROP_MODE_REPLACE,
+        win,
+        A__NET_WM_STRUT_PARTIAL,
+        A_CARDINAL,
+        32,
+        12,
+        &strut_partial);
+
+    /* Create pixmap */
+    pixmap = xcb_generate_id(conn);
+    pixmap_gc = xcb_generate_id(conn);
+    xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, 500, font_height + 8);
+    xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
+
+    /* Create graphics context */
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_id);
+
+    /* Grab the keyboard to get all input */
+    xcb_flush(conn);
+
+    xcb_generic_event_t *event;
+    while ((event = xcb_wait_for_event(conn)) != NULL) {
+        if (event->response_type == 0) {
+            fprintf(stderr, "X11 Error received! sequence %x\n", event->sequence);
+            continue;
+        }
+
+        /* Strip off the highest bit (set if the event is generated) */
+        int type = (event->response_type & 0x7F);
+
+        switch (type) {
+            case XCB_EXPOSE:
+                handle_expose(conn, (xcb_expose_event_t*)event);
+                break;
+
+            case XCB_BUTTON_PRESS:
+                handle_button_press(conn, (xcb_button_press_event_t*)event);
+                break;
+
+            case XCB_BUTTON_RELEASE:
+                handle_button_release(conn, (xcb_button_release_event_t*)event);
+                break;
+
+            case XCB_CONFIGURE_NOTIFY: {
+                xcb_configure_notify_event_t *configure_notify = (xcb_configure_notify_event_t*)event;
+                rect = (xcb_rectangle_t){
+                    configure_notify->x,
+                    configure_notify->y,
+                    configure_notify->width,
+                    configure_notify->height
+                };
+
+                /* Recreate the pixmap / gc */
+                xcb_free_pixmap(conn, pixmap);
+                xcb_free_gc(conn, pixmap_gc);
+
+                xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, rect.width, rect.height);
+                xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
+
+                /* Create graphics context */
+                xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font_id);
+                break;
+            }
+        }
+
+        free(event);
+    }
+
+    return 0;
+}
diff --git a/i3-nagbar/xcb.c b/i3-nagbar/xcb.c
new file mode 100644 (file)
index 0000000..ed1bfd8
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/keysym.h>
+
+#include "i3-nagbar.h"
+
+/*
+ * Convenience-wrapper around xcb_change_gc which saves us declaring a variable
+ *
+ */
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value) {
+        xcb_change_gc(conn, gc, mask, &value);
+}
+
+/*
+ * Returns the colorpixel to use for the given hex color (think of HTML).
+ *
+ * The hex_color has to start with #, for example #FF00FF.
+ *
+ * NOTE that get_colorpixel() does _NOT_ check the given color code for validity.
+ * This has to be done by the caller.
+ *
+ */
+uint32_t get_colorpixel(xcb_connection_t *conn, char *hex) {
+        char strgroups[3][3] = {{hex[1], hex[2], '\0'},
+                                {hex[3], hex[4], '\0'},
+                                {hex[5], hex[6], '\0'}};
+        uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)),
+                             (strtol(strgroups[1], NULL, 16)),
+                             (strtol(strgroups[2], NULL, 16))};
+
+        return (rgb16[0] << 16) + (rgb16[1] << 8) + rgb16[2];
+}
+
+/*
+ * Opens the window we use for input/output and maps it
+ *
+ */
+xcb_window_t open_input_window(xcb_connection_t *conn, uint32_t width, uint32_t height) {
+        xcb_window_t win = xcb_generate_id(conn);
+        //xcb_cursor_t cursor_id = xcb_generate_id(conn);
+
+#if 0
+        /* Use the default cursor (left pointer) */
+        if (cursor > -1) {
+                i3Font *cursor_font = load_font(conn, "cursor");
+                xcb_create_glyph_cursor(conn, cursor_id, cursor_font->id, cursor_font->id,
+                                XCB_CURSOR_LEFT_PTR, XCB_CURSOR_LEFT_PTR + 1,
+                                0, 0, 0, 65535, 65535, 65535);
+        }
+#endif
+
+        uint32_t mask = 0;
+        uint32_t values[3];
+
+        mask |= XCB_CW_BACK_PIXEL;
+        values[0] = 0;
+
+       mask |= XCB_CW_EVENT_MASK;
+       values[1] = XCB_EVENT_MASK_EXPOSURE |
+                XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+                XCB_EVENT_MASK_BUTTON_PRESS |
+                XCB_EVENT_MASK_BUTTON_RELEASE;
+
+        xcb_create_window(conn,
+                          XCB_COPY_FROM_PARENT,
+                          win, /* the window id */
+                          root, /* parent == root */
+                          50, 50, width, height, /* dimensions */
+                          0, /* border = 0, we draw our own */
+                          XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                          XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
+                          mask,
+                          values);
+
+#if 0
+        if (cursor > -1)
+                xcb_change_window_attributes(conn, result, XCB_CW_CURSOR, &cursor_id);
+#endif
+
+        /* Map the window (= make it visible) */
+        xcb_map_window(conn, win);
+
+       return win;
+}
+
+/*
+ * Returns the ID of the font matching the given pattern and stores the height
+ * of the font (in pixels) in *font_height. die()s if no font matches.
+ *
+ */
+int get_font_id(xcb_connection_t *conn, char *pattern, int *font_height) {
+        xcb_void_cookie_t font_cookie;
+        xcb_list_fonts_with_info_cookie_t info_cookie;
+
+        /* Send all our requests first */
+        int result;
+        result = xcb_generate_id(conn);
+        font_cookie = xcb_open_font_checked(conn, result, strlen(pattern), pattern);
+        info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
+
+        xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
+        if (error != NULL) {
+                fprintf(stderr, "ERROR: Could not open font: %d\n", error->error_code);
+                exit(1);
+        }
+
+        /* Get information (height/name) for this font */
+        xcb_list_fonts_with_info_reply_t *reply = xcb_list_fonts_with_info_reply(conn, info_cookie, NULL);
+        if (reply == NULL)
+                die("Could not load font \"%s\"\n", pattern);
+
+        *font_height = reply->font_ascent + reply->font_descent;
+
+        return result;
+}
diff --git a/i3-wsbar b/i3-wsbar
new file mode 100755 (executable)
index 0000000..26d8caf
--- /dev/null
+++ b/i3-wsbar
@@ -0,0 +1,276 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab:ft=perl
+# © 2010 Michael Stapelberg, see LICENSE for license information
+
+use strict;
+use warnings;
+use Getopt::Long;
+use Pod::Usage;
+use IPC::Run qw(start pump);
+use Try::Tiny;
+use AnyEvent::I3;
+use AnyEvent;
+use v5.10;
+
+my $stdin;
+my $socket_path = undef;
+my ($workspaces, $outputs) = ([], {});
+my $last_line = "";
+my $w = AnyEvent->timer(
+    after => 2,
+    cb => sub {
+        say "Connection to i3 timed out. Verify socket path ($socket_path)";
+        exit 1;
+    }
+);
+
+my $command = "";
+my $input_on = "";
+my $output_on = "";
+my $show_all = 0;
+
+my $result = GetOptions(
+    'command=s' => \$command,
+    'socket=s' => \$socket_path,
+    'input-on=s' => \$input_on,
+    'output-on=s' => \$output_on,
+    'show-all' => \$show_all,
+    'help' => sub { pod2usage(1); exit 0 },
+);
+
+if ($command eq '') {
+    say "i3-wsbar is only useful in combination with dzen2.";
+    say "Please specify -c (command)";
+    exit 1;
+}
+
+my $i3 = i3($socket_path);
+
+my @input_on = split(/,/, $input_on);
+my @output_on = split(/,/, $output_on);
+
+# Disable buffering
+$| = 1;
+
+# Wait a short amount of time and try to connect to i3 again
+sub reconnect {
+    my $timer;
+    if (!defined($w)) {
+        $w = AnyEvent->timer(
+            after => 2,
+            cb => sub {
+                say "Connection to i3 timed out. Verify socket path ($socket_path)";
+                exit 1;
+            }
+        );
+    }
+
+    my $c = sub {
+        $timer = AnyEvent->timer(
+            after => 0.01,
+            cb => sub { $i3->connect->cb(\&connected) }
+        );
+    };
+    $c->();
+}
+
+# Connection attempt succeeded or failed
+sub connected {
+    my ($cv) = @_;
+
+    if (!$cv->recv) {
+        reconnect();
+        return;
+    }
+
+    $w = undef;
+
+    $i3->subscribe({
+        workspace => \&ws_change,
+        output => \&output_change,
+        _error => sub { reconnect() }
+    });
+    ws_change();
+    output_change();
+}
+
+# Called when a ws changes
+sub ws_change {
+    # Request the current workspaces and update the output afterwards
+    $i3->get_workspaces->cb(
+        sub {
+            my ($cv) = @_;
+            $workspaces = $cv->recv;
+            update_output();
+        });
+}
+
+# Called when the reply to the GET_OUTPUTS message arrives
+# Compares old outputs with new outputs and starts/kills
+# $command for each output (if specified)
+sub got_outputs {
+    my $reply = shift->recv;
+    my %old = %{$outputs};
+    my %new = map { ($_->{name}, $_) } grep { $_->{active} } @{$reply};
+
+    # If no command was given, we do not need to compare outputs
+    if ($command eq '') {
+        update_output();
+        return;
+    }
+
+    # Handle new outputs
+    for my $name (keys %new) {
+        next if @output_on and !($name ~~ @output_on);
+
+        if (defined($old{$name})) {
+            # Check if the mode changed (by reversing the hashes so
+            # that we can check for equality using the smartmatch op)
+            my %oldrect = reverse %{$old{$name}->{rect}};
+            my %newrect = reverse %{$new{$name}->{rect}};
+            next if (%oldrect ~~ %newrect);
+
+            # On mode changes, we re-start the command
+            $outputs->{$name}->{cmd}->finish;
+            delete $outputs->{$name};
+        }
+
+        my $x = $new{$name}->{rect}->{x};
+        my $w = $new{$name}->{rect}->{width};
+        my $launch = $command;
+        $launch =~ s/([^%])%x/$1$x/g;
+        $launch =~ s/([^%])%w/$1$w/g;
+        $launch =~ s/%%x/%x/g;
+        $launch =~ s/%%w/%w/g;
+
+        $new{$name}->{cmd_input} = '';
+        my @cmd = ('/bin/sh', '-c', $launch);
+        $new{$name}->{cmd} = start \@cmd, \$new{$name}->{cmd_input};
+        $outputs->{$name} = $new{$name};
+    }
+
+    # Handle old outputs
+    for my $name (keys %old) {
+        next if defined($new{$name});
+
+        $outputs->{$name}->{cmd}->finish;
+        delete $outputs->{$name};
+    }
+
+    update_output();
+}
+
+sub output_change {
+    $i3->get_outputs->cb(\&got_outputs)
+}
+
+sub update_output {
+    my $dzen_bg = "#111111";
+    my $out;
+
+    for my $name (keys %{$outputs}) {
+        my $width = $outputs->{$name}->{rect}->{width};
+
+        $out = qq|^pa(;2)|;
+        for my $ws (@{$workspaces}) {
+            next if $ws->{output} ne $name and !$show_all;
+
+            my ($bg, $fg) = qw(333333 888888);
+            ($bg, $fg) = qw(4c7899 ffffff) if $ws->{visible};
+            ($bg, $fg) = qw(900000 ffffff) if $ws->{urgent};
+
+            my $cmd = q|i3-msg "| . $ws->{num} . q|"|;
+            my $name = $ws->{name};
+
+            # Begin the clickable area
+            $out .= qq|^ca(1,$cmd)|;
+
+            # Draw the rest of the bar in the background color, but
+            # don’t move the "cursor"
+            $out .= qq|^p(_LOCK_X)^fg(#$bg)^r(${width}x17)^p(_UNLOCK_X)|;
+            # Draw the name of the workspace without overwriting the
+            # background color
+            $out .= qq|^p(+3)^fg(#$fg)^ib(1)$name^ib(0)^p(+5)|;
+            # Draw the rest of the bar in the normal background color
+            # without moving the "cursor"
+            $out .= qq|^p(_LOCK_X)^fg($dzen_bg)^r(${width}x17)^p(_UNLOCK_X)|;
+
+            # End the clickable area
+            $out .= qq|^ca()|;
+
+            # Move to the next rect, reset Y coordinate
+            $out .= qq|^p(2)^pa(;2)|;
+        }
+
+        $out .= qq|^p(_LOCK_X)^fg($dzen_bg)^r(${width}x17)^p(_UNLOCK_X)^fg()|;
+        $out .= qq|^p(+5)|;
+        $out .= $last_line if (!@input_on or $name ~~ @input_on);
+        $out .= "\n";
+
+        $outputs->{$name}->{cmd_input} = $out;
+        try {
+            pump $outputs->{$name}->{cmd} while length $outputs->{$name}->{cmd_input};
+        } catch {
+            warn "Could not write to dzen2";
+            exit 1;
+        }
+    }
+}
+
+$i3->connect->cb(\&connected);
+
+$stdin = AnyEvent->io(
+    fh => \*STDIN,
+    poll => 'r',
+    cb => sub {
+        chomp (my $line = <STDIN>);
+        $last_line = $line;
+        update_output();
+    });
+
+# let AnyEvent do the rest ("endless loop")
+AnyEvent->condvar->recv
+
+__END__
+
+=head1 NAME
+
+i3-wsbar - sample implementation of a standalone workspace bar
+
+=head1 SYNOPSIS
+
+i3-wsbar -c <dzen2-commandline> [options]
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--command> <command>
+
+This command (at the moment only dzen2 is supported) will be started for each
+output. C<%x> will be replaced with the X coordinate of the output, C<%w> will
+be replaced with the width of the output.
+
+Example:
+    --command "dzen2 -dock -x %x -w %w"
+
+=item B<--input-on> <list-of-RandR-outputs>
+
+Specifies on which outputs the contents of stdin should be appended to the
+workspace bar.
+
+Example:
+    --input-on "LVDS1"
+
+=item B<--output-on> <list-of-RandR-outputs>
+
+Specifies for which outputs i3-wsbar should start C<command>.
+
+=item B<--show-all>
+
+If enabled, all workspaces are shown (not only those of the current output).
+Handy to use with C<--output-on>.
+
+=back
+
+=cut
diff --git a/i3.config b/i3.config
new file mode 100644 (file)
index 0000000..92654f0
--- /dev/null
+++ b/i3.config
@@ -0,0 +1,161 @@
+# i3 config file (v4)
+#
+# Please see http://i3wm.org/docs/userguide.html for a complete reference!
+#
+# This config file uses keycodes (bindsym) and was written for the QWERTY
+# layout.
+#
+# To get a config file with the same key positions, but for your current
+# layout, use the i3-config-wizard
+#
+
+# font for window titles. ISO 10646 = Unicode
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# use Mouse+Mod1 to drag floating windows to their wanted position
+floating_modifier Mod1
+
+# start a terminal
+bindsym Mod1+Return exec /usr/bin/urxvt
+
+# kill focused window
+bindsym Mod1+Shift+q kill
+
+# start dmenu (a program launcher)
+bindsym Mod1+d exec /usr/bin/dmenu_run
+
+# change focus
+bindsym Mod1+j focus left
+bindsym Mod1+k focus down
+bindsym Mod1+l focus up
+bindsym Mod1+semicolon focus right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Left focus left
+bindsym Mod1+Down focus down
+bindsym Mod1+Up focus up
+bindsym Mod1+Right focus right
+
+# move focused window
+bindsym Mod1+Shift+j move left
+bindsym Mod1+Shift+k move down
+bindsym Mod1+Shift+l move up
+bindsym Mod1+Shift+semicolon move right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Shift+Left move left
+bindsym Mod1+Shift+Down move down
+bindsym Mod1+Shift+Up move up
+bindsym Mod1+Shift+Right move right
+
+# split in horizontal orientation
+bindsym Mod1+h split h
+
+# split in vertical orientation
+bindsym Mod1+v split v
+
+# enter fullscreen mode for the focused container
+bindsym Mod1+f fullscreen
+
+# change container layout (stacked, tabbed, default)
+bindsym Mod1+s layout stacking
+bindsym Mod1+w layout tabbed
+bindsym Mod1+e layout default
+
+# toggle tiling / floating
+bindsym Mod1+Shift+space floating toggle
+
+# change focus between tiling / floating windows
+bindsym Mod1+space focus mode_toggle
+
+# focus the parent container
+bindsym Mod1+a focus parent
+
+# focus the child container
+#bindsym Mod1+d focus child
+
+# switch to workspace
+bindsym Mod1+1 workspace 1
+bindsym Mod1+2 workspace 2
+bindsym Mod1+3 workspace 3
+bindsym Mod1+4 workspace 4
+bindsym Mod1+5 workspace 5
+bindsym Mod1+6 workspace 6
+bindsym Mod1+7 workspace 7
+bindsym Mod1+8 workspace 8
+bindsym Mod1+9 workspace 9
+bindsym Mod1+0 workspace 10
+
+# move focused container to workspace
+bindsym Mod1+Shift+1 move workspace 1
+bindsym Mod1+Shift+2 move workspace 2
+bindsym Mod1+Shift+3 move workspace 3
+bindsym Mod1+Shift+4 move workspace 4
+bindsym Mod1+Shift+5 move workspace 5
+bindsym Mod1+Shift+6 move workspace 6
+bindsym Mod1+Shift+7 move workspace 7
+bindsym Mod1+Shift+8 move workspace 8
+bindsym Mod1+Shift+9 move workspace 9
+bindsym Mod1+Shift+0 move workspace 10
+
+# reload the configuration file
+bindsym Mod1+Shift+c reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindsym Mod1+Shift+r restart
+# exit i3 (logs you out of your X session)
+bindsym Mod1+Shift+e exit
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+        # These bindings trigger as soon as you enter the resize mode
+
+        # They resize the border in the direction you pressed, e.g.
+        # when pressing left, the window is resized so that it has
+        # more space on its left
+
+        bindsym j               resize shrink left 10 px or 10 ppt
+        bindsym Shift+j         resize grow   left 10 px or 10 ppt
+
+        bindsym k               resize shrink down 10 px or 10 ppt
+        bindsym Shift+k         resize grow   down 10 px or 10 ppt
+
+        bindsym l               resize shrink up 10 px or 10 ppt
+        bindsym Shift+l         resize grow   up 10 px or 10 ppt
+
+        bindsym semicolon       resize shrink right 10 px or 10 ppt
+        bindsym Shift+semicolon resize grow   right 10 px or 10 ppt
+
+        # same bindings, but for the arrow keys
+        bindsym Left        resize shrink left 10 px or 10 ppt
+        bindsym Shift+Left  resize grow   left 10 px or 10 ppt
+
+        bindsym Down        resize shrink down 10 px or 10 ppt
+        bindsym Shift+Down  resize grow   down 10 px or 10 ppt
+
+        bindsym Up          resize shrink up 10 px or 10 ppt
+        bindsym Shift+Up    resize grow   up 10 px or 10 ppt
+
+        bindsym Right       resize shrink right 10 px or 10 ppt
+        bindsym Shift+Right resize grow   right 10 px or 10 ppt
+
+        # back to normal: Enter or Escape
+        bindsym Return mode "default"
+        bindsym Escape mode "default"
+}
+
+bindsym Mod1+r mode "resize"
+
+# Start i3bar to display a workspace bar (plus the system information i3status
+# finds out, if available)
+exec i3status | i3bar -d
+
+#######################################################################
+# automatically start i3-config-wizard to offer the user to create a
+# keysym-based config which used his favorite modifier (alt or windows)
+#
+# i3-config-wizard will not launch if there already is a config file
+# in ~/.i3/config.
+#
+# Please remove the following exec line:
+#######################################################################
+exec i3-config-wizard
diff --git a/i3.config.keycodes b/i3.config.keycodes
new file mode 100644 (file)
index 0000000..f017045
--- /dev/null
@@ -0,0 +1,147 @@
+# WARNING
+# WARNING: This configuration file is a template for the i3-config-wizard to
+# WARNING: generate a config which uses keysyms in your current layout. It does
+# WARNING: not get loaded by i3. Please do not change it.
+# WARNING
+
+# i3 config file (v4)
+#
+# Please see http://i3wm.org/docs/userguide.html for a complete reference!
+
+set $mod Mod1
+
+# font for window titles. ISO 10646 = Unicode
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# Use Mouse+$mod to drag floating windows to their wanted position
+floating_modifier $mod
+
+# start a terminal
+bindcode $mod+36 exec /usr/bin/urxvt
+
+# kill focused window
+bindcode $mod+Shift+24 kill
+
+# start dmenu (a program launcher)
+bindcode $mod+40 exec /usr/bin/dmenu_run
+
+# change focus
+bindcode $mod+44 focus left
+bindcode $mod+45 focus down
+bindcode $mod+46 focus up
+bindcode $mod+47 focus right
+
+# alternatively, you can use the cursor keys:
+bindcode $mod+113 focus left
+bindcode $mod+116 focus down
+bindcode $mod+111 focus up
+bindcode $mod+114 focus right
+
+# move focused window
+bindcode $mod+Shift+44 move left
+bindcode $mod+Shift+45 move down
+bindcode $mod+Shift+46 move up
+bindcode $mod+Shift+47 move right
+
+# alternatively, you can use the cursor keys:
+bindcode $mod+Shift+113 move left
+bindcode $mod+Shift+116 move down
+bindcode $mod+Shift+111 move up
+bindcode $mod+Shift+114 move right
+
+# split in horizontal orientation
+bindcode $mod+43 split h
+
+# split in vertical orientation
+bindcode $mod+55 split v
+
+# enter fullscreen mode for the focused container
+bindcode $mod+41 fullscreen
+
+# change container layout (stacked, tabbed, default)
+bindcode $mod+39 layout stacking
+bindcode $mod+25 layout tabbed
+bindcode $mod+26 layout default
+
+# toggle tiling / floating
+bindcode $mod+Shift+65 floating toggle
+
+# change focus between tiling / floating windows
+bindcode $mod+65 focus mode_toggle
+
+# focus the parent container
+bindcode $mod+38 focus parent
+
+# focus the child container
+#bindcode $mod+d focus child
+
+# switch to workspace
+bindcode $mod+10 workspace 1
+bindcode $mod+11 workspace 2
+bindcode $mod+12 workspace 3
+bindcode $mod+13 workspace 4
+bindcode $mod+14 workspace 5
+bindcode $mod+15 workspace 6
+bindcode $mod+16 workspace 7
+bindcode $mod+17 workspace 8
+bindcode $mod+18 workspace 9
+bindcode $mod+19 workspace 10
+
+# move focused container to workspace
+bindcode $mod+Shift+10 move workspace 1
+bindcode $mod+Shift+11 move workspace 2
+bindcode $mod+Shift+12 move workspace 3
+bindcode $mod+Shift+13 move workspace 4
+bindcode $mod+Shift+14 move workspace 5
+bindcode $mod+Shift+15 move workspace 6
+bindcode $mod+Shift+16 move workspace 7
+bindcode $mod+Shift+17 move workspace 8
+bindcode $mod+Shift+18 move workspace 9
+bindcode $mod+Shift+19 move workspace 10
+
+# reload the configuration file
+bindcode $mod+Shift+54 reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindcode $mod+Shift+27 restart
+# exit i3 (logs you out of your X session)
+bindcode $mod+Shift+26 exit
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+        # These bindings trigger as soon as you enter the resize mode
+
+        # They resize the border in the direction you pressed, e.g.
+        # when pressing left, the window is resized so that it has
+        # more space on its left
+
+        bindcode 44 resize shrink left 10 px or 10 ppt
+        bindcode Shift+44 resize grow   left 10 px or 10 ppt
+
+        bindcode 45 resize shrink down 10 px or 10 ppt
+        bindcode Shift+45 resize grow   down 10 px or 10 ppt
+
+        bindcode 46 resize shrink up 10 px or 10 ppt
+        bindcode Shift+46 resize grow   up 10 px or 10 ppt
+
+        bindcode 47 resize shrink right 10 px or 10 ppt
+        bindcode Shift+47 resize grow   right 10 px or 10 ppt
+
+        # same bindings, but for the arrow keys
+        bindcode 113 resize shrink left 10 px or 10 ppt
+        bindcode Shift+113 resize grow   left 10 px or 10 ppt
+
+        bindcode 116 resize shrink down 10 px or 10 ppt
+        bindcode Shift+116 resize grow   down 10 px or 10 ppt
+
+        bindcode 111 resize shrink up 10 px or 10 ppt
+        bindcode Shift+111 resize grow   up 10 px or 10 ppt
+
+        bindcode 114 resize shrink right 10 px or 10 ppt
+        bindcode Shift+114 resize grow   right 10 px or 10 ppt
+
+        # back to normal: Enter or Escape
+        bindcode 36 mode "default"
+        bindcode 9 mode "default"
+}
+
+bindcode $mod+27 mode "resize"
diff --git a/i3.desktop b/i3.desktop
new file mode 100644 (file)
index 0000000..abe9e5f
--- /dev/null
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=i3
+Comment=improved dynamic tiling window manager
+Exec=i3
+Type=XSession
diff --git a/i3.welcome b/i3.welcome
new file mode 100644 (file)
index 0000000..72717ee
--- /dev/null
@@ -0,0 +1,44 @@
+1.) Welcome to i3!
+
+This message provides an overview of the default keybindings to use i3.
+Please also make sure to have a look at the man page and the user's guide:
+http://i3.zekjur.net/docs/userguide.html
+
+
+2.) Configuration Files
+
+/etc/i3/config is the default configuration. It is recommended to copy it and
+afterwards edit it to suit your needs (in particular, you may want to disable
+this message):
+
+       cp /etc/i3/config ~/.i3/config
+
+
+3.) Keybindings
+
+The following explanation is related to the QWERTY layout, but as the default
+configuration uses keycodes instead of keysymbols for binding, you still have
+to press the same physical keys, regardless of your keyboard layout.
+
+The Mod1 key is usually bound to the "Alt" key on your keyboard.
+
+Mod1+Enter opens a terminal emulator
+Mod1+v starts dmenu (an application launcher)
+
+The directional keys are j(left), k(down), l(up) and ;(right). You can also use
+the arrow keys on your keyboard, if you prefer them.
+
+Mod1+<directional key> moves the focus to the window in the given direction
+Mod1+Shift+<directional key> moves the window to the given direction
+Mod1+<number> opens the corresponding workspace
+Mod1+Shift+<number> moves a window to the selected workspace
+Mod1+h sets the mode of a container to stacking
+Mod1+e sets the mode back to default
+Mod1+f toggles fullscreen mode for the current window
+Mod1+Shift+Space toggles floating mode for the current window
+Mod1+Shift+q closes a window
+Mod1+Shift+r restarts i3 in-place (at this time, you will lose your layout)
+Mod1+Shift+e exits i3
+
+If you have any questions, please don't hesitate to ask!
+Have fun using i3
diff --git a/include/all.h b/include/all.h
new file mode 100644 (file)
index 0000000..ba582a8
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * This header file includes all relevant files of i3 and the most often used
+ * system header files. This reduces boilerplate (the amount of code duplicated
+ * at the beginning of each source file) and is not significantly slower at
+ * compile-time.
+ *
+ */
+#ifndef _ALL_H
+#define _ALL_H
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <locale.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <glob.h>
+#include <errno.h>
+#include <err.h>
+#include <stdint.h>
+#include <math.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_keysyms.h>
+#include <xcb/xcb_icccm.h>
+
+/* Contains compatibility definitions for old libxcb versions */
+#ifdef XCB_COMPAT
+#include "xcb_compat.h"
+#endif
+
+#include "data.h"
+#include "util.h"
+#include "ipc.h"
+#include "tree.h"
+#include "log.h"
+#include "xcb.h"
+#include "manage.h"
+#include "workspace.h"
+#include "i3.h"
+#include "x.h"
+#include "click.h"
+#include "floating.h"
+#include "config.h"
+#include "handlers.h"
+#include "randr.h"
+#include "xinerama.h"
+#include "con.h"
+#include "load_layout.h"
+#include "render.h"
+#include "window.h"
+#include "match.h"
+#include "cmdparse.h"
+#include "xcursor.h"
+#include "resize.h"
+#include "sighandler.h"
+#include "move.h"
+#include "output.h"
+#include "ewmh.h"
+#include "assignments.h"
+
+#endif
diff --git a/include/assignments.h b/include/assignments.h
new file mode 100644 (file)
index 0000000..f72dd2e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
+#ifndef _ASSIGNMENTS_H
+#define _ASSIGNMENTS_H
+
+/**
+ * Checks the list of assignments for the given window and runs all matching
+ * ones (unless they have already been run for this specific window).
+ *
+ */
+void run_assignments(i3Window *window);
+
+/**
+ * Returns the first matching assignment for the given window.
+ *
+ */
+Assignment *assignment_for(i3Window *window, int type);
+
+#endif
diff --git a/include/atoms.xmacro b/include/atoms.xmacro
new file mode 100644 (file)
index 0000000..5d2ffb1
--- /dev/null
@@ -0,0 +1,33 @@
+xmacro(_NET_SUPPORTED)
+xmacro(_NET_SUPPORTING_WM_CHECK)
+xmacro(_NET_WM_NAME)
+xmacro(_NET_WM_STATE_FULLSCREEN)
+xmacro(_NET_WM_STATE)
+xmacro(_NET_WM_WINDOW_TYPE)
+xmacro(_NET_WM_WINDOW_TYPE_DOCK)
+xmacro(_NET_WM_WINDOW_TYPE_DIALOG)
+xmacro(_NET_WM_WINDOW_TYPE_UTILITY)
+xmacro(_NET_WM_WINDOW_TYPE_TOOLBAR)
+xmacro(_NET_WM_WINDOW_TYPE_SPLASH)
+xmacro(_NET_WM_DESKTOP)
+xmacro(_NET_WM_STRUT_PARTIAL)
+xmacro(_NET_CURRENT_DESKTOP)
+xmacro(_NET_ACTIVE_WINDOW)
+xmacro(_NET_WORKAREA)
+xmacro(WM_PROTOCOLS)
+xmacro(WM_DELETE_WINDOW)
+xmacro(UTF8_STRING)
+xmacro(WM_STATE)
+xmacro(WM_CLIENT_LEADER)
+xmacro(WM_TAKE_FOCUS)
+xmacro(WM_HINTS)
+xmacro(WM_NORMAL_HINTS)
+xmacro(WM_TRANSIENT_FOR)
+xmacro(ATOM)
+xmacro(WINDOW)
+xmacro(WM_NAME)
+xmacro(WM_CLASS)
+xmacro(STRING)
+xmacro(CARDINAL)
+xmacro(I3_SOCKET_PATH)
+xmacro(I3_CONFIG_PATH)
diff --git a/include/click.h b/include/click.h
new file mode 100644 (file)
index 0000000..2de32d0
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _CLICK_H
+#define _CLICK_H
+
+/**
+ * The button press X callback. This function determines whether the floating
+ * modifier is pressed and where the user clicked (decoration, border, inside
+ * the window).
+ *
+ * Then, route_click is called on the appropriate con.
+ *
+ */
+int handle_button_press(xcb_button_press_event_t *event);
+
+#endif
diff --git a/include/cmdparse.h b/include/cmdparse.h
new file mode 100644 (file)
index 0000000..09d56ba
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _CMDPARSE_H
+#define _CMDPARSE_H
+
+char *parse_cmd(const char *new);
+
+#endif
diff --git a/include/con.h b/include/con.h
new file mode 100644 (file)
index 0000000..6ce7bf8
--- /dev/null
@@ -0,0 +1,215 @@
+#ifndef _CON_H
+#define _CON_H
+
+/**
+ * Create a new container (and attach it to the given parent, if not NULL).
+ * This function initializes the data structures and creates the appropriate
+ * X11 IDs using x_con_init().
+ *
+ */
+Con *con_new(Con *parent, i3Window *window);
+
+/**
+ * Sets input focus to the given container. Will be updated in X11 in the next
+ * run of x_push_changes().
+ *
+ */
+void con_focus(Con *con);
+
+/**
+ * Returns true when this node is a leaf node (has no children)
+ *
+ */
+bool con_is_leaf(Con *con);
+
+/**
+ * Returns true if this node accepts a window (if the node swallows windows,
+ * it might already have swallowed enough and cannot hold any more).
+ *
+ */
+bool con_accepts_window(Con *con);
+
+/**
+ * Gets the output container (first container with CT_OUTPUT in hierarchy) this
+ * node is on.
+ *
+ */
+Con *con_get_output(Con *con);
+
+/**
+ * Gets the workspace container this node is on.
+ *
+ */
+Con *con_get_workspace(Con *con);
+
+/**
+ * Searches parenst of the given 'con' until it reaches one with the specified
+ * 'orientation'. Aborts when it comes across a floating_con.
+ *
+ */
+Con *con_parent_with_orientation(Con *con, orientation_t orientation);
+
+/**
+ * Returns the first fullscreen node below this node.
+ *
+ */
+Con *con_get_fullscreen_con(Con *con, int fullscreen_mode);
+
+/**
+ * Returns true if the node is floating.
+ *
+ */
+bool con_is_floating(Con *con);
+
+/**
+ * Checks if the given container is either floating or inside some floating
+ * container. It returns the FLOATING_CON container.
+ *
+ */
+Con *con_inside_floating(Con *con);
+
+/**
+ * Returns the container with the given client window ID or NULL if no such
+ * container exists.
+ *
+ */
+Con *con_by_window_id(xcb_window_t window);
+
+/**
+ * Returns the container with the given frame ID or NULL if no such container
+ * exists.
+ *
+ */
+Con *con_by_frame_id(xcb_window_t frame);
+
+/**
+ * Returns the first container below 'con' which wants to swallow this window
+ * TODO: priority
+ *
+ */
+Con *con_for_window(Con *con, i3Window *window, Match **store_match);
+
+/**
+ * Returns the number of children of this container.
+ *
+ */
+int con_num_children(Con *con);
+
+/**
+ * Attaches the given container to the given parent. This happens when moving
+ * a container or when inserting a new container at a specific place in the
+ * tree.
+ *
+ * ignore_focus is to just insert the Con at the end (useful when creating a
+ * new split container *around* some containers, that is, detaching and
+ * attaching them in order without wanting to mess with the focus in between).
+ *
+ */
+void con_attach(Con *con, Con *parent, bool ignore_focus);
+
+/**
+ * Detaches the given container from its current parent
+ *
+ */
+void con_detach(Con *con);
+
+/**
+ * Updates the percent attribute of the children of the given container. This
+ * function needs to be called when a window is added or removed from a
+ * container.
+ *
+ */
+void con_fix_percent(Con *con);
+
+/**
+ * Toggles fullscreen mode for the given container. Fullscreen mode will not be
+ * entered when there already is a fullscreen container on this workspace.
+ *
+ */
+void con_toggle_fullscreen(Con *con, int fullscreen_mode);
+
+/**
+ * Moves the given container to the currently focused container on the given
+ * workspace.
+ * TODO: is there a better place for this function?
+ *
+ */
+void con_move_to_workspace(Con *con, Con *workspace);
+
+/**
+ * Returns the orientation of the given container (for stacked containers,
+ * vertical orientation is used regardless of the actual orientation of the
+ * container).
+ *
+ */
+int con_orientation(Con *con);
+
+/**
+ * Returns the container which will be focused next when the given container
+ * is not available anymore. Called in tree_close and con_move_to_workspace
+ * to properly restore focus.
+ *
+ */
+Con *con_next_focused(Con *con);
+
+/**
+ * Get the next/previous container in the specified orientation. This may
+ * travel up until it finds a container with suitable orientation.
+ *
+ */
+Con *con_get_next(Con *con, char way, orientation_t orientation);
+
+/**
+ * Returns the focused con inside this client, descending the tree as far as
+ * possible. This comes in handy when attaching a con to a workspace at the
+ * currently focused position, for example.
+ *
+ */
+Con *con_descend_focused(Con *con);
+
+/**
+ * Returns the focused con inside this client, descending the tree as far as
+ * possible. This comes in handy when attaching a con to a workspace at the
+ * currently focused position, for example.
+ *
+ * Works like con_descend_focused but considers only tiling cons.
+ *
+ */
+Con *con_descend_tiling_focused(Con *con);
+
+/**
+ * Returns a "relative" Rect which contains the amount of pixels that need to
+ * be added to the original Rect to get the final position (obviously the
+ * amount of pixels for normal, 1pixel and borderless are different).
+ *
+ */
+Rect con_border_style_rect(Con *con);
+
+/**
+ * Use this function to get a container’s border style. This is important
+ * because when inside a stack, the border style is always BS_NORMAL.
+ * For tabbed mode, the same applies, with one exception: when the container is
+ * borderless and the only element in the tabbed container, the border is not
+ * rendered.
+ *
+ * For children of a CT_DOCKAREA, the border style is always none.
+ *
+ */
+int con_border_style(Con *con);
+
+/**
+ * This function changes the layout of a given container. Use it to handle
+ * special cases like changing a whole workspace to stacked/tabbed (creates a
+ * new split container before).
+ *
+ */
+void con_set_layout(Con *con, int layout);
+
+/**
+ * Determines the minimum size of the given con by looking at its children (for
+ * split/stacked/tabbed cons). Will be called when resizing floating cons
+ *
+ */
+Rect con_minimum_size(Con *con);
+
+#endif
diff --git a/include/config.h b/include/config.h
new file mode 100644 (file)
index 0000000..1021a61
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * include/config.h: Contains all structs/variables for the configurable
+ * part of i3 as well as functions handling the configuration file (calling
+ * the parser (src/cfgparse.y) with the correct path, switching key bindings
+ * mode).
+ *
+ */
+
+#ifndef _CONFIG_H
+#define _CONFIG_H
+
+#include <stdbool.h>
+#include "queue.h"
+#include "i3.h"
+
+typedef struct Config Config;
+extern char *current_configpath;
+extern Config config;
+extern SLIST_HEAD(modes_head, Mode) modes;
+
+/**
+ * Used during the config file lexing/parsing to keep the state of the lexer
+ * in order to provide useful error messages in yyerror().
+ *
+ */
+struct context {
+        bool has_errors;
+
+        int line_number;
+        char *line_copy;
+        const char *filename;
+
+        char *compact_error;
+
+        /* These are the same as in YYLTYPE */
+        int first_column;
+        int last_column;
+};
+
+/**
+ * Part of the struct Config. It makes sense to group colors for background,
+ * border and text as every element in i3 has them (window decorations, bar).
+ *
+ */
+struct Colortriple {
+        uint32_t border;
+        uint32_t background;
+        uint32_t text;
+};
+
+/**
+ * Holds a user-assigned variable for parsing the configuration file. The key
+ * is replaced by value in every following line of the file.
+ *
+ */
+struct Variable {
+        char *key;
+        char *value;
+        char *next_match;
+
+        SLIST_ENTRY(Variable) variables;
+};
+
+/**
+ * The configuration file can contain multiple sets of bindings. Apart from the
+ * default set (name == "default"), you can specify other sets and change the
+ * currently active set of bindings by using the "mode <name>" command.
+ *
+ */
+struct Mode {
+        char *name;
+        struct bindings_head *bindings;
+
+        SLIST_ENTRY(Mode) modes;
+};
+
+/**
+ * Holds part of the configuration (the part which is not already in dedicated
+ * structures in include/data.h).
+ *
+ */
+struct Config {
+        const char *terminal;
+        i3Font font;
+
+        char *ipc_socket_path;
+        const char *restart_state_path;
+
+        int default_layout;
+        int container_stack_limit;
+        int container_stack_limit_value;
+
+        /** Default orientation for new containers */
+        int default_orientation;
+
+        /** By default, focus follows mouse. If the user explicitly wants to
+         * turn this off (and instead rely only on the keyboard for changing
+         * focus), we allow him to do this with this relatively special option.
+         * It is not planned to add any different focus models. */
+        bool disable_focus_follows_mouse;
+
+        /** By default, a workspace bar is drawn at the bottom of the screen.
+         * If you want to have a more fancy bar, it is recommended to replace
+         * the whole bar by dzen2, for example using the i3-wsbar script which
+         * comes with i3. Thus, you can turn it off entirely. */
+        bool disable_workspace_bar;
+
+        /** Think of the following layout: Horizontal workspace with a tabbed
+         * con on the left of the screen and a terminal on the right of the
+         * screen. You are in the second container in the tabbed container and
+         * focus to the right. By default, i3 will set focus to the terminal on
+         * the right. If you are in the first container in the tabbed container
+         * however, focusing to the left will wrap. This option forces i3 to
+         * always wrap, which will result in you having to use "focus parent"
+         * more often. */
+        bool force_focus_wrapping;
+
+        /** The default border style for new windows. */
+        border_style_t default_border;
+
+        /** The modifier which needs to be pressed in combination with your mouse
+         * buttons to do things with floating windows (move, resize) */
+        uint32_t floating_modifier;
+
+        /* Color codes are stored here */
+        struct config_client {
+                uint32_t background;
+                struct Colortriple focused;
+                struct Colortriple focused_inactive;
+                struct Colortriple unfocused;
+                struct Colortriple urgent;
+        } client;
+        struct config_bar {
+                struct Colortriple focused;
+                struct Colortriple unfocused;
+                struct Colortriple urgent;
+        } bar;
+
+        /** What should happen when a new popup is opened during fullscreen mode */
+        enum {
+                PDF_LEAVE_FULLSCREEN = 0,
+                PDF_IGNORE = 1
+        } popup_during_fullscreen;
+};
+
+/**
+ * Reads the configuration from ~/.i3/config or /etc/i3/config if not found.
+ *
+ * If you specify override_configpath, only this path is used to look for a
+ * configuration file.
+ *
+ */
+void load_configuration(xcb_connection_t *conn, const char *override_configfile, bool reload);
+
+/**
+ * Translates keysymbols to keycodes for all bindings which use keysyms.
+ *
+ */
+void translate_keysyms();
+
+/**
+ * Ungrabs all keys, to be called before re-grabbing the keys because of a
+ * mapping_notify event or a configuration file reload
+ *
+ */
+void ungrab_all_keys(xcb_connection_t *conn);
+
+/**
+ * Grab the bound keys (tell X to send us keypress events for those keycodes)
+ *
+ */
+void grab_all_keys(xcb_connection_t *conn, bool bind_mode_switch);
+
+/**
+ * Switches the key bindings to the given mode, if the mode exists
+ *
+ */
+void switch_mode(const char *new_mode);
+
+/**
+ * Returns a pointer to the Binding with the specified modifiers and keycode
+ * or NULL if no such binding exists.
+ *
+ */
+Binding *get_binding(uint16_t modifiers, xcb_keycode_t keycode);
+
+/**
+ * Kills the configerror i3-nagbar process, if any.
+ *
+ * Called when reloading/restarting.
+ *
+ * If wait_for_it is set (restarting), this function will waitpid(), otherwise,
+ * ev is assumed to handle it (reloading).
+ *
+ */
+void kill_configerror_nagbar(bool wait_for_it);
+
+/* prototype for src/cfgparse.y */
+void parse_file(const char *f);
+
+#endif
diff --git a/include/data.h b/include/data.h
new file mode 100644 (file)
index 0000000..4dc379c
--- /dev/null
@@ -0,0 +1,467 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * include/data.h: This file defines all data structures used by i3
+ *
+ */
+#include <xcb/randr.h>
+#include <xcb/xcb_atom.h>
+#include <stdbool.h>
+
+#ifndef _DATA_H
+#define _DATA_H
+#include "queue.h"
+
+/*
+ * To get the big concept: There are helper structures like struct Colorpixel
+ * or struct Stack_Window. Everything which is also defined as type (see
+ * forward definitions) is considered to be a major structure, thus important.
+ *
+ * Let’s start from the biggest to the smallest:
+ *
+ * TODO
+ *
+ */
+
+/* Forward definitions */
+typedef struct Font i3Font;
+typedef struct Binding Binding;
+typedef struct Rect Rect;
+typedef struct xoutput Output;
+typedef struct Con Con;
+typedef struct Match Match;
+typedef struct Assignment Assignment;
+typedef struct Window i3Window;
+
+
+/******************************************************************************
+ * Helper types
+ *****************************************************************************/
+typedef enum { D_LEFT, D_RIGHT, D_UP, D_DOWN } direction_t;
+typedef enum { NO_ORIENTATION = 0, HORIZ, VERT } orientation_t;
+typedef enum { BS_NORMAL = 0, BS_NONE = 1, BS_1PIXEL = 2 } border_style_t;
+
+/** parameter to specify whether tree_close() and x_window_kill() should kill
+ * only this specific window or the whole X11 client */
+typedef enum { DONT_KILL_WINDOW = 0, KILL_WINDOW = 1, KILL_CLIENT = 2 } kill_window_t;
+
+enum {
+    BIND_NONE = 0,
+    BIND_SHIFT = XCB_MOD_MASK_SHIFT,        /* (1 << 0) */
+    BIND_CONTROL = XCB_MOD_MASK_CONTROL,    /* (1 << 2) */
+    BIND_MOD1 = XCB_MOD_MASK_1,             /* (1 << 3) */
+    BIND_MOD2 = XCB_MOD_MASK_2,             /* (1 << 4) */
+    BIND_MOD3 = XCB_MOD_MASK_3,             /* (1 << 5) */
+    BIND_MOD4 = XCB_MOD_MASK_4,             /* (1 << 6) */
+    BIND_MOD5 = XCB_MOD_MASK_5,             /* (1 << 7) */
+    BIND_MODE_SWITCH = (1 << 8)
+};
+
+/**
+ * Stores a rectangle, for example the size of a window, the child window etc.
+ * It needs to be packed so that the compiler will not add any padding bytes.
+ * (it is used in src/ewmh.c for example)
+ *
+ * Note that x and y can contain signed values in some cases (for example when
+ * used for the coordinates of a window, which can be set outside of the
+ * visible area, but not when specifying the position of a workspace for the
+ * _NET_WM_WORKAREA hint). Not declaring x/y as int32_t saves us a lot of
+ * typecasts.
+ *
+ */
+struct Rect {
+    uint32_t x;
+    uint32_t y;
+    uint32_t width;
+    uint32_t height;
+} __attribute__((packed));
+
+/**
+ * Stores the reserved pixels on each screen edge read from a
+ * _NET_WM_STRUT_PARTIAL.
+ *
+ */
+struct reservedpx {
+    uint32_t left;
+    uint32_t right;
+    uint32_t top;
+    uint32_t bottom;
+};
+
+/**
+ * Stores a width/height pair, used as part of deco_render_params to check
+ * whether the rects width/height have changed.
+ *
+ */
+struct width_height {
+    uint32_t w;
+    uint32_t h;
+};
+
+/**
+ * Stores the parameters for rendering a window decoration. This structure is
+ * cached in every Con and no re-rendering will be done if the parameters have
+ * not changed (only the pixmaps will be copied).
+ *
+ */
+struct deco_render_params {
+    struct Colortriple *color;
+    int border_style;
+    struct width_height con_rect;
+    struct width_height con_window_rect;
+    Rect con_deco_rect;
+    uint32_t background;
+    bool con_is_leaf;
+    xcb_font_t font;
+};
+
+/**
+ * Stores which workspace (by name) goes to which output.
+ *
+ */
+struct Workspace_Assignment {
+    char *name;
+    char *output;
+
+    TAILQ_ENTRY(Workspace_Assignment) ws_assignments;
+};
+
+struct Ignore_Event {
+    int sequence;
+    int response_type;
+    time_t added;
+
+    SLIST_ENTRY(Ignore_Event) ignore_events;
+};
+
+/******************************************************************************
+ * Major types
+ *****************************************************************************/
+
+/**
+ * Holds a keybinding, consisting of a keycode combined with modifiers and the
+ * command which is executed as soon as the key is pressed (see src/command.c)
+ *
+ */
+struct Binding {
+    /** Symbol the user specified in configfile, if any. This needs to be
+     * stored with the binding to be able to re-convert it into a keycode
+     * if the keyboard mapping changes (using Xmodmap for example) */
+    char *symbol;
+
+    /** Only in use if symbol != NULL. Gets set to the value to which the
+     * symbol got translated when binding. Useful for unbinding and
+     * checking which binding was used when a key press event comes in.
+     *
+     * This is an array of number_keycodes size. */
+    xcb_keycode_t *translated_to;
+
+    uint32_t number_keycodes;
+
+    /** Keycode to bind */
+    uint32_t keycode;
+
+    /** Bitmask consisting of BIND_MOD_1, BIND_MODE_SWITCH, … */
+    uint32_t mods;
+
+    /** Command, like in command mode */
+    char *command;
+
+    TAILQ_ENTRY(Binding) bindings;
+};
+
+/**
+ * Holds a command specified by either an:
+ * - exec-line
+ * - exec_always-line
+ * in the config (see src/config.c)
+ *
+ */
+struct Autostart {
+    /** Command, like in command mode */
+    char *command;
+    TAILQ_ENTRY(Autostart) autostarts;
+    TAILQ_ENTRY(Autostart) autostarts_always;
+};
+
+/**
+ * Data structure for cached font information:
+ * - font id in X11 (load it once)
+ * - font height (multiple calls needed to get it)
+ *
+ */
+struct Font {
+    /** The height of the font, built from font_ascent + font_descent */
+    int height;
+    /** The xcb-id for the font */
+    xcb_font_t id;
+};
+
+
+/**
+ * An Output is a physical output on your graphics driver. Outputs which
+ * are currently in use have (output->active == true). Each output has a
+ * position and a mode. An output usually corresponds to one connected
+ * screen (except if you are running multiple screens in clone mode).
+ *
+ */
+struct xoutput {
+    /** Output id, so that we can requery the output directly later */
+    xcb_randr_output_t id;
+    /** Name of the output */
+    char *name;
+
+    /** Pointer to the Con which represents this output */
+    Con *con;
+
+    /** Whether the output is currently active (has a CRTC attached with a
+     * valid mode) */
+    bool active;
+
+    /** Internal flags, necessary for querying RandR screens (happens in
+     * two stages) */
+    bool changed;
+    bool to_be_disabled;
+    bool primary;
+
+    /** x, y, width, height */
+    Rect rect;
+
+#if 0
+    /** The bar window */
+    xcb_window_t bar;
+    xcb_gcontext_t bargc;
+
+    /** Contains all clients with _NET_WM_WINDOW_TYPE ==
+     * _NET_WM_WINDOW_TYPE_DOCK */
+    SLIST_HEAD(dock_clients_head, Client) dock_clients;
+#endif
+
+    TAILQ_ENTRY(xoutput) outputs;
+};
+
+struct Window {
+    xcb_window_t id;
+
+    /** Holds the xcb_window_t (just an ID) for the leader window (logical
+     * parent for toolwindows and similar floating windows) */
+    xcb_window_t leader;
+    xcb_window_t transient_for;
+
+    char *class_class;
+    char *class_instance;
+
+    /** The name of the window as it will be passed to X11 (in UCS2 if the
+     * application supports _NET_WM_NAME, in COMPOUND_TEXT otherwise). */
+    char *name_x;
+
+    /** Flag to force re-rendering the decoration upon changes */
+    bool name_x_changed;
+
+    /** The name of the window as used in JSON (in UTF-8 if the application
+     * supports _NET_WM_NAME, in COMPOUND_TEXT otherwise) */
+    char *name_json;
+
+    /** The length of the name in glyphs (not bytes) */
+    int name_len;
+
+    /** Whether the application used _NET_WM_NAME */
+    bool uses_net_wm_name;
+
+    /** Whether the application needs to receive WM_TAKE_FOCUS */
+    bool needs_take_focus;
+
+    /** Whether the window says it is a dock window */
+    enum { W_NODOCK = 0, W_DOCK_TOP = 1, W_DOCK_BOTTOM = 2 } dock;
+
+    /** Pixels the window reserves. left/right/top/bottom */
+    struct reservedpx reserved;
+
+    /** Pointers to the Assignments which were already ran for this Window
+     * (assignments run only once) */
+    uint32_t nr_assignments;
+    Assignment **ran_assignments;
+};
+
+struct Match {
+    char *title;
+    int title_len;
+    char *application;
+    char *class;
+    char *instance;
+    char *mark;
+    enum {
+        M_DONTCHECK = -1,
+        M_NODOCK = 0,
+        M_DOCK_ANY = 1,
+        M_DOCK_TOP = 2,
+        M_DOCK_BOTTOM = 3
+    } dock;
+    xcb_window_t id;
+    Con *con_id;
+    enum { M_ANY = 0, M_TILING, M_FLOATING } floating;
+
+    /* Where the window looking for a match should be inserted:
+     *
+     * M_HERE   = the matched container will be replaced by the window
+     *            (layout saving)
+     * M_ASSIGN_WS = the matched container will be inserted in the target_ws.
+     * M_BELOW  = the window will be inserted as a child of the matched container
+     *            (dockareas)
+     *
+     */
+    enum { M_HERE = 0, M_ASSIGN_WS, M_BELOW } insert_where;
+
+    TAILQ_ENTRY(Match) matches;
+};
+
+/**
+ * An Assignment makes specific windows go to a specific workspace/output or
+ * run a command for that window. With this mechanism, the user can -- for
+ * example -- make specific windows floating or assign his browser to workspace
+ * "www". Checking if a window is assigned works by comparing the Match data
+ * structure with the window (see match_matches_window()).
+ *
+ */
+struct Assignment {
+    /** type of this assignment:
+     *
+     * A_COMMAND = run the specified command for the matching window
+     * A_TO_WORKSPACE = assign the matching window to the specified workspace
+     * A_TO_OUTPUT = assign the matching window to the specified output
+     *
+     * While the type is a bitmask, only one value can be set at a time. It is
+     * a bitmask to allow filtering for multiple types, for example in the
+     * assignment_for() function.
+     *
+     */
+    enum {
+        A_ANY          = 0,
+        A_COMMAND      = (1 << 0),
+        A_TO_WORKSPACE = (1 << 1),
+        A_TO_OUTPUT    = (1 << 2)
+    } type;
+
+    /** the criteria to check if a window matches */
+    Match match;
+
+    /** destination workspace/output/command, depending on the type */
+    union {
+        char *command;
+        char *workspace;
+        char *output;
+    } dest;
+
+    TAILQ_ENTRY(Assignment) assignments;
+};
+
+struct Con {
+    bool mapped;
+    enum {
+        CT_ROOT = 0,
+        CT_OUTPUT = 1,
+        CT_CON = 2,
+        CT_FLOATING_CON = 3,
+        CT_WORKSPACE = 4,
+        CT_DOCKAREA = 5
+    } type;
+    orientation_t orientation;
+    struct Con *parent;
+
+    struct Rect rect;
+    struct Rect window_rect;
+    struct Rect deco_rect;
+    /** the geometry this window requested when getting mapped */
+    struct Rect geometry;
+
+    char *name;
+
+    /** the workspace number, if this Con is of type CT_WORKSPACE and the
+     * workspace is not a named workspace (for named workspaces, num == -1) */
+    int num;
+
+    /* a sticky-group is an identifier which bundles several containers to a
+     * group. The contents are shared between all of them, that is they are
+     * displayed on whichever of the containers is currently visible */
+    char *sticky_group;
+
+    /* user-definable mark to jump to this container later */
+    char *mark;
+
+    double percent;
+
+    /* proportional width/height, calculated from WM_NORMAL_HINTS, used to
+     * apply an aspect ratio to windows (think of MPlayer) */
+    int proportional_width;
+    int proportional_height;
+    /* the wanted size of the window, used in combination with size
+     * increments (see below). */
+    int base_width;
+    int base_height;
+
+    /* the x11 border pixel attribute */
+    int border_width;
+
+    /* minimum increment size specified for the window (in pixels) */
+    int width_increment;
+    int height_increment;
+
+    struct Window *window;
+
+    /* Should this container be marked urgent? This gets set when the window
+     * inside this container (if any) sets the urgency hint, for example. */
+    bool urgent;
+
+    /* ids/pixmap/graphics context for the frame window */
+    xcb_window_t frame;
+    xcb_pixmap_t pixmap;
+    xcb_gcontext_t pm_gc;
+    bool pixmap_recreated;
+
+    /** Cache for the decoration rendering */
+    struct deco_render_params *deco_render_params;
+
+    /* Only workspace-containers can have floating clients */
+    TAILQ_HEAD(floating_head, Con) floating_head;
+
+    TAILQ_HEAD(nodes_head, Con) nodes_head;
+    TAILQ_HEAD(focus_head, Con) focus_head;
+
+    TAILQ_HEAD(swallow_head, Match) swallow_head;
+
+    enum { CF_NONE = 0, CF_OUTPUT = 1, CF_GLOBAL = 2 } fullscreen_mode;
+    enum { L_DEFAULT = 0, L_STACKED = 1, L_TABBED = 2, L_DOCKAREA = 3, L_OUTPUT = 4 } layout;
+    border_style_t border_style;
+    /** floating? (= not in tiling layout) This cannot be simply a bool
+     * because we want to keep track of whether the status was set by the
+     * application (by setting _NET_WM_WINDOW_TYPE appropriately) or by the
+     * user. The user’s choice overwrites automatic mode, of course. The
+     * order of the values is important because we check with >=
+     * FLOATING_AUTO_ON if a client is floating. */
+    enum {
+        FLOATING_AUTO_OFF = 0,
+        FLOATING_USER_OFF = 1,
+        FLOATING_AUTO_ON = 2,
+        FLOATING_USER_ON = 3
+    } floating;
+
+    /** This counter contains the number of UnmapNotify events for this
+     * container (or, more precisely, for its ->frame) which should be ignored.
+     * UnmapNotify events need to be ignored when they are caused by i3 itself,
+     * for example when reparenting or when unmapping the window on a workspace
+     * change. */
+    uint8_t ignore_unmap;
+
+    TAILQ_ENTRY(Con) nodes;
+    TAILQ_ENTRY(Con) focused;
+    TAILQ_ENTRY(Con) all_cons;
+    TAILQ_ENTRY(Con) floating_windows;
+
+    /** callbacks */
+    void(*on_remove_child)(Con *);
+};
+
+#endif
diff --git a/include/debug.h b/include/debug.h
new file mode 100644 (file)
index 0000000..3d72212
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * (c) 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+int handle_event(void *ignored, xcb_connection_t *c, xcb_generic_event_t *e);
+
+#endif
diff --git a/include/ewmh.h b/include/ewmh.h
new file mode 100644 (file)
index 0000000..2f2bf43
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _EWMH_C
+#define _EWMH_C
+
+/**
+ * Updates _NET_CURRENT_DESKTOP with the current desktop number.
+ *
+ * EWMH: The index of the current desktop. This is always an integer between 0
+ * and _NET_NUMBER_OF_DESKTOPS - 1.
+ *
+ */
+void ewmh_update_current_desktop();
+
+/**
+ * Updates _NET_ACTIVE_WINDOW with the currently focused window.
+ *
+ * EWMH: The window ID of the currently active window or None if no window has
+ * the focus.
+ *
+ */
+void ewmh_update_active_window(xcb_window_t window);
+
+/**
+ * Updates the workarea for each desktop.
+ *
+ * EWMH: Contains a geometry for each desktop. These geometries specify an area
+ * that is completely contained within the viewport. Work area SHOULD be used by
+ * desktop applications to place desktop icons appropriately.
+ *
+ */
+void ewmh_update_workarea();
+
+#endif
diff --git a/include/floating.h b/include/floating.h
new file mode 100644 (file)
index 0000000..6ab4cf2
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _FLOATING_H
+#define _FLOATING_H
+
+#include "tree.h"
+
+/** Callback for dragging */
+typedef void(*callback_t)(Con*, Rect*, uint32_t, uint32_t, void*);
+
+/** Macro to create a callback function for dragging */
+#define DRAGGING_CB(name) \
+        static void name(Con *con, Rect *old_rect, uint32_t new_x, \
+                         uint32_t new_y, void *extra)
+
+/** On which border was the dragging initiated? */
+typedef enum { BORDER_LEFT   = (1 << 0),
+               BORDER_RIGHT  = (1 << 1),
+               BORDER_TOP    = (1 << 2),
+               BORDER_BOTTOM = (1 << 3)} border_t;
+
+/**
+ * Enables floating mode for the given container by detaching it from its
+ * parent, creating a new container around it and storing this container in the
+ * floating_windows list of the workspace.
+ *
+ */
+void floating_enable(Con *con, bool automatic);
+
+/**
+ * Disables floating mode for the given container by re-attaching the container
+ * to its old parent.
+ *
+ */
+void floating_disable(Con *con, bool automatic);
+
+/**
+ * Calls floating_enable() for tiling containers and floating_disable() for
+ * floating containers.
+ *
+ * If the automatic flag is set to true, this was an automatic update by a
+ * change of the window class from the application which can be overwritten by
+ * the user.
+ *
+ */
+void toggle_floating_mode(Con *con, bool automatic);
+
+/**
+ * Raises the given container in the list of floating containers
+ *
+ */
+void floating_raise_con(Con *con);
+
+/**
+ * Checks if con’s coordinates are within its workspace and re-assigns it to
+ * the actual workspace if not.
+ *
+ */
+bool floating_maybe_reassign_ws(Con *con);
+
+#if 0
+/**
+ * Removes the floating client from its workspace and attaches it to the new
+ * workspace. This is centralized here because it may happen if you move it
+ * via keyboard and if you move it using your mouse.
+ *
+ */
+void floating_assign_to_workspace(Client *client, Workspace *new_workspace);
+
+/**
+ * Called whenever the user clicks on a border (not the titlebar!) of a
+ * floating window. Determines on which border the user clicked and launches
+ * the drag_pointer function with the resize_callback.
+ *
+ */
+int floating_border_click(xcb_connection_t *conn, Client *client,
+                          xcb_button_press_event_t *event);
+
+#endif
+/**
+ * Called when the user clicked on the titlebar of a floating window.
+ * Calls the drag_pointer function with the drag_window callback
+ *
+ */
+void floating_drag_window(Con *con, xcb_button_press_event_t *event);
+
+/**
+ * Called when the user clicked on a floating window while holding the
+ * floating_modifier and the right mouse button.
+ * Calls the drag_pointer function with the resize_window callback
+ *
+ */
+void floating_resize_window(Con *con, bool proportional, xcb_button_press_event_t *event);
+
+#if 0
+/**
+ * Changes focus in the given direction for floating clients.
+ *
+ * Changing to the left/right means going to the previous/next floating client,
+ * changing to top/bottom means cycling through the Z-index.
+ *
+ */
+void floating_focus_direction(xcb_connection_t *conn, Client *currently_focused,
+                              direction_t direction);
+
+/**
+ * Moves the client 10px to the specified direction.
+ *
+ */
+void floating_move(xcb_connection_t *conn, Client *currently_focused,
+                   direction_t direction);
+
+/**
+ * Hides all floating clients (or show them if they are currently hidden) on
+ * the specified workspace.
+ *
+ */
+void floating_toggle_hide(xcb_connection_t *conn, Workspace *workspace);
+
+#endif
+/**
+ * This function grabs your pointer and lets you drag stuff around (borders).
+ * Every time you move your mouse, an XCB_MOTION_NOTIFY event will be received
+ * and the given callback will be called with the parameters specified (client,
+ * border on which the click originally was), the original rect of the client,
+ * the event and the new coordinates (x, y).
+ *
+ */
+void drag_pointer(Con *con, xcb_button_press_event_t *event,
+                  xcb_window_t confine_to, border_t border, callback_t callback,
+                  void *extra);
+
+#endif
diff --git a/include/handlers.h b/include/handlers.h
new file mode 100644 (file)
index 0000000..0aaaf15
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _HANDLERS_H
+#define _HANDLERS_H
+
+#include <xcb/randr.h>
+
+extern int randr_base;
+
+/**
+ * Adds the given sequence to the list of events which are ignored.
+ * If this ignore should only affect a specific response_type, pass
+ * response_type, otherwise, pass -1.
+ *
+ * Every ignored sequence number gets garbage collected after 5 seconds.
+ *
+ */
+void add_ignore_event(const int sequence, const int response_type);
+
+/**
+ * Checks if the given sequence is ignored and returns true if so.
+ *
+ */
+bool event_is_ignored(const int sequence, const int response_type);
+
+/**
+ * Takes an xcb_generic_event_t and calls the appropriate handler, based on the
+ * event type.
+ *
+ */
+void handle_event(int type, xcb_generic_event_t *event);
+
+/**
+ * Sets the appropriate atoms for the property handlers after the atoms were
+ * received from X11
+ *
+ */
+void property_handlers_init();
+
+#if 0
+/**
+ * Configuration notifies are only handled because we need to set up ignore
+ * for the following enter notify events
+ *
+ */
+int handle_configure_event(void *prophs, xcb_connection_t *conn, xcb_configure_notify_event_t *event);
+#endif
+
+#if 0
+/**
+ * Handles _NET_WM_WINDOW_TYPE changes
+ *
+ */
+int handle_window_type(void *data, xcb_connection_t *conn, uint8_t state,
+                       xcb_window_t window, xcb_atom_t atom,
+                       xcb_get_property_reply_t *property);
+#endif
+
+#endif
diff --git a/include/i3.h b/include/i3.h
new file mode 100644 (file)
index 0000000..22dcd47
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/XKBlib.h>
+
+#include "queue.h"
+#include "data.h"
+#include "xcb.h"
+
+#ifndef _I3_H
+#define _I3_H
+
+extern xcb_connection_t *conn;
+extern xcb_key_symbols_t *keysyms;
+extern char **start_argv;
+extern Display *xlibdpy, *xkbdpy;
+extern int xkb_current_group;
+extern TAILQ_HEAD(bindings_head, Binding) *bindings;
+extern TAILQ_HEAD(autostarts_head, Autostart) autostarts;
+extern TAILQ_HEAD(autostarts_always_head, Autostart) autostarts_always;
+extern TAILQ_HEAD(ws_assignments_head, Workspace_Assignment) ws_assignments;
+extern TAILQ_HEAD(assignments_head, Assignment) assignments;
+extern SLIST_HEAD(stack_wins_head, Stack_Window) stack_wins;
+extern xcb_screen_t *root_screen;
+extern uint8_t root_depth;
+extern bool xcursor_supported, xkb_supported;
+extern xcb_window_t root;
+extern struct ev_loop *main_loop;
+
+#endif
diff --git a/include/i3/ipc.h b/include/i3/ipc.h
new file mode 100644 (file)
index 0000000..e81f9a1
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * This public header defines the different constants and message types to use
+ * for the IPC interface to i3 (see docs/ipc for more information).
+ *
+ */
+
+#ifndef _I3_IPC_H
+#define _I3_IPC_H
+
+/*
+ * Messages from clients to i3
+ *
+ */
+
+/** Never change this, only on major IPC breakage (don’t do that) */
+#define I3_IPC_MAGIC                   "i3-ipc"
+
+/** The payload of the message will be interpreted as a command */
+#define I3_IPC_MESSAGE_TYPE_COMMAND            0
+
+/** Requests the current workspaces from i3 */
+#define I3_IPC_MESSAGE_TYPE_GET_WORKSPACES      1
+
+/** Subscribe to the specified events */
+#define I3_IPC_MESSAGE_TYPE_SUBSCRIBE           2
+
+/** Requests the current outputs from i3 */
+#define I3_IPC_MESSAGE_TYPE_GET_OUTPUTS         3
+
+/** Requests the tree layout from i3 */
+#define I3_IPC_MESSAGE_TYPE_GET_TREE            4
+
+
+/*
+ * Messages from i3 to clients
+ *
+ */
+
+/** Command reply type */
+#define I3_IPC_REPLY_TYPE_COMMAND               0
+
+/** Workspaces reply type */
+#define I3_IPC_REPLY_TYPE_WORKSPACES            1
+
+/** Subscription reply type */
+#define I3_IPC_REPLY_TYPE_SUBSCRIBE             2
+
+/** Outputs reply type */
+#define I3_IPC_REPLY_TYPE_OUTPUTS               3
+
+/** Tree reply type */
+#define I3_IPC_REPLY_TYPE_TREE                  4
+
+
+/*
+ * Events from i3 to clients. Events have the first bit set high.
+ *
+ */
+#define I3_IPC_EVENT_MASK                       (1 << 31)
+
+/* The workspace event will be triggered upon changes in the workspace list */
+#define I3_IPC_EVENT_WORKSPACE                  (I3_IPC_EVENT_MASK | 0)
+
+/* The output event will be triggered upon changes in the output list */
+#define I3_IPC_EVENT_OUTPUT                     (I3_IPC_EVENT_MASK | 1)
+
+#endif
diff --git a/include/ipc.h b/include/ipc.h
new file mode 100644 (file)
index 0000000..a5de487
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+
+#ifndef _IPC_H
+#define _IPC_H
+
+#include <ev.h>
+#include <stdbool.h>
+#include <yajl/yajl_gen.h>
+#include <yajl/yajl_parse.h>
+
+#include "data.h"
+#include "tree.h"
+
+#include "i3/ipc.h"
+
+extern char *current_socketpath;
+
+typedef struct ipc_client {
+        int fd;
+
+        /* The events which this client wants to receive */
+        int num_events;
+        char **events;
+
+        TAILQ_ENTRY(ipc_client) clients;
+} ipc_client;
+
+/*
+ * Callback type for the different message types.
+ *
+ * message is the raw packet, as received from the UNIX domain socket. size
+ * is the remaining size of bytes for this packet.
+ *
+ * message_size is the size of the message as the sender specified it.
+ * message_type is the type of the message as the sender specified it.
+ *
+ */
+typedef void(*handler_t)(int, uint8_t*, int, uint32_t, uint32_t);
+
+/* Macro to declare a callback */
+#define IPC_HANDLER(name) \
+        static void handle_ ## name (int fd, uint8_t *message, \
+                                     int size, uint32_t message_size, \
+                                     uint32_t message_type)
+
+/**
+ * Handler for activity on the listening socket, meaning that a new client
+ * has just connected and we should accept() him. Sets up the event handler
+ * for activity on the new connection and inserts the file descriptor into
+ * the list of clients.
+ *
+ */
+void ipc_new_client(EV_P_ struct ev_io *w, int revents);
+
+/**
+ * Creates the UNIX domain socket at the given path, sets it to non-blocking
+ * mode, bind()s and listen()s on it.
+ *
+ */
+int ipc_create_socket(const char *filename);
+
+/**
+ * Sends the specified event to all IPC clients which are currently connected
+ * and subscribed to this kind of event.
+ *
+ */
+void ipc_send_event(const char *event, uint32_t message_type, const char *payload);
+
+/**
+ * Calls shutdown() on each socket and closes it. This function to be called
+ * when exiting or restarting only!
+ *
+ */
+void ipc_shutdown();
+
+void dump_node(yajl_gen gen, Con *con, bool inplace_restart);
+
+#endif
diff --git a/include/load_layout.h b/include/load_layout.h
new file mode 100644 (file)
index 0000000..f3a60a0
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _LOAD_LAYOUT_H
+#define _LOAD_LAYOUT_H
+
+void tree_append_json(const char *filename);
+
+#endif
diff --git a/include/log.h b/include/log.h
new file mode 100644 (file)
index 0000000..c1e10b0
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _LOG_H
+#define _LOG_H
+
+#include <stdarg.h>
+#include <stdbool.h>
+
+/** ##__VA_ARGS__ means: leave out __VA_ARGS__ completely if it is empty, that
+   is, delete the preceding comma */
+#define LOG(fmt, ...) verboselog(fmt, ##__VA_ARGS__)
+#define ELOG(fmt, ...) errorlog("ERROR: " fmt, ##__VA_ARGS__)
+#define DLOG(fmt, ...) debuglog(LOGLEVEL, "%s:%s:%d - " fmt, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+
+extern char *loglevels[];
+extern char *errorfilename;
+
+/**
+ * Initializes logging by creating an error logfile in /tmp (or
+ * XDG_RUNTIME_DIR, see get_process_filename()).
+ *
+ */
+void init_logging();
+
+/**
+ * Enables the given loglevel.
+ *
+ */
+void add_loglevel(const char *level);
+
+/**
+ * Set verbosity of i3. If verbose is set to true, informative messages will
+ * be printed to stdout. If verbose is set to false, only errors will be
+ * printed.
+ *
+ */
+void set_verbosity(bool _verbose);
+
+/**
+ * Logs the given message to stdout while prefixing the current time to it,
+ * but only if the corresponding debug loglevel was activated.
+ *
+ */
+void debuglog(uint64_t lev, char *fmt, ...);
+
+/**
+ * Logs the given message to stdout while prefixing the current time to it.
+ *
+ */
+void errorlog(char *fmt, ...);
+
+/**
+ * Logs the given message to stdout while prefixing the current time to it,
+ * but only if verbose mode is activated.
+ *
+ */
+void verboselog(char *fmt, ...);
+
+/**
+ * Logs the given message to stdout while prefixing the current time to it.
+ * This is to be called by LOG() which includes filename/linenumber
+ *
+ */
+void slog(char *fmt, va_list args);
+
+#endif
diff --git a/include/manage.h b/include/manage.h
new file mode 100644 (file)
index 0000000..e23eccf
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+
+#include "data.h"
+
+#ifndef _MANAGE_H
+#define _MANAGE_H
+
+/**
+ * Go through all existing windows (if the window manager is restarted) and
+ * manage them
+ *
+ */
+void manage_existing_windows(xcb_window_t root);
+
+/**
+ * Restores the geometry of each window by reparenting it to the root window
+ * at the position of its frame.
+ *
+ * This is to be called *only* before exiting/restarting i3 because of evil
+ * side-effects which are to be expected when continuing to run i3.
+ *
+ */
+void restore_geometry();
+
+/**
+ * Do some sanity checks and then reparent the window.
+ *
+ */
+void manage_window(xcb_window_t window,
+                   xcb_get_window_attributes_cookie_t cookie,
+                   bool needs_to_be_mapped);
+
+#if 0
+/**
+ * reparent_window() gets called when a new window was opened and becomes a
+ * child of the root window, or it gets called by us when we manage the
+ * already existing windows at startup.
+ *
+ * Essentially, this is the point where we take over control.
+ *
+ */
+void reparent_window(xcb_connection_t *conn, xcb_window_t child,
+                     xcb_visualid_t visual, xcb_window_t root, uint8_t depth,
+                     int16_t x, int16_t y, uint16_t width, uint16_t height,
+                     uint32_t border_width);
+
+#endif
+#endif
diff --git a/include/match.h b/include/match.h
new file mode 100644 (file)
index 0000000..2786c66
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef _MATCH_H
+#define _MATCH_H
+
+/*
+ * Initializes the Match data structure. This function is necessary because the
+ * members representing boolean values (like dock) need to be initialized with
+ * -1 instead of 0.
+ *
+ */
+void match_init(Match *match);
+
+/**
+ * Check if a match is empty. This is necessary while parsing commands to see
+ * whether the user specified a match at all.
+ *
+ */
+bool match_is_empty(Match *match);
+
+/**
+ * Copies the data of a match from src to dest.
+ *
+ */
+void match_copy(Match *dest, Match *src);
+
+/**
+ * Check if a match data structure matches the given window.
+ *
+ */
+bool match_matches_window(Match *match, i3Window *window);
+
+#endif
diff --git a/include/move.h b/include/move.h
new file mode 100644 (file)
index 0000000..d0c9701
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#ifndef _MOVE_H
+#define _MOVE_H
+
+/**
+ * Moves the current container in the given direction (TOK_LEFT, TOK_RIGHT,
+ * TOK_UP, TOK_DOWN from cmdparse.l)
+ *
+ */
+void tree_move(int direction);
+
+#endif
diff --git a/include/output.h b/include/output.h
new file mode 100644 (file)
index 0000000..67652fa
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#ifndef _OUTPUT_H
+#define _OUTPUT_H
+
+/**
+ * Returns the output container below the given output container.
+ *
+ */
+Con *output_get_content(Con *output);
+
+#endif
diff --git a/include/queue.h b/include/queue.h
new file mode 100644 (file)
index 0000000..0c68521
--- /dev/null
@@ -0,0 +1,540 @@
+/*     $OpenBSD: queue.h,v 1.1 2007/10/26 03:14:08 niallo Exp $        */
+/*     $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $       */
+
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)queue.h     8.5 (Berkeley) 8/20/94
+ */
+
+#ifndef        _SYS_QUEUE_H_
+#define        _SYS_QUEUE_H_
+
+/*
+ * This file defines five types of data structures: singly-linked lists,
+ * lists, simple queues, tail queues, and circular queues.
+ *
+ *
+ * A singly-linked list is headed by a single forward pointer. The elements
+ * are singly linked for minimum space and pointer manipulation overhead at
+ * the expense of O(n) removal for arbitrary elements. New elements can be
+ * added to the list after an existing element or at the head of the list.
+ * Elements being removed from the head of the list should use the explicit
+ * macro for this purpose for optimum efficiency. A singly-linked list may
+ * only be traversed in the forward direction.  Singly-linked lists are ideal
+ * for applications with large datasets and few or no removals or for
+ * implementing a LIFO queue.
+ *
+ * A list is headed by a single forward pointer (or an array of forward
+ * pointers for a hash table header). The elements are doubly linked
+ * so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before
+ * or after an existing element or at the head of the list. A list
+ * may only be traversed in the forward direction.
+ *
+ * A simple queue is headed by a pair of pointers, one the head of the
+ * list and the other to the tail of the list. The elements are singly
+ * linked to save space, so elements can only be removed from the
+ * head of the list. New elements can be added to the list before or after
+ * an existing element, at the head of the list, or at the end of the
+ * list. A simple queue may only be traversed in the forward direction.
+ *
+ * A tail queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or
+ * after an existing element, at the head of the list, or at the end of
+ * the list. A tail queue may be traversed in either direction.
+ *
+ * A circle queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or after
+ * an existing element, at the head of the list, or at the end of the list.
+ * A circle queue may be traversed in either direction, but has a more
+ * complex end of list detection.
+ *
+ * For details on the use of these macros, see the queue(3) manual page.
+ */
+
+#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC))
+#define _Q_INVALIDATE(a) (a) = ((void *)-1)
+#else
+#define _Q_INVALIDATE(a)
+#endif
+
+/*
+ * Singly-linked List definitions.
+ */
+#define SLIST_HEAD(name, type)                                         \
+struct name {                                                          \
+       struct type *slh_first; /* first element */                     \
+}
+
+#define        SLIST_HEAD_INITIALIZER(head)                                    \
+       { NULL }
+
+#define SLIST_ENTRY(type)                                              \
+struct {                                                               \
+       struct type *sle_next;  /* next element */                      \
+}
+
+/*
+ * Singly-linked List access methods.
+ */
+#define        SLIST_FIRST(head)       ((head)->slh_first)
+#define        SLIST_END(head)         NULL
+#define        SLIST_EMPTY(head)       (SLIST_FIRST(head) == SLIST_END(head))
+#define        SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
+
+#define        SLIST_FOREACH(var, head, field)                                 \
+       for((var) = SLIST_FIRST(head);                                  \
+           (var) != SLIST_END(head);                                   \
+           (var) = SLIST_NEXT(var, field))
+
+#define        SLIST_FOREACH_PREVPTR(var, varp, head, field)                   \
+       for ((varp) = &SLIST_FIRST((head));                             \
+           ((var) = *(varp)) != SLIST_END(head);                       \
+           (varp) = &SLIST_NEXT((var), field))
+
+/*
+ * Singly-linked List functions.
+ */
+#define        SLIST_INIT(head) {                                              \
+       SLIST_FIRST(head) = SLIST_END(head);                            \
+}
+
+#define        SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \
+       (elm)->field.sle_next = (slistelm)->field.sle_next;             \
+       (slistelm)->field.sle_next = (elm);                             \
+} while (0)
+
+#define        SLIST_INSERT_HEAD(head, elm, field) do {                        \
+       (elm)->field.sle_next = (head)->slh_first;                      \
+       (head)->slh_first = (elm);                                      \
+} while (0)
+
+#define        SLIST_REMOVE_NEXT(head, elm, field) do {                        \
+       (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next;  \
+} while (0)
+
+#define        SLIST_REMOVE_HEAD(head, field) do {                             \
+       (head)->slh_first = (head)->slh_first->field.sle_next;          \
+} while (0)
+
+#define SLIST_REMOVE(head, elm, type, field) do {                      \
+       if ((head)->slh_first == (elm)) {                               \
+               SLIST_REMOVE_HEAD((head), field);                       \
+       } else {                                                        \
+               struct type *curelm = (head)->slh_first;                \
+                                                                       \
+               while (curelm->field.sle_next != (elm))                 \
+                       curelm = curelm->field.sle_next;                \
+               curelm->field.sle_next =                                \
+                   curelm->field.sle_next->field.sle_next;             \
+               _Q_INVALIDATE((elm)->field.sle_next);                   \
+       }                                                               \
+} while (0)
+
+/*
+ * List definitions.
+ */
+#define LIST_HEAD(name, type)                                          \
+struct name {                                                          \
+       struct type *lh_first;  /* first element */                     \
+}
+
+#define LIST_HEAD_INITIALIZER(head)                                    \
+       { NULL }
+
+#define LIST_ENTRY(type)                                               \
+struct {                                                               \
+       struct type *le_next;   /* next element */                      \
+       struct type **le_prev;  /* address of previous next element */  \
+}
+
+/*
+ * List access methods
+ */
+#define        LIST_FIRST(head)                ((head)->lh_first)
+#define        LIST_END(head)                  NULL
+#define        LIST_EMPTY(head)                (LIST_FIRST(head) == LIST_END(head))
+#define        LIST_NEXT(elm, field)           ((elm)->field.le_next)
+
+#define LIST_FOREACH(var, head, field)                                 \
+       for((var) = LIST_FIRST(head);                                   \
+           (var)!= LIST_END(head);                                     \
+           (var) = LIST_NEXT(var, field))
+
+/*
+ * List functions.
+ */
+#define        LIST_INIT(head) do {                                            \
+       LIST_FIRST(head) = LIST_END(head);                              \
+} while (0)
+
+#define LIST_INSERT_AFTER(listelm, elm, field) do {                    \
+       if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
+               (listelm)->field.le_next->field.le_prev =               \
+                   &(elm)->field.le_next;                              \
+       (listelm)->field.le_next = (elm);                               \
+       (elm)->field.le_prev = &(listelm)->field.le_next;               \
+} while (0)
+
+#define        LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
+       (elm)->field.le_prev = (listelm)->field.le_prev;                \
+       (elm)->field.le_next = (listelm);                               \
+       *(listelm)->field.le_prev = (elm);                              \
+       (listelm)->field.le_prev = &(elm)->field.le_next;               \
+} while (0)
+
+#define LIST_INSERT_HEAD(head, elm, field) do {                                \
+       if (((elm)->field.le_next = (head)->lh_first) != NULL)          \
+               (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
+       (head)->lh_first = (elm);                                       \
+       (elm)->field.le_prev = &(head)->lh_first;                       \
+} while (0)
+
+#define LIST_REMOVE(elm, field) do {                                   \
+       if ((elm)->field.le_next != NULL)                               \
+               (elm)->field.le_next->field.le_prev =                   \
+                   (elm)->field.le_prev;                               \
+       *(elm)->field.le_prev = (elm)->field.le_next;                   \
+       _Q_INVALIDATE((elm)->field.le_prev);                            \
+       _Q_INVALIDATE((elm)->field.le_next);                            \
+} while (0)
+
+#define LIST_REPLACE(elm, elm2, field) do {                            \
+       if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)     \
+               (elm2)->field.le_next->field.le_prev =                  \
+                   &(elm2)->field.le_next;                             \
+       (elm2)->field.le_prev = (elm)->field.le_prev;                   \
+       *(elm2)->field.le_prev = (elm2);                                \
+       _Q_INVALIDATE((elm)->field.le_prev);                            \
+       _Q_INVALIDATE((elm)->field.le_next);                            \
+} while (0)
+
+/*
+ * Simple queue definitions.
+ */
+#define SIMPLEQ_HEAD(name, type)                                       \
+struct name {                                                          \
+       struct type *sqh_first; /* first element */                     \
+       struct type **sqh_last; /* addr of last next element */         \
+}
+
+#define SIMPLEQ_HEAD_INITIALIZER(head)                                 \
+       { NULL, &(head).sqh_first }
+
+#define SIMPLEQ_ENTRY(type)                                            \
+struct {                                                               \
+       struct type *sqe_next;  /* next element */                      \
+}
+
+/*
+ * Simple queue access methods.
+ */
+#define        SIMPLEQ_FIRST(head)         ((head)->sqh_first)
+#define        SIMPLEQ_END(head)           NULL
+#define        SIMPLEQ_EMPTY(head)         (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
+#define        SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
+
+#define SIMPLEQ_FOREACH(var, head, field)                              \
+       for((var) = SIMPLEQ_FIRST(head);                                \
+           (var) != SIMPLEQ_END(head);                                 \
+           (var) = SIMPLEQ_NEXT(var, field))
+
+/*
+ * Simple queue functions.
+ */
+#define        SIMPLEQ_INIT(head) do {                                         \
+       (head)->sqh_first = NULL;                                       \
+       (head)->sqh_last = &(head)->sqh_first;                          \
+} while (0)
+
+#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {                     \
+       if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)        \
+               (head)->sqh_last = &(elm)->field.sqe_next;              \
+       (head)->sqh_first = (elm);                                      \
+} while (0)
+
+#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {                     \
+       (elm)->field.sqe_next = NULL;                                   \
+       *(head)->sqh_last = (elm);                                      \
+       (head)->sqh_last = &(elm)->field.sqe_next;                      \
+} while (0)
+
+#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {           \
+       if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
+               (head)->sqh_last = &(elm)->field.sqe_next;              \
+       (listelm)->field.sqe_next = (elm);                              \
+} while (0)
+
+#define SIMPLEQ_REMOVE_HEAD(head, field) do {                  \
+       if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
+               (head)->sqh_last = &(head)->sqh_first;                  \
+} while (0)
+
+/*
+ * Tail queue definitions.
+ */
+#define TAILQ_HEAD(name, type)                                         \
+struct name {                                                          \
+       struct type *tqh_first; /* first element */                     \
+       struct type **tqh_last; /* addr of last next element */         \
+}
+
+#define TAILQ_HEAD_INITIALIZER(head)                                   \
+       { NULL, &(head).tqh_first }
+
+#define TAILQ_ENTRY(type)                                              \
+struct {                                                               \
+       struct type *tqe_next;  /* next element */                      \
+       struct type **tqe_prev; /* address of previous next element */  \
+}
+
+/*
+ * tail queue access methods
+ */
+#define        TAILQ_FIRST(head)               ((head)->tqh_first)
+#define        TAILQ_END(head)                 NULL
+#define        TAILQ_NEXT(elm, field)          ((elm)->field.tqe_next)
+#define TAILQ_LAST(head, headname)                                     \
+       (*(((struct headname *)((head)->tqh_last))->tqh_last))
+/* XXX */
+#define TAILQ_PREV(elm, headname, field)                               \
+       (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+#define        TAILQ_EMPTY(head)                                               \
+       (TAILQ_FIRST(head) == TAILQ_END(head))
+
+#define TAILQ_FOREACH(var, head, field)                                        \
+       for((var) = TAILQ_FIRST(head);                                  \
+           (var) != TAILQ_END(head);                                   \
+           (var) = TAILQ_NEXT(var, field))
+
+#define TAILQ_FOREACH_REVERSE(var, head, headname, field)              \
+       for((var) = TAILQ_LAST(head, headname);                         \
+           (var) != TAILQ_END(head);                                   \
+           (var) = TAILQ_PREV(var, headname, field))
+
+/*
+ * Tail queue functions.
+ */
+#define        TAILQ_INIT(head) do {                                           \
+       (head)->tqh_first = NULL;                                       \
+       (head)->tqh_last = &(head)->tqh_first;                          \
+} while (0)
+
+#define TAILQ_INSERT_HEAD(head, elm, field) do {                       \
+       if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)        \
+               (head)->tqh_first->field.tqe_prev =                     \
+                   &(elm)->field.tqe_next;                             \
+       else                                                            \
+               (head)->tqh_last = &(elm)->field.tqe_next;              \
+       (head)->tqh_first = (elm);                                      \
+       (elm)->field.tqe_prev = &(head)->tqh_first;                     \
+} while (0)
+
+#define TAILQ_INSERT_TAIL(head, elm, field) do {                       \
+       (elm)->field.tqe_next = NULL;                                   \
+       (elm)->field.tqe_prev = (head)->tqh_last;                       \
+       *(head)->tqh_last = (elm);                                      \
+       (head)->tqh_last = &(elm)->field.tqe_next;                      \
+} while (0)
+
+#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {             \
+       if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
+               (elm)->field.tqe_next->field.tqe_prev =                 \
+                   &(elm)->field.tqe_next;                             \
+       else                                                            \
+               (head)->tqh_last = &(elm)->field.tqe_next;              \
+       (listelm)->field.tqe_next = (elm);                              \
+       (elm)->field.tqe_prev = &(listelm)->field.tqe_next;             \
+} while (0)
+
+#define        TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
+       (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
+       (elm)->field.tqe_next = (listelm);                              \
+       *(listelm)->field.tqe_prev = (elm);                             \
+       (listelm)->field.tqe_prev = &(elm)->field.tqe_next;             \
+} while (0)
+
+#define TAILQ_REMOVE(head, elm, field) do {                            \
+       if (((elm)->field.tqe_next) != NULL)                            \
+               (elm)->field.tqe_next->field.tqe_prev =                 \
+                   (elm)->field.tqe_prev;                              \
+       else                                                            \
+               (head)->tqh_last = (elm)->field.tqe_prev;               \
+       *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
+       _Q_INVALIDATE((elm)->field.tqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.tqe_next);                           \
+} while (0)
+
+#define TAILQ_REPLACE(head, elm, elm2, field) do {                     \
+       if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)   \
+               (elm2)->field.tqe_next->field.tqe_prev =                \
+                   &(elm2)->field.tqe_next;                            \
+       else                                                            \
+               (head)->tqh_last = &(elm2)->field.tqe_next;             \
+       (elm2)->field.tqe_prev = (elm)->field.tqe_prev;                 \
+       *(elm2)->field.tqe_prev = (elm2);                               \
+       _Q_INVALIDATE((elm)->field.tqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.tqe_next);                           \
+} while (0)
+
+/* Swaps two consecutive elements. 'second' *MUST* follow 'first' */
+#define TAILQ_SWAP(first, second, head, field) do {                    \
+       *((first)->field.tqe_prev) = (second);                          \
+       (second)->field.tqe_prev = (first)->field.tqe_prev;             \
+       (first)->field.tqe_prev = &((second)->field.tqe_next);          \
+       (first)->field.tqe_next = (second)->field.tqe_next;             \
+       if ((second)->field.tqe_next)                                   \
+               (second)->field.tqe_next->field.tqe_prev = &((first)->field.tqe_next); \
+       (second)->field.tqe_next = first;                               \
+       if ((head)->tqh_last == &((second)->field.tqe_next))            \
+               (head)->tqh_last = &((first)->field.tqe_next);          \
+} while (0)
+
+/*
+ * Circular queue definitions.
+ */
+#define CIRCLEQ_HEAD(name, type)                                       \
+struct name {                                                          \
+       struct type *cqh_first;         /* first element */             \
+       struct type *cqh_last;          /* last element */              \
+}
+
+#define CIRCLEQ_HEAD_INITIALIZER(head)                                 \
+       { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
+
+#define CIRCLEQ_ENTRY(type)                                            \
+struct {                                                               \
+       struct type *cqe_next;          /* next element */              \
+       struct type *cqe_prev;          /* previous element */          \
+}
+
+/*
+ * Circular queue access methods
+ */
+#define        CIRCLEQ_FIRST(head)             ((head)->cqh_first)
+#define        CIRCLEQ_LAST(head)              ((head)->cqh_last)
+#define        CIRCLEQ_END(head)               ((void *)(head))
+#define        CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
+#define        CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
+#define        CIRCLEQ_EMPTY(head)                                             \
+       (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
+
+#define CIRCLEQ_FOREACH(var, head, field)                              \
+       for((var) = CIRCLEQ_FIRST(head);                                \
+           (var) != CIRCLEQ_END(head);                                 \
+           (var) = CIRCLEQ_NEXT(var, field))
+
+#define CIRCLEQ_FOREACH_REVERSE(var, head, field)                      \
+       for((var) = CIRCLEQ_LAST(head);                                 \
+           (var) != CIRCLEQ_END(head);                                 \
+           (var) = CIRCLEQ_PREV(var, field))
+
+/*
+ * Circular queue functions.
+ */
+#define        CIRCLEQ_INIT(head) do {                                         \
+       (head)->cqh_first = CIRCLEQ_END(head);                          \
+       (head)->cqh_last = CIRCLEQ_END(head);                           \
+} while (0)
+
+#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {           \
+       (elm)->field.cqe_next = (listelm)->field.cqe_next;              \
+       (elm)->field.cqe_prev = (listelm);                              \
+       if ((listelm)->field.cqe_next == CIRCLEQ_END(head))             \
+               (head)->cqh_last = (elm);                               \
+       else                                                            \
+               (listelm)->field.cqe_next->field.cqe_prev = (elm);      \
+       (listelm)->field.cqe_next = (elm);                              \
+} while (0)
+
+#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {          \
+       (elm)->field.cqe_next = (listelm);                              \
+       (elm)->field.cqe_prev = (listelm)->field.cqe_prev;              \
+       if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))             \
+               (head)->cqh_first = (elm);                              \
+       else                                                            \
+               (listelm)->field.cqe_prev->field.cqe_next = (elm);      \
+       (listelm)->field.cqe_prev = (elm);                              \
+} while (0)
+
+#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                     \
+       (elm)->field.cqe_next = (head)->cqh_first;                      \
+       (elm)->field.cqe_prev = CIRCLEQ_END(head);                      \
+       if ((head)->cqh_last == CIRCLEQ_END(head))                      \
+               (head)->cqh_last = (elm);                               \
+       else                                                            \
+               (head)->cqh_first->field.cqe_prev = (elm);              \
+       (head)->cqh_first = (elm);                                      \
+} while (0)
+
+#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                     \
+       (elm)->field.cqe_next = CIRCLEQ_END(head);                      \
+       (elm)->field.cqe_prev = (head)->cqh_last;                       \
+       if ((head)->cqh_first == CIRCLEQ_END(head))                     \
+               (head)->cqh_first = (elm);                              \
+       else                                                            \
+               (head)->cqh_last->field.cqe_next = (elm);               \
+       (head)->cqh_last = (elm);                                       \
+} while (0)
+
+#define        CIRCLEQ_REMOVE(head, elm, field) do {                           \
+       if ((elm)->field.cqe_next == CIRCLEQ_END(head))                 \
+               (head)->cqh_last = (elm)->field.cqe_prev;               \
+       else                                                            \
+               (elm)->field.cqe_next->field.cqe_prev =                 \
+                   (elm)->field.cqe_prev;                              \
+       if ((elm)->field.cqe_prev == CIRCLEQ_END(head))                 \
+               (head)->cqh_first = (elm)->field.cqe_next;              \
+       else                                                            \
+               (elm)->field.cqe_prev->field.cqe_next =                 \
+                   (elm)->field.cqe_next;                              \
+       _Q_INVALIDATE((elm)->field.cqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.cqe_next);                           \
+} while (0)
+
+#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {                   \
+       if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==         \
+           CIRCLEQ_END(head))                                          \
+               (head)->cqh_last = (elm2);                              \
+       else                                                            \
+               (elm2)->field.cqe_next->field.cqe_prev = (elm2);        \
+       if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==         \
+           CIRCLEQ_END(head))                                          \
+               (head)->cqh_first = (elm2);                             \
+       else                                                            \
+               (elm2)->field.cqe_prev->field.cqe_next = (elm2);        \
+       _Q_INVALIDATE((elm)->field.cqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.cqe_next);                           \
+} while (0)
+
+#endif /* !_SYS_QUEUE_H_ */
diff --git a/include/randr.h b/include/randr.h
new file mode 100644 (file)
index 0000000..d14d047
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include "data.h"
+#include <xcb/randr.h>
+
+#ifndef _RANDR_H
+#define _RANDR_H
+
+TAILQ_HEAD(outputs_head, xoutput);
+extern struct outputs_head outputs;
+
+/**
+ * We have just established a connection to the X server and need the initial
+ * XRandR information to setup workspaces for each screen.
+ *
+ */
+void randr_init(int *event_base);
+
+/**
+ * Disables RandR support by creating exactly one output with the size of the
+ * X11 screen.
+ *
+ */
+void disable_randr(xcb_connection_t *conn);
+
+/**
+ * Initializes a CT_OUTPUT Con (searches existing ones from inplace restart
+ * before) to use for the given Output.
+ *
+ */
+void output_init_con(Output *output);
+
+/**
+ * Initializes at least one workspace for this output, trying the following
+ * steps until there is at least one workspace:
+ *
+ * • Move existing workspaces, which are assigned to be on the given output, to
+ *   the output.
+ * • Create the first assigned workspace for this output.
+ * • Create the first unused workspace.
+ *
+ */
+void init_ws_for_output(Output *output, Con *content);
+
+/**
+ * Initializes the specified output, assigning the specified workspace to it.
+ *
+ */
+//void initialize_output(xcb_connection_t *conn, Output *output, Workspace *workspace);
+
+/**
+ * (Re-)queries the outputs via RandR and stores them in the list of outputs.
+ *
+ */
+void randr_query_outputs();
+
+/**
+ * Returns the first output which is active.
+ *
+ */
+Output *get_first_output();
+
+/**
+ * Returns the output with the given name if it is active (!) or NULL.
+ *
+ */
+Output *get_output_by_name(const char *name);
+
+/**
+ * Returns the active (!) output which contains the coordinates x, y or NULL
+ * if there is no output which contains these coordinates.
+ *
+ */
+Output *get_output_containing(int x, int y);
+
+/**
+ * Gets the output which is the last one in the given direction, for example
+ * the output on the most bottom when direction == D_DOWN, the output most
+ * right when direction == D_RIGHT and so on.
+ *
+ * This function always returns a output.
+ *
+ */
+Output *get_output_most(direction_t direction, Output *current);
+
+#endif
diff --git a/include/render.h b/include/render.h
new file mode 100644 (file)
index 0000000..9408448
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#ifndef _RENDER_H
+#define _RENDER_H
+
+/**
+ * "Renders" the given container (and its children), meaning that all rects are
+ * updated correctly. Note that this function does not call any xcb_*
+ * functions, so the changes are completely done in memory only (and
+ * side-effect free). As soon as you call x_push_changes(), the changes will be
+ * updated in X11.
+ *
+ */
+void render_con(Con *con, bool render_fullscreen);
+
+#endif
diff --git a/include/resize.h b/include/resize.h
new file mode 100644 (file)
index 0000000..5c8ea5d
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _RESIZE_H
+#define _RESIZE_H
+
+int resize_graphical_handler(Con *first, Con *second, orientation_t orientation, xcb_button_press_event_t *event);
+
+#endif
diff --git a/include/sighandler.h b/include/sighandler.h
new file mode 100644 (file)
index 0000000..02a4f5d
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ * © 2009-2010 Jan-Erik Rediger
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _SIGHANDLER_H
+#define _SIGHANDLER_H
+
+/**
+ * Setup signal handlers to safely handle SIGSEGV and SIGFPE
+ *
+ */
+void setup_signal_handler();
+
+#endif
diff --git a/include/tree.h b/include/tree.h
new file mode 100644 (file)
index 0000000..b9bf7f5
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#ifndef _TREE_H
+#define _TREE_H
+
+extern Con *croot;
+/* TODO: i am not sure yet how much access to the focused container should
+ * be permitted to source files */
+extern Con *focused;
+TAILQ_HEAD(all_cons_head, Con);
+extern struct all_cons_head all_cons;
+
+/**
+ * Initializes the tree by creating the root node, adding all RandR outputs
+ * to the tree (that means randr_init() has to be called before) and
+ * assigning a workspace to each RandR output.
+ *
+ */
+void tree_init(xcb_get_geometry_reply_t *geometry);
+
+/**
+ * Opens an empty container in the current container
+ *
+ */
+Con *tree_open_con(Con *con, i3Window *window);
+
+/**
+ * Splits (horizontally or vertically) the given container by creating a new
+ * container which contains the old one and the future ones.
+ *
+ */
+void tree_split(Con *con, orientation_t orientation);
+
+/**
+ * Moves focus one level up.
+ *
+ */
+void level_up();
+
+/**
+ * Moves focus one level down.
+ *
+ */
+void level_down();
+
+/**
+ * Renders the tree, that is rendering all outputs using render_con() and
+ * pushing the changes to X11 using x_push_changes().
+ *
+ */
+void tree_render();
+
+/**
+ * Closes the current container using tree_close().
+ *
+ */
+void tree_close_con(kill_window_t kill_window);
+
+/**
+ * Changes focus in the given way (next/previous) and given orientation
+ * (horizontal/vertical).
+ *
+ */
+void tree_next(char way, orientation_t orientation);
+
+/**
+ * Closes the given container including all children.
+ * Returns true if the container was killed or false if just WM_DELETE was sent
+ * and the window is expected to kill itself.
+ *
+ */
+bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent);
+
+/**
+ * Loads tree from ~/.i3/_restart.json (used for in-place restarts).
+ *
+ */
+bool tree_restore(const char *path, xcb_get_geometry_reply_t *geometry);
+
+/**
+ * tree_flatten() removes pairs of redundant split containers, e.g.:
+ *       [workspace, horizontal]
+ *   [v-split]           [child3]
+ *   [h-split]
+ * [child1] [child2]
+ * In this example, the v-split and h-split container are redundant.
+ * Such a situation can be created by moving containers in a direction which is
+ * not the orientation of their parent container. i3 needs to create a new
+ * split container then and if you move containers this way multiple times,
+ * redundant chains of split-containers can be the result.
+ *
+ */
+void tree_flatten(Con *child);
+
+#endif
diff --git a/include/util.h b/include/util.h
new file mode 100644 (file)
index 0000000..0e48843
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include <err.h>
+
+#include "data.h"
+
+#ifndef _UTIL_H
+#define _UTIL_H
+
+#define die(...) errx(EXIT_FAILURE, __VA_ARGS__);
+#define exit_if_null(pointer, ...) { if (pointer == NULL) die(__VA_ARGS__); }
+#define STARTS_WITH(string, needle) (strncasecmp(string, needle, strlen(needle)) == 0)
+#define CIRCLEQ_NEXT_OR_NULL(head, elm, field) (CIRCLEQ_NEXT(elm, field) != CIRCLEQ_END(head) ? \
+                                                CIRCLEQ_NEXT(elm, field) : NULL)
+#define CIRCLEQ_PREV_OR_NULL(head, elm, field) (CIRCLEQ_PREV(elm, field) != CIRCLEQ_END(head) ? \
+                                                CIRCLEQ_PREV(elm, field) : NULL)
+#define FOR_TABLE(workspace) \
+                        for (int cols = 0; cols < (workspace)->cols; cols++) \
+                                for (int rows = 0; rows < (workspace)->rows; rows++)
+
+#define NODES_FOREACH(head) \
+    for (Con *child = (Con*)-1; (child == (Con*)-1) && ((child = 0), true);) \
+        TAILQ_FOREACH(child, &((head)->nodes_head), nodes)
+
+/* greps the ->nodes of the given head and returns the first node that matches the given condition */
+#define GREP_FIRST(dest, head, condition) \
+    NODES_FOREACH(head) { \
+        if (!(condition)) \
+            continue; \
+        \
+        (dest) = child; \
+        break; \
+    }
+
+#define FREE(pointer) do { \
+        if (pointer != NULL) { \
+                free(pointer); \
+                pointer = NULL; \
+        } \
+} \
+while (0)
+
+#define CALL(obj, member, ...) obj->member(obj, ## __VA_ARGS__)
+
+int min(int a, int b);
+int max(int a, int b);
+bool rect_contains(Rect rect, uint32_t x, uint32_t y);
+Rect rect_add(Rect a, Rect b);
+
+/**
+ * Updates *destination with new_value and returns true if it was changed or false
+ * if it was the same
+ *
+ */
+bool update_if_necessary(uint32_t *destination, const uint32_t new_value);
+
+/**
+ * Safe-wrapper around malloc which exits if malloc returns NULL (meaning that
+ * there is no more memory available)
+ *
+ */
+void *smalloc(size_t size);
+
+/**
+ * Safe-wrapper around calloc which exits if malloc returns NULL (meaning that
+ * there is no more memory available)
+ *
+ */
+void *scalloc(size_t size);
+
+/**
+ * Safe-wrapper around realloc which exits if realloc returns NULL (meaning
+ * that there is no more memory available).
+ *
+ */
+void *srealloc(void *ptr, size_t size);
+
+/**
+ * Safe-wrapper around strdup which exits if malloc returns NULL (meaning that
+ * there is no more memory available)
+ *
+ */
+char *sstrdup(const char *str);
+
+/**
+ * Starts the given application by passing it through a shell. We use double
+ * fork to avoid zombie processes. As the started application’s parent exits
+ * (immediately), the application is reparented to init (process-id 1), which
+ * correctly handles childs, so we don’t have to do it :-).
+ *
+ * The shell is determined by looking for the SHELL environment variable. If
+ * it does not exist, /bin/sh is used.
+ *
+ */
+void start_application(const char *command);
+
+/**
+ * exec()s an i3 utility, for example the config file migration script or
+ * i3-nagbar. This function first searches $PATH for the given utility named,
+ * then falls back to the dirname() of the i3 executable path and then falls
+ * back to the dirname() of the target of /proc/self/exe (on linux).
+ *
+ * This function should be called after fork()ing.
+ *
+ * The first argument of the given argv vector will be overwritten with the
+ * executable name, so pass NULL.
+ *
+ * If the utility cannot be found in any of these locations, it exits with
+ * return code 2.
+ *
+ */
+void exec_i3_utility(char *name, char *argv[]);
+
+/**
+ * Checks a generic cookie for errors and quits with the given message if
+ * there was an error.
+ *
+ */
+void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie,
+                 char *err_message);
+
+/**
+ * Converts the given string to UCS-2 big endian for use with
+ * xcb_image_text_16(). The amount of real glyphs is stored in real_strlen, a
+ * buffer containing the UCS-2 encoded string (16 bit per glyph) is
+ * returned. It has to be freed when done.
+ *
+ */
+char *convert_utf8_to_ucs2(char *input, int *real_strlen);
+
+/**
+ * This function resolves ~ in pathnames.
+ * It may resolve wildcards in the first part of the path, but if no match
+ * or multiple matches are found, it just returns a copy of path as given.
+ *
+ */
+char *resolve_tilde(const char *path);
+
+/**
+ * Checks if the given path exists by calling stat().
+ *
+ */
+bool path_exists(const char *path);
+
+
+/**
+ * Returns the name of a temporary file with the specified prefix.
+ *
+ */
+char *get_process_filename(const char *prefix);
+
+/**
+ * Restart i3 in-place
+ * appends -a to argument list to disable autostart
+ *
+ */
+void i3_restart(bool forget_layout);
+
+#if defined(__OpenBSD__) || defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Find the first occurrence of the byte string s in byte string l.
+ *
+ */
+void *memmem(const void *l, size_t l_len, const void *s, size_t s_len);
+
+#endif
+
+#if defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Returns a pointer to a new string which is a duplicate of the
+ * string, but only copies at most n characters.
+ *
+ */
+char *strndup(const char *str, size_t n);
+
+#endif
+
+#endif
diff --git a/include/window.h b/include/window.h
new file mode 100644 (file)
index 0000000..fe282aa
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef _WINDOW_H
+#define _WINDOW_H
+
+/**
+ * Updates the WM_CLASS (consisting of the class and instance) for the
+ * given window.
+ *
+ */
+void window_update_class(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt);
+
+/**
+ * Updates the name by using _NET_WM_NAME (encoded in UTF-8) for the given
+ * window. Further updates using window_update_name_legacy will be ignored.
+ *
+ */
+void window_update_name(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt);
+
+/**
+ * Updates the name by using WM_NAME (encoded in COMPOUND_TEXT). We do not
+ * touch what the client sends us but pass it to xcb_image_text_8. To get
+ * proper unicode rendering, the application has to use _NET_WM_NAME (see
+ * window_update_name()).
+ *
+ */
+void window_update_name_legacy(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt);
+
+/**
+ * Updates the CLIENT_LEADER (logical parent window).
+ *
+ */
+void window_update_leader(i3Window *win, xcb_get_property_reply_t *prop);
+
+/**
+ * Updates the TRANSIENT_FOR (logical parent window).
+ *
+ */
+void window_update_transient_for(i3Window *win, xcb_get_property_reply_t *prop);
+
+/**
+ * Updates the _NET_WM_STRUT_PARTIAL (reserved pixels at the screen edges)
+ *
+ */
+void window_update_strut_partial(i3Window *win, xcb_get_property_reply_t *prop);
+
+#endif
diff --git a/include/workspace.h b/include/workspace.h
new file mode 100644 (file)
index 0000000..aebf136
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+
+#include "data.h"
+#include "tree.h"
+#include "randr.h"
+
+#ifndef _WORKSPACE_H
+#define _WORKSPACE_H
+
+/**
+ * Returns a pointer to the workspace with the given number (starting at 0),
+ * creating the workspace if necessary (by allocating the necessary amount of
+ * memory and initializing the data structures correctly).
+ *
+ * If created is not NULL, *created will be set to whether or not the
+ * workspace has just been created.
+ *
+ */
+Con *workspace_get(const char *num, bool *created);
+
+#if 0
+/**
+ * Sets the name (or just its number) for the given workspace. This has to
+ * be called for every workspace as the rendering function
+ * (render_internal_bar) relies on workspace->name and workspace->name_len
+ * being ready-to-use.
+ *
+ */
+void workspace_set_name(Workspace *ws, const char *name);
+#endif
+
+/**
+ * Returns true if the workspace is currently visible. Especially important for
+ * multi-monitor environments, as they can have multiple currenlty active
+ * workspaces.
+ *
+ */
+bool workspace_is_visible(Con *ws);
+
+/** Switches to the given workspace */
+void workspace_show(const char *num);
+
+/**
+ * Focuses the next workspace.
+ *
+ */
+void workspace_next();
+
+/**
+ * Focuses the previous workspace.
+ *
+ */
+void workspace_prev();
+
+#if 0
+/**
+ * Assigns the given workspace to the given screen by correctly updating its
+ * state and reconfiguring all the clients on this workspace.
+ *
+ * This is called when initializing a screen and when re-assigning it to a
+ * different screen which just got available (if you configured it to be on
+ * screen 1 and you just plugged in screen 1).
+ *
+ */
+void workspace_assign_to(Workspace *ws, Output *screen, bool hide_it);
+
+/**
+ * Initializes the given workspace if it is not already initialized. The given
+ * screen is to be understood as a fallback, if the workspace itself either
+ * was not assigned to a particular screen or cannot be placed there because
+ * the screen is not attached at the moment.
+ *
+ */
+void workspace_initialize(Workspace *ws, Output *screen, bool recheck);
+
+/**
+ * Gets the first unused workspace for the given screen, taking into account
+ * the preferred_screen setting of every workspace (workspace assignments).
+ *
+ */
+Workspace *get_first_workspace_for_output(Output *screen);
+
+/**
+ * Unmaps all clients (and stack windows) of the given workspace.
+ *
+ * This needs to be called separately when temporarily rendering a workspace
+ * which is not the active workspace to force reconfiguration of all clients,
+ * like in src/xinerama.c when re-assigning a workspace to another screen.
+ *
+ */
+void workspace_unmap_clients(xcb_connection_t *conn, Workspace *u_ws);
+
+/**
+ * Maps all clients (and stack windows) of the given workspace.
+ *
+ */
+void workspace_map_clients(xcb_connection_t *conn, Workspace *ws);
+#endif
+
+/**
+ * Goes through all clients on the given workspace and updates the workspace’s
+ * urgent flag accordingly.
+ *
+ */
+void workspace_update_urgent_flag(Con *ws);
+
+/**
+ * 'Forces' workspace orientation by moving all cons into a new split-con with
+ * the same orientation as the workspace and then changing the workspace
+ * orientation.
+ *
+ */
+void ws_force_orientation(Con *ws, orientation_t orientation);
+
+/**
+ * Called when a new con (with a window, not an empty or split con) should be
+ * attached to the workspace (for example when managing a new window or when
+ * moving an existing window to the workspace level).
+ *
+ * Depending on the workspace_layout setting, this function either returns the
+ * workspace itself (default layout) or creates a new stacked/tabbed con and
+ * returns that.
+ *
+ */
+Con *workspace_attach_to(Con *ws);
+
+#endif
diff --git a/include/x.h b/include/x.h
new file mode 100644 (file)
index 0000000..df4ee27
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#ifndef _X_H
+#define _X_H
+
+/** Stores the X11 window ID of the currently focused window */
+extern xcb_window_t focused_id;
+
+/**
+ * Initializes the X11 part for the given container. Called exactly once for
+ * every container from con_new().
+ *
+ */
+void x_con_init(Con *con);
+
+/**
+ * Moves a child window from Container src to Container dest.
+ *
+ */
+void x_move_win(Con *src, Con *dest);
+
+/**
+ * Reparents the child window of the given container (necessary for sticky
+ * containers). The reparenting happens in the next call of x_push_changes().
+ *
+ */
+void x_reparent_child(Con *con, Con *old);
+
+/**
+ * Re-initializes the associated X window state for this container. You have
+ * to call this when you assign a client to an empty container to ensure that
+ * its state gets updated correctly.
+ *
+ */
+void x_reinit(Con *con);
+
+/**
+ * Kills the window decoration associated with the given container.
+ *
+ */
+void x_con_kill(Con *con);
+
+/**
+ * Returns true if the client supports the given protocol atom (like WM_DELETE_WINDOW)
+ *
+ */
+bool window_supports_protocol(xcb_window_t window, xcb_atom_t atom);
+
+/**
+ * Kills the given X11 window using WM_DELETE_WINDOW (if supported).
+ *
+ */
+void x_window_kill(xcb_window_t window, kill_window_t kill_window);
+
+/**
+ * Draws the decoration of the given container onto its parent.
+ *
+ */
+void x_draw_decoration(Con *con);
+
+/**
+ * Recursively calls x_draw_decoration. This cannot be done in x_push_node
+ * because x_push_node uses focus order to recurse (see the comment above)
+ * while drawing the decoration needs to happen in the actual order.
+ *
+ */
+void x_deco_recurse(Con *con);
+
+/**
+ * This function pushes the properties of each node of the layout tree to
+ * X11 if they have changed (like the map state, position of the window, …).
+ * It recursively traverses all children of the given node.
+ *
+ */
+void x_push_node(Con *con);
+
+/**
+ * Pushes all changes (state of each node, see x_push_node() and the window
+ * stack) to X11.
+ *
+ */
+void x_push_changes(Con *con);
+
+/**
+ * Raises the specified container in the internal stack of X windows. The
+ * next call to x_push_changes() will make the change visible in X11.
+ *
+ */
+void x_raise_con(Con *con);
+
+/**
+ * Sets the WM_NAME property (so, no UTF8, but used only for debugging anyways)
+ * of the given name. Used for properly tagging the windows for easily spotting
+ * i3 windows in xwininfo -root -all.
+ *
+ */
+void x_set_name(Con *con, const char *name);
+
+/**
+ * Sets up i3 specific atoms (I3_SOCKET_PATH and I3_CONFIG_PATH)
+ *
+ */
+void x_set_i3_atoms();
+
+#endif
diff --git a/include/xcb.h b/include/xcb.h
new file mode 100644 (file)
index 0000000..13fafb0
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _XCB_H
+#define _XCB_H
+
+#include "data.h"
+#include "xcursor.h"
+
+#define _NET_WM_STATE_REMOVE    0
+#define _NET_WM_STATE_ADD       1
+#define _NET_WM_STATE_TOGGLE    2
+
+/** This is the equivalent of XC_left_ptr. I’m not sure why xcb doesn’t have a
+ * constant for that. */
+#define XCB_CURSOR_LEFT_PTR     68
+#define XCB_CURSOR_SB_H_DOUBLE_ARROW 108
+#define XCB_CURSOR_SB_V_DOUBLE_ARROW 116
+
+/* from X11/keysymdef.h */
+#define XCB_NUM_LOCK                    0xff7f
+
+/* The event masks are defined here because we don’t only set them once but we
+   need to set slight variations of them (without XCB_EVENT_MASK_ENTER_WINDOW
+   while rendering the layout) */
+/** The XCB_CW_EVENT_MASK for the child (= real window) */
+#define CHILD_EVENT_MASK (XCB_EVENT_MASK_PROPERTY_CHANGE | \
+                          XCB_EVENT_MASK_STRUCTURE_NOTIFY | \
+                          XCB_EVENT_MASK_FOCUS_CHANGE)
+
+/** The XCB_CW_EVENT_MASK for its frame */
+#define FRAME_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS |          /* …mouse is pressed/released */ \
+                          XCB_EVENT_MASK_BUTTON_RELEASE | \
+                          XCB_EVENT_MASK_POINTER_MOTION |        /* …mouse is moved */ \
+                          XCB_EVENT_MASK_EXPOSURE |              /* …our window needs to be redrawn */ \
+                          XCB_EVENT_MASK_STRUCTURE_NOTIFY |      /* …the frame gets destroyed */ \
+                          XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | /* …the application tries to resize itself */ \
+                          XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |   /* …subwindows get notifies */ \
+                          XCB_EVENT_MASK_ENTER_WINDOW)           /* …user moves cursor inside our window */
+
+#define xmacro(atom) xcb_atom_t A_ ## atom;
+#include "atoms.xmacro"
+#undef xmacro
+
+extern unsigned int xcb_numlock_mask;
+
+/**
+ * Loads a font for usage, also getting its height. If fallback is true,
+ * i3 loads 'fixed' or '-misc-*' if the font cannot be found instead of
+ * exiting.
+ *
+ */
+i3Font load_font(const char *pattern, bool fallback);
+
+/**
+ * Returns the colorpixel to use for the given hex color (think of HTML).
+ *
+ * The hex_color has to start with #, for example #FF00FF.
+ *
+ * NOTE that get_colorpixel() does _NOT_ check the given color code for
+ * validity.  This has to be done by the caller.
+ *
+ */
+uint32_t get_colorpixel(char *hex);
+
+/**
+ * Convenience wrapper around xcb_create_window which takes care of depth,
+ * generating an ID and checking for errors.
+ *
+ */
+xcb_window_t create_window(xcb_connection_t *conn, Rect r, uint16_t window_class,
+        enum xcursor_cursor_t cursor, bool map, uint32_t mask, uint32_t *values);
+
+/**
+ * Changes a single value in the graphic context (so one doesn’t have to
+ * define an array of values)
+ *
+ */
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc,
+                          uint32_t mask, uint32_t value);
+
+/**
+ * Draws a line from x,y to to_x,to_y using the given color
+ *
+ */
+void xcb_draw_line(xcb_connection_t *conn, xcb_drawable_t drawable,
+                   xcb_gcontext_t gc, uint32_t colorpixel, uint32_t x,
+                   uint32_t y, uint32_t to_x, uint32_t to_y);
+
+/**
+ * Draws a rectangle from x,y with width,height using the given color
+ *
+ */
+void xcb_draw_rect(xcb_connection_t *conn, xcb_drawable_t drawable,
+                   xcb_gcontext_t gc, uint32_t colorpixel, uint32_t x,
+                   uint32_t y, uint32_t width, uint32_t height);
+
+/**
+ * Generates a configure_notify event and sends it to the given window
+ * Applications need this to think they’ve configured themselves correctly.
+ * The truth is, however, that we will manage them.
+ *
+ */
+void fake_configure_notify(xcb_connection_t *conn, Rect r, xcb_window_t window);
+
+/**
+ * Generates a configure_notify_event with absolute coordinates (relative to
+ * the X root window, not to the client’s frame) for the given client.
+ *
+ */
+void fake_absolute_configure_notify(Con *con);
+
+/**
+ * Sends the WM_TAKE_FOCUS ClientMessage to the given window
+ *
+ */
+void send_take_focus(xcb_window_t window);
+
+/**
+ * Finds out which modifier mask is the one for numlock, as the user may
+ * change this.
+ *
+ */
+void xcb_get_numlock_mask(xcb_connection_t *conn);
+
+/**
+ * Raises the given window (typically client->frame) above all other windows
+ *
+ */
+void xcb_raise_window(xcb_connection_t *conn, xcb_window_t window);
+
+/**
+ * Calculate the width of the given text (16-bit characters, UCS) with given
+ * real length (amount of glyphs) using the given font.
+ *
+ */
+int predict_text_width(char *text, int length);
+
+/**
+ * Configures the given window to have the size/position specified by given rect
+ *
+ */
+void xcb_set_window_rect(xcb_connection_t *conn, xcb_window_t window, Rect r);
+
+
+bool xcb_reply_contains_atom(xcb_get_property_reply_t *prop, xcb_atom_t atom);
+
+#endif
diff --git a/include/xcb_compat.h b/include/xcb_compat.h
new file mode 100644 (file)
index 0000000..c00e266
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _XCB_COMPAT_H
+#define _XCB_COMPAT_H
+
+#define xcb_icccm_get_wm_protocols_reply_t xcb_get_wm_protocols_reply_t
+#define xcb_icccm_get_wm_protocols xcb_get_wm_protocols
+#define xcb_icccm_get_wm_protocols_unchecked xcb_get_wm_protocols_unchecked
+#define xcb_icccm_get_wm_protocols_reply xcb_get_wm_protocols_reply
+#define xcb_icccm_get_wm_protocols_reply_wipe xcb_get_wm_protocols_reply_wipe
+#define XCB_ICCCM_WM_STATE_NORMAL XCB_WM_STATE_NORMAL
+#define XCB_ICCCM_WM_STATE_WITHDRAWN XCB_WM_STATE_WITHDRAWN
+#define xcb_icccm_get_wm_size_hints_from_reply xcb_get_wm_size_hints_from_reply
+#define xcb_icccm_get_wm_normal_hints_reply xcb_get_wm_normal_hints_reply
+#define xcb_icccm_get_wm_normal_hints_unchecked xcb_get_wm_normal_hints_unchecked
+#define XCB_ICCCM_SIZE_HINT_P_MIN_SIZE XCB_SIZE_HINT_P_MIN_SIZE
+#define XCB_ICCCM_SIZE_HINT_P_RESIZE_INC XCB_SIZE_HINT_P_RESIZE_INC
+#define XCB_ICCCM_SIZE_HINT_BASE_SIZE XCB_SIZE_HINT_BASE_SIZE
+#define XCB_ICCCM_SIZE_HINT_P_ASPECT XCB_SIZE_HINT_P_ASPECT
+#define xcb_icccm_wm_hints_t xcb_wm_hints_t
+#define xcb_icccm_get_wm_hints_from_reply xcb_get_wm_hints_from_reply
+#define xcb_icccm_get_wm_hints_reply xcb_get_wm_hints_reply
+#define xcb_icccm_get_wm_hints_unchecked xcb_get_wm_hints_unchecked
+#define xcb_icccm_wm_hints_get_urgency xcb_wm_hints_get_urgency
+#define xcb_icccm_get_wm_transient_for_from_reply xcb_get_wm_transient_for_from_reply
+
+#endif
diff --git a/include/xcursor.h b/include/xcursor.h
new file mode 100644 (file)
index 0000000..e129a36
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+#ifndef _XCURSOR_CURSOR_H
+#define _XCURSOR_CURSOR_H
+
+#include <X11/Xlib.h>
+
+enum xcursor_cursor_t {
+    XCURSOR_CURSOR_POINTER = 0,
+    XCURSOR_CURSOR_RESIZE_HORIZONTAL,
+    XCURSOR_CURSOR_RESIZE_VERTICAL,
+    XCURSOR_CURSOR_MAX
+};
+
+void xcursor_load_cursors();
+Cursor xcursor_get_cursor(enum xcursor_cursor_t c);
+int xcursor_get_xcb_cursor(enum xcursor_cursor_t c);
+
+/**
+ * Sets the cursor of the root window to the 'pointer' cursor.
+ *
+ * This function is called when i3 is initialized, because with some login
+ * managers, the root window will not have a cursor otherwise.
+ *
+ * We have a separate xcursor function to use the same X11 connection as the
+ * xcursor_load_cursors() function. If we mix the Xlib and the XCB connection,
+ * races might occur (even though we flush the Xlib connection).
+ *
+ */
+void xcursor_set_root_cursor();
+
+#endif
diff --git a/include/xinerama.h b/include/xinerama.h
new file mode 100644 (file)
index 0000000..600b77f
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#include "data.h"
+
+#ifndef _XINERAMA_H
+#define _XINERAMA_H
+
+/**
+ * We have just established a connection to the X server and need the initial
+ * Xinerama information to setup workspaces for each screen.
+ *
+ */
+void xinerama_init();
+
+#endif
diff --git a/logo.svg b/logo.svg
new file mode 100644 (file)
index 0000000..11ec464
--- /dev/null
+++ b/logo.svg
@@ -0,0 +1,555 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210mm"
+   height="297mm"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="logo_i3_linuxfr_bapt_v2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3750">
+      <stop
+         style="stop-color:#17273b;stop-opacity:1;"
+         offset="0"
+         id="stop3752" />
+      <stop
+         id="stop4356"
+         offset="0.41666666"
+         style="stop-color:#008cd4;stop-opacity:0.78039217;" />
+      <stop
+         style="stop-color:#6eb5de;stop-opacity:0.69803923;"
+         offset="0.87847221"
+         id="stop4358" />
+      <stop
+         style="stop-color:#88bfe5;stop-opacity:0.61960787;"
+         offset="1"
+         id="stop3754" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3661"
+       inkscape:persp3d-origin="750.50629 : 505.26732 : 1"
+       inkscape:vp_z="683.5728 : 1230.5721 : 1"
+       inkscape:vp_y="0 : 1946.8917 : 0"
+       inkscape:vp_x="-526.84957 : 2.2065866e-13 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3284">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3286" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.7518248;"
+         offset="1"
+         id="stop3288" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3278">
+      <stop
+         id="stop3280"
+         offset="0"
+         style="stop-color:#33bff7;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3282"
+         offset="1"
+         style="stop-color:#2d446b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3272">
+      <stop
+         id="stop3274"
+         offset="0"
+         style="stop-color:#2596f6;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3276"
+         offset="1"
+         style="stop-color:#2d446b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3266">
+      <stop
+         id="stop3268"
+         offset="0"
+         style="stop-color:#189fff;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3270"
+         offset="1"
+         style="stop-color:#010b2b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3244">
+      <stop
+         id="stop3246"
+         offset="0"
+         style="stop-color:#419bff;stop-opacity:1;" />
+      <stop
+         id="stop3248"
+         offset="1"
+         style="stop-color:#002359;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3159">
+      <stop
+         style="stop-color:#33bff7;stop-opacity:0.38039216;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:#2d446b;stop-opacity:1;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-526.84957 : 2.9848654e-13 : 0"
+       inkscape:vp_y="1.192088e-13 : 1946.8917 : 0"
+       inkscape:vp_z="680.54236 : 1232.3792 : 1"
+       inkscape:persp3d-origin="730.30325 : 937.39936 : 1"
+       id="perspective10" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3244"
+       id="radialGradient3256"
+       cx="344.73471"
+       cy="77.263504"
+       fx="344.73471"
+       fy="77.263504"
+       r="196.15704"
+       gradientTransform="matrix(-1.39796,-5.3360318e-2,8.3551106e-2,-2.1889079,820.20461,272.08319)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="radialGradient3264"
+       cx="140.3363"
+       cy="300.27451"
+       fx="140.3363"
+       fy="300.27451"
+       r="206.15704"
+       gradientTransform="matrix(0.6771172,-0.6830119,1.1802789,1.1700925,-161.83993,77.639162)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3290"
+       cx="267.50388"
+       cy="337.12692"
+       fx="267.50388"
+       fy="337.12692"
+       r="77.845424"
+       gradientTransform="matrix(1,0,0,0.7430849,0,86.613009)"
+       gradientUnits="userSpaceOnUse" />
+    <inkscape:perspective
+       id="perspective3373"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3211">
+      <stop
+         id="stop3213"
+         offset="0"
+         style="stop-color: rgb(0, 160, 255); stop-opacity: 1;" />
+      <stop
+         id="stop3215"
+         offset="1"
+         style="stop-color: rgb(0, 37, 255); stop-opacity: 1;" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3406">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="13.396228"
+         id="feGaussianBlur3408" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3416"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3266"
+       id="radialGradient3423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1454302,-1.1687051,2.0295327,1.9193266,-889.0626,57.219022)"
+       cx="351.15485"
+       cy="372.06332"
+       fx="351.15485"
+       fy="372.06332"
+       r="163.57143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3736"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3758"
+       cx="390.69662"
+       cy="258.92429"
+       fx="390.69662"
+       fy="258.92429"
+       r="32.03125"
+       gradientTransform="matrix(4.0292425,-5.5974184,5.1695404,3.721239,-2510.9809,1613.1551)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3760"
+       cx="59.046589"
+       cy="248.2272"
+       fx="59.046589"
+       fy="248.2272"
+       r="197.15625"
+       gradientTransform="matrix(1.7105919,-4.3705195e-2,3.3347151e-2,1.3051856,-58.593126,-250.18318)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3762"
+       cx="192.64008"
+       cy="282.40387"
+       fx="192.64008"
+       fy="282.40387"
+       r="133.09375"
+       gradientTransform="matrix(1.0081228,0.4493093,-1.0529321,2.3624813,273.13721,-455.12138)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(5.7478532,-0.5889281,0.4834745,4.7186431,-260.98332,-919.446)"
+       cx="24"
+       cy="280.45392"
+       fx="24"
+       fy="280.45392"
+       r="65.0625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="linearGradient4354"
+       x1="-125.59599"
+       y1="-100.47679"
+       x2="-5.2882538"
+       y2="-100.47679"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="239.17981"
+     inkscape:cy="807.75327"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1272"
+     inkscape:window-height="950"
+     inkscape:window-x="24"
+     inkscape:window-y="24" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Logo I3</dc:title>
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title>yellowiscool, farvardin</dc:title>
+          </cc:Agent>
+        </dc:contributor>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>steckdenis</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:description>Logo for I3, an improved dynamic tiling window manager: http://i3.zekjur.net/</dc:description>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="fond"
+     style="display:none">
+    <rect
+       style="opacity:0.87000002;fill:#5599ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3241"
+       width="330"
+       height="313.5"
+       x="39"
+       y="103.86218" />
+  </g>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline">
+    <rect
+       style="opacity:1;fill:url(#radialGradient3423);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2383"
+       width="322.85715"
+       height="308.57144"
+       x="42.85714"
+       y="106.6479" />
+    <path
+       style="opacity:0.09583333;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 43.707165,106.65625 C 41.782753,110.85167 43.413409,116.56832 42.911106,121.37227 C 43.128238,169.37318 43.345369,217.37409 43.5625,265.375 C 55.407545,275.84522 72.489757,274.25524 87.152921,276.2874 C 140.64585,279.73053 194.4359,279.89819 247.75899,273.83826 C 281.78509,270.40324 315.81178,265.10681 348.64903,255.42536 C 357.00872,252.61832 367.50989,246.20234 365.71875,236.08333 C 365.71875,192.94097 365.71875,149.79861 365.71875,106.65625 C 258.38155,106.65625 151.04436,106.65625 43.707165,106.65625 z"
+       id="path3221" />
+    <g
+       transform="matrix(0.3387513,-0.3401668,0.3401668,0.3387513,59.228831,277.49214)"
+       style="opacity:0.5;fill:#000000;fill-opacity:1;filter:url(#filter3406)"
+       id="g3394">
+      <path
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 412.75,98.59375 C 396.19379,98.835333 382.96319,112.44354 383.1875,129 C 383.1875,129 383.18749,216.25107 383.1875,325.3125 C 383.1875,348.61986 371.07095,364.44442 344.96875,378.78125 C 318.86655,393.11808 279.99599,401.65625 241.09375,401.65625 C 202.19151,401.65625 163.32095,393.11808 137.21875,378.78125 C 111.11655,364.44442 99,348.61986 99,325.3125 C 99,270.93917 99.441249,221.95695 99.65625,186.4375 C 99.76375,168.67777 99.833258,154.32173 99.75,144.09375 C 99.708371,138.97976 99.620501,134.98608 99.46875,131.625 C 99.392874,129.94446 99.331848,128.56919 99.0625,126.375 C 98.927826,125.27791 98.894428,124.1628 98.0625,121.1875 C 97.646536,119.69985 97.275733,117.79087 94.875,113.75 C 92.474267,109.70913 84.912085,98.999943 69,99 C 59.653467,98.879464 50.78473,103.12192 45.013008,110.47443 C 39.241286,117.82694 37.226064,127.44941 39.5625,136.5 C 39.625678,138.53091 39.71934,140.82729 39.75,144.59375 C 39.827653,154.13315 39.763299,168.40852 39.65625,186.09375 C 39.442151,221.46421 39,270.62442 39,325.3125 C 38.999999,372.89506 69.913445,410.26687 108.34375,431.375 C 146.77406,452.48313 193.95265,461.65625 241.09375,461.65625 C 288.23485,461.65625 335.41344,452.48313 373.84375,431.375 C 412.27406,410.26687 443.1875,372.89506 443.1875,325.3125 C 443.18749,216.25108 443.1875,129 443.1875,129 C 443.29728,120.89717 440.12471,113.0945 434.39168,107.36735 C 428.65864,101.6402 420.85272,98.475651 412.75,98.59375 L 412.75,98.59375 z"
+         id="path3396" />
+      <path
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 239.5625,99.5 C 223.00629,99.741583 209.77569,113.34979 210,129.90625 L 210,350 C 209.84699,360.81908 215.53126,370.88244 224.87619,376.33663 C 234.22111,381.79082 245.77889,381.79082 255.12381,376.33663 C 264.46874,370.88244 270.15301,360.81908 270,350 L 270,129.90625 C 270.10978,121.80342 266.93721,114.00075 261.20418,108.2736 C 255.47114,102.54645 247.66522,99.381901 239.5625,99.5 L 239.5625,99.5 z"
+         id="path3398" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3400"
+         sodipodi:cx="70"
+         sodipodi:cy="40"
+         sodipodi:rx="30"
+         sodipodi:ry="30"
+         d="M 100,40 A 30,30 0 1 1 40,40 A 30,30 0 1 1 100,40 z"
+         transform="translate(0,-10)" />
+      <path
+         transform="translate(170,-10)"
+         d="M 100,40 A 30,30 0 1 1 40,40 A 30,30 0 1 1 100,40 z"
+         sodipodi:ry="30"
+         sodipodi:rx="30"
+         sodipodi:cy="40"
+         sodipodi:cx="70"
+         id="path3402"
+         style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3404"
+         sodipodi:cx="70"
+         sodipodi:cy="40"
+         sodipodi:rx="30"
+         sodipodi:ry="30"
+         d="M 100,40 A 30,30 0 1 1 40,40 A 30,30 0 1 1 100,40 z"
+         transform="translate(345,-10)" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="tiling"
+     style="display:none">
+    <rect
+       y="106.6479"
+       x="42.85714"
+       height="308.57144"
+       width="322.85715"
+       id="rect3247"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect3253"
+       width="212.07706"
+       height="98.216858"
+       x="42.85096"
+       y="218.0385" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect3257"
+       width="110.75323"
+       height="70.943619"
+       x="254.94135"
+       y="274.26196" />
+    <rect
+       y="218.02481"
+       x="254.93958"
+       height="56.235466"
+       width="110.76914"
+       id="rect3259"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       y="345.25272"
+       x="254.91608"
+       height="69.955116"
+       width="110.78036"
+       id="rect3255"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect3249"
+       width="106.87583"
+       height="111.69163"
+       x="42.849949"
+       y="106.32091" />
+    <rect
+       y="106.45182"
+       x="149.72185"
+       height="111.57816"
+       width="105.18911"
+       id="rect3261"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect3263"
+       width="110.786"
+       height="111.57211"
+       x="254.91632"
+       y="106.45485" />
+    <rect
+       y="316.22876"
+       x="42.847878"
+       height="98.979958"
+       width="212.0791"
+       id="rect3251"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="tiling2"
+     style="display:inline">
+    <rect
+       y="106.6479"
+       x="42.85714"
+       height="308.57144"
+       width="322.85715"
+       id="rect3244"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+       id="rect3246"
+       width="322.85715"
+       height="308.57144"
+       x="42.85714"
+       y="106.6479" />
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline"
+       d="M 182.85714,106.6479 L 182.85714,415.21935 L 182.85714,106.6479 z"
+       id="rect3246"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:nodetypes="ccc"
+       id="path3254"
+       d="M 182.41744,207.43363 L 43.296842,207.43363 L 182.41744,207.43363 z"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="M 182.41744,313.43363 L 43.296842,313.43363 L 182.41744,313.43363 z"
+       id="path3256"
+       sodipodi:nodetypes="ccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="I3"
+     style="display:inline">
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;opacity:0.87;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-dashoffset:0;visibility:visible;overflow:visible;enable-background:accumulate"
+       d="M 232.58675,170.48705 C 227.06049,176.20076 227.20767,185.31117 232.91561,190.84339 C 232.91561,190.84339 262.59553,220.39981 299.69461,257.34451 C 307.623,265.23991 308.90149,274.72214 304.93625,288.45787 C 300.97101,302.19359 290.70796,318.30838 277.52977,331.54163 C 264.35159,344.77488 248.27973,355.10504 234.56067,359.12752 C 220.8416,363.15 211.35411,361.91106 203.42572,354.01566 C 184.92972,335.59662 168.41707,318.85373 156.40736,306.74834 C 150.40251,300.69564 145.54261,295.80887 142.03518,292.37245 C 140.28147,290.65424 138.89319,289.33126 137.69845,288.24431 C 137.10109,287.70084 136.61259,287.25572 135.77496,286.60406 C 135.35615,286.27823 134.96551,285.91185 133.67159,285.18696 C 133.02464,284.82451 132.24966,284.30398 130.06183,283.75178 C 127.87401,283.19957 121.6694,282.14423 116.27918,287.55701 C 113.07203,290.69556 111.51088,295.14955 112.05678,299.60357 C 112.60268,304.05759 115.19327,308.00272 119.06345,310.27384 C 119.7757,310.94033 120.58858,311.68637 121.88019,312.95183 C 125.15148,316.1569 129.98569,321.01459 135.96535,327.0419 C 147.92468,339.09652 164.49757,355.90001 183.10064,374.42567 C 199.28665,390.54432 222.47127,392.68834 242.66987,386.76604 C 262.86847,380.84373 281.97067,367.90254 297.93978,351.86671 C 313.90889,335.83087 326.77031,316.67487 332.60834,296.45175 C 338.44637,276.22863 336.20569,253.05315 320.01968,236.9345 C 282.92061,199.9898 253.24069,170.43338 253.24069,170.43338 C 250.52156,167.6512 246.79264,166.08723 242.90239,166.09734 C 239.01212,166.10745 235.29138,167.69077 232.58675,170.48705 L 232.58675,170.48705 z"
+       id="path2405" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;opacity:0.87"
+       d="M 174.22754,229.70669 C 168.70128,235.42039 168.84845,244.5308 174.5564,250.06302 L 249.42498,324.62007 C 253.05344,328.33709 258.40222,329.81247 263.42316,328.48125 C 268.4441,327.15003 272.35931,323.21846 273.66958,318.19201 C 274.97985,313.16556 273.48219,307.82299 269.75006,304.21006 L 194.88148,229.65302 C 192.16235,226.87083 188.43343,225.30687 184.54317,225.31697 C 180.65291,225.32708 176.93217,226.9104 174.22754,229.70669 L 174.22754,229.70669 z"
+       id="path3179" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-opacity:1;stroke-width:124.98212864999999283;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;display:inline;opacity:0.87;color:#000000;fill-rule:evenodd;stroke:none;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;overflow:visible;enable-background:accumulate"
+       id="path3181"
+       sodipodi:cx="70"
+       sodipodi:cy="40"
+       sodipodi:rx="30"
+       sodipodi:ry="30"
+       d="M 100,40 A 30,30 0 1 1 40,40 A 30,30 0 1 1 100,40 z"
+       transform="matrix(0.3387513,-0.3401668,0.3401668,0.3387513,55.827163,274.10463)" />
+    <path
+       transform="matrix(0.3387513,-0.3401668,0.3401668,0.3387513,113.41488,216.27627)"
+       d="M 100,40 A 30,30 0 1 1 40,40 A 30,30 0 1 1 100,40 z"
+       sodipodi:ry="30"
+       sodipodi:rx="30"
+       sodipodi:cy="40"
+       sodipodi:cx="70"
+       id="path3183"
+       style="fill:#ffffff;fill-opacity:1;stroke-width:124.98212864999999283;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;display:inline;opacity:0.87;color:#000000;fill-rule:evenodd;stroke:none;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;overflow:visible;enable-background:accumulate"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-opacity:1;stroke-width:124.98212864999999283;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;display:inline;opacity:0.87;color:#000000;fill-rule:evenodd;stroke:none;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;overflow:visible;enable-background:accumulate"
+       id="path3185"
+       sodipodi:cx="70"
+       sodipodi:cy="40"
+       sodipodi:rx="30"
+       sodipodi:ry="30"
+       d="M 100,40 A 30,30 0 1 1 40,40 A 30,30 0 1 1 100,40 z"
+       transform="matrix(0.3387513,-0.3401668,0.3401668,0.3387513,172.69636,156.74708)" />
+  </g>
+</svg>
diff --git a/man/Makefile b/man/Makefile
new file mode 100644 (file)
index 0000000..facea28
--- /dev/null
@@ -0,0 +1,18 @@
+A2M:=a2x -f manpage --asciidoc-opts="-f asciidoc.conf"
+
+all: i3.1 i3-msg.1 i3-input.1 i3-nagbar.1 i3-wsbar.1 i3-config-wizard.1 i3-migrate-config-to-v4.1
+
+%.1: %.man asciidoc.conf
+       ${A2M} $<
+
+i3-wsbar.1: ../i3-wsbar
+       pod2man $^ > $@
+
+clean:
+       for file in $$(echo i3 i3-msg i3-input i3-nagbar i3-wsbar i3-config-wizard i3-migrate-config-to-v4); \
+       do \
+               rm -f $${file}.1 $${file}.html $${file}.xml; \
+       done
+
+distclean: clean
+       rm -f *.1
diff --git a/man/asciidoc.conf b/man/asciidoc.conf
new file mode 100644 (file)
index 0000000..7776d63
--- /dev/null
@@ -0,0 +1,18 @@
+ifdef::doctype-manpage[]
+ifdef::backend-docbook[]
+[header]
+template::[header-declarations]
+<refentry>
+<refmeta>
+<refentrytitle>{mantitle}</refentrytitle>
+<manvolnum>{manvolnum}</manvolnum>
+<refmiscinfo class="source">i3</refmiscinfo>
+<refmiscinfo class="version">4.0</refmiscinfo>
+<refmiscinfo class="manual">i3 Manual</refmiscinfo>
+</refmeta>
+<refnamediv>
+  <refname>{manname}</refname>
+  <refpurpose>{manpurpose}</refpurpose>
+</refnamediv>
+endif::backend-docbook[]
+endif::doctype-manpage[]
diff --git a/man/i3-config-wizard.man b/man/i3-config-wizard.man
new file mode 100644 (file)
index 0000000..5a9ca39
--- /dev/null
@@ -0,0 +1,41 @@
+i3-config-wizard(1)
+===================
+Michael Stapelberg <michael+i3@stapelberg.de>
+v4.0, July 2011
+
+== NAME
+
+i3-config-wizard - creates a keysym based config based on your layout
+
+== SYNOPSIS
+
+i3-config-wizard
+
+== FILES
+
+=== /etc/i3/config.keycodes
+
+This file contains the default configuration with keycodes. All the bindcode
+lines will be transformed to bindsym and the user-specified modifier will be
+used.
+
+== DESCRIPTION
+
+i3-config-wizard is started by i3 in its default config, unless ~/.i3/config
+exists. i3-config-wizard creates a keysym based i3 config file (based on
+/etc/i3/config.keycodes) in ~/.i3/config.
+
+The advantage of using keysyms is that the config file is easy to read,
+understand and modify. However, if we shipped with a keysym based default
+config file, the key positions would not be consistent across different
+keyboard layouts (take for example the homerow for movement). Therefore, we
+ship with a keycode based default config and let the wizard transform it
+according to your current keyboard layout.
+
+== SEE ALSO
+
+i3(1)
+
+== AUTHOR
+
+Michael Stapelberg and contributors
diff --git a/man/i3-input.man b/man/i3-input.man
new file mode 100644 (file)
index 0000000..cd85c92
--- /dev/null
@@ -0,0 +1,40 @@
+i3-input(1)
+=========
+Michael Stapelberg <michael+i3@stapelberg.de>
+v3.delta, November 2009
+
+== NAME
+
+i3-input - interactively take a command for i3 window manager
+
+== SYNOPSIS
+
+i3-input [-s <socket>] [-p <prefix>] [-l <limit>] [-P <prompt>] [-f <font>] [-v]
+
+== DESCRIPTION
+
+i3-input is a tool to take commands (or parts of a command) composed by
+the user, and send it/them to i3. This is useful, for example, for the
+mark/goto command.
+
+== EXAMPLE
+
+------------------------------------------------
+i3-input -p 'mark ' -l 1 -P 'Mark: '
+------------------------------------------------
+
+== ENVIRONMENT
+
+=== I3SOCK
+
+If no ipc-socket is specified on the commandline, this variable is used
+to determine the path, at wich the unix domain socket is expected, on which
+to connect to i3.
+
+== SEE ALSO
+
+i3(1)
+
+== AUTHOR
+
+Michael Stapelberg and contributors
diff --git a/man/i3-migrate-config-to-v4.man b/man/i3-migrate-config-to-v4.man
new file mode 100644 (file)
index 0000000..1d2b13f
--- /dev/null
@@ -0,0 +1,34 @@
+i3-migrate-config-to-v4(1)
+==========================
+Michael Stapelberg <michael+i3@stapelberg.de>
+v4.0, July 2011
+
+== NAME
+
+i3-migrate-config-to-v4 - migrates your i3 config file
+
+== SYNOPSIS
+
+-------------------------------------------------------
+mv ~/.i3/config ~/.i3/old.config
+i3-migrate-config-to-v4 ~/.i3/old.config > ~/.i3/config
+-------------------------------------------------------
+
+== DESCRIPTION
+
+i3-migrate-config-to-v4 is a Perl script which migrates your old (< version 4)
+configuration files to a version 4 config file. The most significant changes
+are the new commands (see the release notes).
+
+This script will automatically be run by i3 when it detects an old config file.
+Please migrate your config file as soon as possible. We plan to include this
+script in all i3 release until 2012-08-01. Afterwards, old config files will no
+longer be supported.
+
+== SEE ALSO
+
+i3(1)
+
+== AUTHOR
+
+Michael Stapelberg and contributors
diff --git a/man/i3-msg.man b/man/i3-msg.man
new file mode 100644 (file)
index 0000000..116195b
--- /dev/null
@@ -0,0 +1,41 @@
+i3-msg(1)
+=========
+Michael Stapelberg <michael+i3@stapelberg.de>
+v3.delta, November 2009
+
+== NAME
+
+i3-msg - send messages to i3 window manager
+
+== SYNOPSIS
+
+i3-msg "message"
+
+== DESCRIPTION
+
+i3-msg is a sample implementation for a client using the unix socket IPC
+interface to i3. At the moment, it can only be used for sending commands
+(like in configuration file for key bindings), but this may change in the
+future (staying backwards-compatible, of course).
+
+== EXAMPLE
+
+------------------------------------------------
+i3-msg "bp" # Use 1-px border for current client
+------------------------------------------------
+
+== ENVIRONMENT
+
+=== I3SOCK
+
+If no ipc-socket is specified on the commandline, this variable is used
+to determine the path, at wich the unix domain socket is expected, on which
+to connect to i3.
+
+== SEE ALSO
+
+i3(1)
+
+== AUTHOR
+
+Michael Stapelberg and contributors
diff --git a/man/i3-nagbar.man b/man/i3-nagbar.man
new file mode 100644 (file)
index 0000000..3dd37bb
--- /dev/null
@@ -0,0 +1,34 @@
+i3-nagbar(1)
+============
+Michael Stapelberg <michael+i3@stapelberg.de>
+v4.0, July 2011
+
+== NAME
+
+i3-nagbar - displays an error bar on top of your screen
+
+== SYNOPSIS
+
+i3-nagbar -m 'message' -b 'label' 'action'
+
+== DESCRIPTION
+
+i3-nagbar is used by i3 to tell you about errors in your configuration file
+(for example). While these errors are logged to the logfile (if any), the past
+has proven that users are either not aware of their logfile or do not check it
+after modifying the configuration file.
+
+== EXAMPLE
+
+------------------------------------------------
+i3-nagbar -m 'You have an error in your i3 config file!' \
+-b 'edit config' 'xterm $EDITOR ~/.i3/config'
+------------------------------------------------
+
+== SEE ALSO
+
+i3(1)
+
+== AUTHOR
+
+Michael Stapelberg and contributors
diff --git a/man/i3.man b/man/i3.man
new file mode 100644 (file)
index 0000000..868ff8c
--- /dev/null
@@ -0,0 +1,319 @@
+i3(1)
+=====
+Michael Stapelberg <michael+i3@stapelberg.de>
+v4.0, July 2011
+
+== NAME
+
+i3 - an improved dynamic, tiling window manager
+
+== SYNOPSIS
+
+i3 [-a] [-c configfile] [-C] [-d <loglevel>] [-v] [-V]
+
+== OPTIONS
+
+-a::
+Disables autostart.
+
+-c::
+Specifies an alternate configuration file path.
+
+-C::
+Check the configuration file for validity and exit.
+
+-d::
+Specifies the debug loglevel. To see the most output, use -d all.
+
+-v::
+Display version number (and date of the last commit).
+
+-V::
+Be verbose.
+
+== DESCRIPTION
+
+=== INTRODUCTION
+
+i3 was created because wmii, our favorite window manager at the time, didn’t
+provide some features we wanted (multi-monitor done right, for example), had
+some bugs, didn’t progress since quite some time and wasn’t easy to hack at all
+(source code comments/documentation completely lacking). Still, we think the
+wmii developers and contributors did a great job. Thank you for inspiring us to
+create i3.
+
+Please be aware that i3 is primarily targeted at advanced users and developers.
+
+=== IMPORTANT NOTE TO nVidia BINARY DRIVER USERS
+
+If you are using the nVidia binary graphics driver (also known as 'blob')
+you need to use the +--force-xinerama+ flag (in your ~/.xsession) when starting
+i3, like so:
+
+----------------------------------------------
+exec i3 --force-xinerama -V >>~/.i3/i3log 2>&1
+----------------------------------------------
+
+See also docs/multi-monitor for the full explanation.
+
+=== TERMINOLOGY
+
+Tree::
+i3 keeps your layout in a tree data structure.
+
+Window::
+An X11 window, like the Firefox browser window or a terminal emulator.
+
+Split container::
+A split container contains multiple other split containers or windows.
++
+Containers can be used in various layouts. The default mode is called "default"
+and just resizes each client equally so that it fits.
+
+Workspace::
+A workspace is a set of containers. Other window managers call this "Virtual
+Desktops".
++
+In i3, each workspace is assigned to a specific virtual screen. By default,
+screen 1 has workspace 1, screen 2 has workspace 2 and so on… However, when you
+create a new workspace (by simply switching to it), it’ll be assigned the
+screen you are currently on.
+
+Output::
+Using XRandR, you can have an X11 screen spanning multiple real monitors.
+Furthermore, you can set them up in cloning mode or with positions (monitor 1
+is left of monitor 2).
++
+i3 uses the RandR API to query which outputs are available and which screens
+are connected to these outputs.
+
+== KEYBINDINGS
+
+Here is a short overview of the default keybindings:
+
+j/k/l/;::
+Direction keys (left, down, up, right). They are on your homerow (see the mark
+on your "j" key). Alternatively, you can use the cursor keys.
+
+Mod1+<direction>::
+Focus window in <direction>.
+
+Mod1+Shift+<direction>::
+Move window to <direction>.
+
+Mod1+<number>::
+Switch to workspace <number>.
+
+Mod1+Shift+<number>::
+Move window to workspace <number>.
+
+Mod1+f::
+Toggle fullscreen mode.
+
+Mod1+s::
+Enable stacking layout for the current container.
+
+Mod1+e::
+Enable default layout for the current container.
+
+Mod1+w::
+Enable tabbed layout for the current container.
+
+Mod1+Shift+Space::
+Toggle tiling/floating for the current container.
+
+Mod1+Space::
+Select the first tiling container if the current container is floating and
+vice-versa.
+
+Mod1+Shift+q::
+Kills the current window. This is equivalent to "clicking on the close button",
+meaning a polite request to the application to close this window. For example,
+Firefox will save its session upon such a request. If the application does not
+support that, the window will be killed and it depends on the application what
+happens.
+
+Mod1+Shift+r::
+Restarts i3 in place. Your layout will be preserved.
+
+Mod1+Shift+e::
+Exits i3.
+
+== FILES
+
+=== \~/.i3/config (or ~/.config/i3/config)
+
+When starting, i3 looks for configuration files in the following order:
+
+1. ~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set)
+2. /etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set)
+3. ~/.i3/config
+4. /etc/i3/config
+
+You can specify a custom path using the -c option.
+
+.Sample configuration
+-------------------------------------------------------------
+# i3 config file (v4)
+
+# font for window titles. ISO 10646 = Unicode
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# use Mouse+Mod1 to drag floating windows to their wanted position
+floating_modifier Mod1
+
+# start a terminal
+bindsym Mod1+Return exec /usr/bin/urxvt
+
+# kill focused window
+bindsym Mod1+Shift+q kill
+
+# start dmenu (a program launcher)
+bindsym Mod1+d exec /usr/bin/dmenu_run
+
+# change focus
+bindsym Mod1+j focus left
+bindsym Mod1+k focus down
+bindsym Mod1+l focus up
+bindsym Mod1+semicolon focus right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Left focus left
+bindsym Mod1+Down focus down
+bindsym Mod1+Up focus up
+bindsym Mod1+Right focus right
+
+# move focused window
+bindsym Mod1+Shift+j move left
+bindsym Mod1+Shift+k move down
+bindsym Mod1+Shift+l move up
+bindsym Mod1+Shift+semicolon move right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Shift+Left move left
+bindsym Mod1+Shift+Down move down
+bindsym Mod1+Shift+Up move up
+bindsym Mod1+Shift+Right move right
+
+# split in horizontal orientation
+bindsym Mod1+h split h
+
+# split in vertical orientation
+bindsym Mod1+v split v
+
+# enter fullscreen mode for the focused container
+bindsym Mod1+f fullscreen
+
+# change container layout (stacked, tabbed, default)
+bindsym Mod1+s layout stacking
+bindsym Mod1+w layout tabbed
+bindsym Mod1+e layout default
+
+# toggle tiling / floating
+bindsym Mod1+Shift+space floating toggle
+
+# change focus between tiling / floating windows
+bindsym Mod1+space focus mode_toggle
+
+# focus the parent container
+bindsym Mod1+a focus parent
+
+# focus the child container
+#bindsym Mod1+d focus child
+
+# switch to workspace
+bindsym Mod1+1 workspace 1
+bindsym Mod1+2 workspace 2
+# ..
+
+# move focused container to workspace
+bindsym Mod1+Shift+1 move workspace 1
+bindsym Mod1+Shift+2 move workspace 2
+# ...
+
+# reload the configuration file
+bindsym Mod1+Shift+c reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindsym Mod1+Shift+r restart
+# exit i3 (logs you out of your X session)
+bindsym Mod1+Shift+e exit
+
+# Start i3bar to display a workspace bar (plus the system information i3status
+# finds out, if available)
+exec i3status | i3bar -d
+-------------------------------------------------------------
+
+=== ~/.xsession
+
+This file is where you should configure your locales and start i3. It is run by
+your login manager (xdm, slim, gdm, …) as soon as you login.
+
+.Sample xsession
+-------------------------------------------------------------
+# Disable DPMS turning off the screen
+xset -dpms
+xset s off
+
+# Disable bell
+xset -b
+
+# Enable zapping (C-A-<Bksp> kills X)
+setxkbmap -option terminate:ctrl_alt_bksp
+
+# Enforce correct locales from the beginning
+unset LC_COLLATE
+export LC_CTYPE=de_DE.UTF-8
+export LC_TIME=de_DE.UTF-8
+export LC_NUMERIC=de_DE.UTF-8
+export LC_MONETARY=de_DE.UTF-8
+export LC_MESSAGES=C
+export LC_PAPER=de_DE.UTF-8
+export LC_NAME=de_DE.UTF-8
+export LC_ADDRESS=de_DE.UTF-8
+export LC_TELEPHONE=de_DE.UTF-8
+export LC_MEASUREMENT=de_DE.UTF-8
+export LC_IDENTIFICATION=de_DE.UTF-8
+
+# Use XToolkit in java applications
+export AWT_TOOLKIT=XToolkit
+
+# Set background color
+xsetroot -solid "#333333"
+
+# Enable core dumps in case something goes wrong
+ulimit -c unlimited
+
+# Start i3 and log to ~/.i3/logfile
+echo "Starting at $(date)" >> ~/.i3/logfile
+exec /usr/bin/i3 -V -d all >> ~/.i3/logfile
+-------------------------------------------------------------
+
+== ENVIRONMENT
+
+=== I3SOCK
+
+This variable overwrites the IPC socket path (placed in
+/tmp/i3-%u/ipc-socket.%p by default, where %u is replaced with your UNIX
+username and %p is replaced with i3’s PID). The IPC socket is used by external
+programs like i3-msg(1) or i3bar(1).
+
+== TODO
+
+There is still lot of work to do. Please check our bugtracker for up-to-date
+information about tasks which are still not finished.
+
+== SEE ALSO
+
+You should have a copy of the userguide (featuring nice screenshots/graphics
+which is why this is not integrated into this manpage), the debugging guide,
+and the "how to hack" guide. If you are building from source, run:
+ +make -C docs+
+
+You can also access these documents online at http://i3.zekjur.net/
+
+i3-input(1), i3-msg(1), i3-wsbar(1), i3-nagbar(1), i3-config-wizard(1),
+i3-migrate-config-to-v4(1)
+
+== AUTHOR
+
+Michael Stapelberg and contributors
diff --git a/pseudo-doc.doxygen b/pseudo-doc.doxygen
new file mode 100644 (file)
index 0000000..e8e7b3e
--- /dev/null
@@ -0,0 +1,148 @@
+# Doxyfile 1.5.6
+#
+# You can use this file with doxygen to create a pseudo-documentation
+# automatically from source. doxygen-comments are not used very extensively
+# in i3, mostly for the reason that it clutters the source code and has no
+# real use (doxygen’s output looks really ugly).
+#
+# So, if you want to use it, here you go. This is however not a supported
+# document, and I recommend you have a look at the docs/ folder or at
+# http://i3.zekjur.net/ for more, real documentation.
+#
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = i3
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = pseudo-doc
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ALWAYS_DETAILED_SEC    = YES
+FULL_PATH_NAMES        = YES
+SHORT_NAMES            = YES
+JAVADOC_AUTOBRIEF      = YES
+TAB_SIZE               = 8
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+CASE_SENSE_NAMES       = YES
+SHOW_INCLUDE_FILES     = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+INPUT                  = src include
+INPUT_ENCODING         = UTF-8
+RECURSIVE              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+
+STRIP_CODE_COMMENTS    = YES
+
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_ALIGN_MEMBERS     = YES
+HTML_DYNAMIC_SECTIONS  = NO
+FORMULA_FONTSIZE       = 10
+
+GENERATE_LATEX         = NO
+GENERATE_RTF           = NO
+GENERATE_MAN           = NO
+GENERATE_XML           = NO
+GENERATE_AUTOGEN_DEF   = NO
+GENERATE_PERLMOD       = NO
+
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+CLASS_DIAGRAMS         = YES
+HAVE_DOT               = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = YES
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = YES
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+SEARCHENGINE           = NO
diff --git a/render-tree/Con.pm b/render-tree/Con.pm
new file mode 100644 (file)
index 0000000..1830caf
--- /dev/null
@@ -0,0 +1,21 @@
+# vim:ts=4:sw=4:expandtab
+package Con;
+
+use Moose;
+use MooseX::AttributeHelpers;
+use v5.10;
+
+has 'name' => (is => 'ro', isa => 'Str');
+has 'width' => (is => 'rw', isa => 'Int', default => 100);
+has '_nodes' => (is => 'ro', metaclass => 'Collection::Array', isa => 'ArrayRef[Con]',
+    default => sub { [] },
+    provides => {
+        'push' => 'add_node',
+        elements => 'nodes',
+    }
+);
+has 'parent' => (is => 'rw', isa => 'Con', predicate => 'has_parent');
+
+__PACKAGE__->meta->make_immutable;
+
+1
diff --git a/render-tree/render.pl b/render-tree/render.pl
new file mode 100755 (executable)
index 0000000..bea5811
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+# © 2011 Michael Stapelberg, see LICENSE
+#
+# Needs SVG (libsvg-perl), IO::All (libio-all-perl), JSON::XS (libjson-xs-perl) and Moose (libmoose-perl)
+#
+# XXX: unfinished proof-of-concept. awaits a json dump in my.tree, renders to test.svg
+# XXX: needs more beautifying (in the SVG but also in the code)
+# XXX: has some rendering differences between firefox and chromium. maybe inkscape makes the file look the same in both browsers
+
+use strict;
+use warnings;
+use SVG;
+use Data::Dumper;
+use JSON::XS;
+use IO::All;
+use List::Util qw(sum);
+use lib qw(.);
+use Con;
+use v5.10;
+
+my $input = io('my.tree')->slurp;
+my $tree = decode_json($input);
+my $root = parse_tree($tree);
+render_tree($root);
+
+sub parse_tree {
+    my ($input, $parent) = @_;
+    my $con = Con->new(name => $input->{name});
+    $con->parent($parent) if defined($parent);
+    for my $node (@{$input->{nodes}}) {
+        $con->add_node(parse_tree($node, $con));
+    }
+
+    return $con;
+}
+
+sub render_tree {
+    my ($con) = @_;
+    say 'rendering con ' . $con->name;
+    my @nodes = $con->nodes;
+    for my $node (@nodes) {
+        render_tree($node);
+    }
+
+    # nothing to calculate when there are no children
+    return unless @nodes > 0;
+
+    $con->width((@nodes > 1 ? (@nodes - 1) * 20 : 0) + sum map { $_->width } @nodes);
+
+    say $con->name . ' has width ' . $con->width;
+}
+
+# TODO: figure out the height
+my $svg = SVG->new(id => "tree", width => $root->width + 5, height => '1052');
+
+my $l1 = $svg->group(id => 'layer1');
+
+# gaussian blur (for drop shadows)
+$svg->defs()->filter(id => 'dropshadow')->fe(-type => 'gaussianblur', stdDeviation => '2.19');
+
+my $idcnt = 0;
+my $y = 10;
+render_svg($root, 0, 0);
+
+sub render_svg {
+    my ($con, $level, $x) = @_;
+
+    my $indent = ' ' x $level;
+
+    say $indent . 'svg-rendering con ' . $con->name . ' on level ' . $level;
+    say $indent . 'width: ' . $con->width;
+
+    # render the dropshadow rect
+    $l1->rect(
+        id => 'outer_rect_shadow' . $idcnt,
+        style => 'opacity:1.0;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-opacity:1;stroke-miterlimit:4;filter:url(#dropshadow)',
+        width => "96",
+        height => '50',
+        #x => $x + ($con->has_parent ? ($con->parent->width - 100) / 2 : 0),
+        x => $x + ($con->width / 2) - (96 / 2) + 0,
+        y => 4 + $level * 70 + 0,
+    );
+    $idcnt++;
+
+    # render the main rect
+    $l1->rect(
+        id => 'outer_rect' . $idcnt,
+        style => 'opacity:1.0;fill:#c30000;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-opacity:1;stroke-miterlimit:4',
+        width => "96",
+        height => '50',
+        x => $x + ($con->width / 2) - (96 / 2),
+        y => 4 + $level * 70,
+    );
+
+    $idcnt++;
+
+    # render the text
+    $l1->text(
+        style => 'font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:left;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Trebuchet MS;-inkscape-font-specification:Trebuchet MS',
+        x => $x + ($con->width / 2) - (100/2) + 5,
+        y => 4 + 15 + $level * 70,
+        id => 'title_'.$idcnt,
+    )->tspan(style => 'text-align:start;text-anchor:start')->cdata($con->name);
+    $idcnt++;
+
+    $y = $y + 50;
+    my @nodes = $con->nodes;
+    my $startx = $x + ($con->width / 2);
+
+    for my $node (@nodes) {
+        render_svg($node, $level + 1, $x);
+        my $mid = $x + ($node->width / 2);
+        $l1->path(
+            d => 'M ' . $startx . ',' . (4 + $level * 70 + 50) . ' ' . $mid . ',' . (4 + ($level+1) * 70),
+            id => 'path' . $idcnt,
+            style => 'fill:none;stroke:#000000;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'
+        );
+        $x += $node->width + 20;
+        $idcnt++;
+    }
+
+}
+
+$svg->render > io('test.svg');
diff --git a/src/assignments.c b/src/assignments.c
new file mode 100644 (file)
index 0000000..f171dc3
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ */
+#include "all.h"
+
+/*
+ * Checks the list of assignments for the given window and runs all matching
+ * ones (unless they have already been run for this specific window).
+ *
+ */
+void run_assignments(i3Window *window) {
+    DLOG("Checking assignments...\n");
+
+    /* Check if any assignments match */
+    Assignment *current;
+    TAILQ_FOREACH(current, &assignments, assignments) {
+        if (!match_matches_window(&(current->match), window))
+            continue;
+
+        bool skip = false;
+        for (int c = 0; c < window->nr_assignments; c++) {
+            if (window->ran_assignments[c] != current)
+                continue;
+
+            DLOG("This assignment already ran for the given window, not executing it again.\n");
+            skip = true;
+            break;
+        }
+
+        if (skip)
+            continue;
+
+        DLOG("matching assignment, would do:\n");
+        if (current->type == A_COMMAND) {
+            DLOG("execute command %s\n", current->dest.command);
+            char *full_command;
+            asprintf(&full_command, "[id=\"%d\"] %s", window->id, current->dest.command);
+            parse_cmd(full_command);
+        }
+
+        /* Store that we ran this assignment to not execute it again */
+        window->nr_assignments++;
+        window->ran_assignments = srealloc(window->ran_assignments, sizeof(Assignment*) * window->nr_assignments);
+        window->ran_assignments[window->nr_assignments-1] = current;
+    }
+}
+
+/*
+ * Returns the first matching assignment for the given window.
+ *
+ */
+Assignment *assignment_for(i3Window *window, int type) {
+    Assignment *assignment;
+
+    TAILQ_FOREACH(assignment, &assignments, assignments) {
+        if ((type != A_ANY && (assignment->type & type) == 0) ||
+            !match_matches_window(&(assignment->match), window))
+            continue;
+        DLOG("got a matching assignment (to %s)\n", assignment->dest.workspace);
+        return assignment;
+    }
+
+    return NULL;
+}
diff --git a/src/cfgparse.l b/src/cfgparse.l
new file mode 100644 (file)
index 0000000..2e1d240
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
+%option nounput
+%option noinput
+%option noyy_top_state
+%option stack
+
+%{
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <xcb/xcb.h>
+
+#include "data.h"
+#include "config.h"
+#include "log.h"
+#include "util.h"
+
+#include "cfgparse.tab.h"
+
+int yycolumn = 1;
+
+#define YY_DECL int yylex (struct context *context)
+
+#define YY_USER_ACTION { \
+    context->first_column = yycolumn; \
+    context->last_column = yycolumn+yyleng-1; \
+    yycolumn += yyleng; \
+}
+
+/* macro to first eat whitespace, then expect a string */
+#define WS_STRING do { \
+    yy_push_state(WANT_STRING); \
+    yy_push_state(EAT_WHITESPACE); \
+} while (0)
+
+%}
+
+EOL     (\r?\n)
+
+%s WANT_STRING
+%s WANT_QSTRING
+%s BINDSYM_COND
+%s ASSIGN_COND
+%s ASSIGN_TARGET_COND
+%s COLOR_COND
+%s OUTPUT_COND
+%s FOR_WINDOW_COND
+%s EAT_WHITESPACE
+%x BUFFER_LINE
+
+%%
+
+    {
+        /* This is called when a new line is lexed. We only want the
+         * first line to match to go into state BUFFER_LINE */
+        if (context->line_number == 0) {
+            context->line_number = 1;
+            BEGIN(INITIAL);
+            yy_push_state(BUFFER_LINE);
+        }
+    }
+
+<BUFFER_LINE>^[^\r\n]*/{EOL}? {
+    /* save whole line */
+    context->line_copy = sstrdup(yytext);
+
+    yyless(0);
+    yy_pop_state();
+    yy_set_bol(true);
+    yycolumn = 1;
+}
+
+
+<FOR_WINDOW_COND>"]"            { yy_pop_state(); return ']'; }
+<EAT_WHITESPACE>[ \t]*          { yy_pop_state(); }
+<WANT_QSTRING>\"[^\"]+\"        {
+                                  yy_pop_state();
+                                  /* strip quotes */
+                                  char *copy = sstrdup(yytext+1);
+                                  copy[strlen(copy)-1] = '\0';
+                                  yylval.string = copy;
+                                  return STR;
+                                }
+<WANT_STRING>[^\n]+             { BEGIN(INITIAL); yylval.string = sstrdup(yytext); return STR; }
+<OUTPUT_COND>[a-zA-Z0-9_-]+     { yylval.string = sstrdup(yytext); return OUTPUT; }
+^[ \t]*#[^\n]*                  { return TOKCOMMENT; }
+<COLOR_COND>[0-9a-fA-F]+        { yylval.string = sstrdup(yytext); return HEX; }
+<ASSIGN_TARGET_COND>[ \t]*→[ \t]*     { BEGIN(WANT_STRING); }
+<ASSIGN_TARGET_COND>[ \t]+      { BEGIN(WANT_STRING); }
+[0-9]+                          { yylval.number = atoi(yytext); return NUMBER; }
+mode                            { return TOKMODE; }
+bind                            { yy_push_state(WANT_STRING); yy_push_state(EAT_WHITESPACE); yy_push_state(EAT_WHITESPACE); return TOKBINDCODE; }
+bindcode                        { yy_push_state(WANT_STRING); yy_push_state(EAT_WHITESPACE); yy_push_state(EAT_WHITESPACE); return TOKBINDCODE; }
+bindsym                         { yy_push_state(BINDSYM_COND); yy_push_state(EAT_WHITESPACE); return TOKBINDSYM; }
+floating_modifier               { BEGIN(INITIAL); return TOKFLOATING_MODIFIER; }
+workspace                       { BEGIN(INITIAL); return TOKWORKSPACE; }
+output                          { yy_push_state(OUTPUT_COND); yy_push_state(EAT_WHITESPACE); return TOKOUTPUT; }
+screen                          {
+                                  /* for compatibility until v3.φ */
+                                  ELOG("Assignments to screens are DEPRECATED and will not work. " \
+                                       "Please replace them with assignments to outputs.\n");
+                                  yy_push_state(OUTPUT_COND); yy_push_state(EAT_WHITESPACE);
+                                  return TOKOUTPUT;
+                                }
+terminal                        { WS_STRING; return TOKTERMINAL; }
+font                            { WS_STRING; return TOKFONT; }
+assign                          { yy_push_state(ASSIGN_TARGET_COND); yy_push_state(ASSIGN_COND); return TOKASSIGN; }
+set[^\n]*                       { return TOKCOMMENT; }
+ipc-socket                      { WS_STRING; return TOKIPCSOCKET; }
+ipc_socket                      { WS_STRING; return TOKIPCSOCKET; }
+restart_state                   { WS_STRING; return TOKRESTARTSTATE; }
+default_orientation             { return TOK_ORIENTATION; }
+horizontal                      { return TOK_HORIZ; }
+vertical                        { return TOK_VERT; }
+auto                            { return TOK_AUTO; }
+workspace_layout                { return TOK_WORKSPACE_LAYOUT; }
+new_window                      { return TOKNEWWINDOW; }
+normal                          { return TOK_NORMAL; }
+none                            { return TOK_NONE; }
+1pixel                          { return TOK_1PIXEL; }
+focus_follows_mouse             { return TOKFOCUSFOLLOWSMOUSE; }
+force_focus_wrapping            { return TOK_FORCE_FOCUS_WRAPPING; }
+workspace_bar                   { return TOKWORKSPACEBAR; }
+popup_during_fullscreen         { return TOK_POPUP_DURING_FULLSCREEN; }
+ignore                          { return TOK_IGNORE; }
+leave_fullscreen                { return TOK_LEAVE_FULLSCREEN; }
+for_window                      {
+                                  /* Example: for_window [class="urxvt"] border none
+                                   *
+                                   * First, we wait for the ']' that finishes a match (FOR_WINDOW_COND)
+                                   * Then, we require a whitespace (EAT_WHITESPACE)
+                                   * And the rest of the line is parsed as a string
+                                   */
+                                  yy_push_state(WANT_STRING);
+                                  yy_push_state(EAT_WHITESPACE);
+                                  yy_push_state(FOR_WINDOW_COND);
+                                  return TOK_FOR_WINDOW;
+                                }
+default                         { /* yylval.number = MODE_DEFAULT; */return TOK_DEFAULT; }
+stacking                        { /* yylval.number = MODE_STACK; */return TOK_STACKING; }
+stacked                         { return TOK_STACKING; }
+tabbed                          { /* yylval.number = MODE_TABBED; */return TOK_TABBED; }
+stack-limit                     { return TOKSTACKLIMIT; }
+cols                            { /* yylval.number = STACK_LIMIT_COLS; */return TOKSTACKLIMIT; }
+rows                            { /* yylval.number = STACK_LIMIT_ROWS; */return TOKSTACKLIMIT; }
+exec                            { WS_STRING; return TOKEXEC; }
+exec_always                     { WS_STRING; return TOKEXEC_ALWAYS; }
+client.background               { BEGIN(COLOR_COND); yylval.single_color = &config.client.background; return TOKSINGLECOLOR; }
+client.focused                  { BEGIN(COLOR_COND); yylval.color = &config.client.focused; return TOKCOLOR; }
+client.focused_inactive         { BEGIN(COLOR_COND); yylval.color = &config.client.focused_inactive; return TOKCOLOR; }
+client.unfocused                { BEGIN(COLOR_COND); yylval.color = &config.client.unfocused; return TOKCOLOR; }
+client.urgent                   { BEGIN(COLOR_COND); yylval.color = &config.client.urgent; return TOKCOLOR; }
+bar.focused                     { BEGIN(COLOR_COND); yylval.color = &config.bar.focused; return TOKCOLOR; }
+bar.unfocused                   { BEGIN(COLOR_COND); yylval.color = &config.bar.unfocused; return TOKCOLOR; }
+bar.urgent                      { BEGIN(COLOR_COND); yylval.color = &config.bar.urgent; return TOKCOLOR; }
+Mod1                            { yylval.number = BIND_MOD1; return MODIFIER; }
+Mod2                            { yylval.number = BIND_MOD2; return MODIFIER; }
+Mod3                            { yylval.number = BIND_MOD3; return MODIFIER; }
+Mod4                            { yylval.number = BIND_MOD4; return MODIFIER; }
+Mod5                            { yylval.number = BIND_MOD5; return MODIFIER; }
+Mode_switch                     { yylval.number = BIND_MODE_SWITCH; return MODIFIER; }
+control                         { return TOKCONTROL; }
+ctrl                            { return TOKCONTROL; }
+shift                           { return TOKSHIFT; }
+
+class                           { yy_push_state(WANT_QSTRING); return TOK_CLASS; }
+id                              { yy_push_state(WANT_QSTRING); return TOK_ID; }
+con_id                          { yy_push_state(WANT_QSTRING); return TOK_CON_ID; }
+con_mark                        { yy_push_state(WANT_QSTRING); return TOK_MARK; }
+title                           { yy_push_state(WANT_QSTRING); return TOK_TITLE; }
+
+{EOL}                           {
+                                  FREE(context->line_copy);
+                                  context->line_number++;
+                                  BEGIN(INITIAL);
+                                  yy_push_state(BUFFER_LINE);
+                                }
+<BINDSYM_COND>[ \t]+            { BEGIN(WANT_STRING); }
+<OUTPUT_COND>[ \t]+             { BEGIN(WANT_STRING); }
+[ \t]+                          { /* ignore whitespace */ ; }
+\"[^\"]+\"                      {
+                                  /* if ASSIGN_COND then */
+                                  if (yy_start_stack_ptr > 0)
+                                      yy_pop_state();
+                                  else BEGIN(INITIAL);
+                                  /* yylval will be the string, but without quotes */
+                                  char *copy = sstrdup(yytext+1);
+                                  copy[strlen(copy)-1] = '\0';
+                                  yylval.string = copy;
+                                  return QUOTEDSTRING;
+                                }
+<ASSIGN_COND>[^ \t\"]+          { BEGIN(ASSIGN_TARGET_COND); yylval.string = sstrdup(yytext); return STR_NG; }
+<BINDSYM_COND>[a-zA-Z0-9_]+     { yylval.string = sstrdup(yytext); return WORD; }
+[a-zA-Z]+                       { yylval.string = sstrdup(yytext); return WORD; }
+.                               { return (int)yytext[0]; }
+
+<<EOF>> {
+    while (yy_start_stack_ptr > 0)
+        yy_pop_state();
+    yyterminate();
+}
+
+%%
diff --git a/src/cfgparse.y b/src/cfgparse.y
new file mode 100644 (file)
index 0000000..ae78957
--- /dev/null
@@ -0,0 +1,1124 @@
+%{
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include "all.h"
+
+static pid_t configerror_pid = -1;
+
+static Match current_match;
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+extern int yylex(struct context *context);
+extern int yyparse(void);
+extern int yylex_destroy(void);
+extern FILE *yyin;
+YY_BUFFER_STATE yy_scan_string(const char *);
+
+static struct bindings_head *current_bindings;
+static struct context *context;
+
+/* We don’t need yydebug for now, as we got decent error messages using
+ * yyerror(). Should you ever want to extend the parser, it might be handy
+ * to just comment it in again, so it stays here. */
+//int yydebug = 1;
+
+void yyerror(const char *error_message) {
+    context->has_errors = true;
+
+    ELOG("\n");
+    ELOG("CONFIG: %s\n", error_message);
+    ELOG("CONFIG: in file \"%s\", line %d:\n",
+        context->filename, context->line_number);
+    ELOG("CONFIG:   %s\n", context->line_copy);
+    char buffer[context->last_column+1];
+    buffer[context->last_column] = '\0';
+    for (int c = 1; c <= context->last_column; c++)
+        buffer[c-1] = (c >= context->first_column ? '^' : ' ');
+    ELOG("CONFIG:   %s\n", buffer);
+    ELOG("\n");
+}
+
+int yywrap() {
+    return 1;
+}
+
+/*
+ * Goes through each line of buf (separated by \n) and checks for statements /
+ * commands which only occur in i3 v4 configuration files. If it finds any, it
+ * returns version 4, otherwise it returns version 3.
+ *
+ */
+static int detect_version(char *buf) {
+    char *walk = buf;
+    char *line = buf;
+    while (*walk != '\0') {
+        if (*walk != '\n') {
+            walk++;
+            continue;
+        }
+
+        /* check for some v4-only statements */
+        if (strncasecmp(line, "bindcode", strlen("bindcode")) == 0 ||
+            strncasecmp(line, "force_focus_wrapping", strlen("force_focus_wrapping")) == 0 ||
+            strncasecmp(line, "# i3 config file (v4)", strlen("# i3 config file (v4)")) == 0 ||
+            strncasecmp(line, "workspace_layout", strlen("workspace_layout")) == 0) {
+            printf("deciding for version 4 due to this line: %.*s\n", (int)(walk-line), line);
+            return 4;
+        }
+
+        /* if this is a bind statement, we can check the command */
+        if (strncasecmp(line, "bind", strlen("bind")) == 0) {
+            char *bind = strchr(line, ' ');
+            if (bind == NULL)
+                goto next;
+            while ((*bind == ' ' || *bind == '\t') && *bind != '\0')
+                bind++;
+            if (*bind == '\0')
+                goto next;
+            if ((bind = strchr(bind, ' ')) == NULL)
+                goto next;
+            while ((*bind == ' ' || *bind == '\t') && *bind != '\0')
+                bind++;
+            if (*bind == '\0')
+                goto next;
+            if (strncasecmp(bind, "layout", strlen("layout")) == 0 ||
+                strncasecmp(bind, "floating", strlen("floating")) == 0 ||
+                strncasecmp(bind, "workspace", strlen("workspace")) == 0 ||
+                strncasecmp(bind, "focus left", strlen("focus left")) == 0 ||
+                strncasecmp(bind, "focus right", strlen("focus right")) == 0 ||
+                strncasecmp(bind, "focus up", strlen("focus up")) == 0 ||
+                strncasecmp(bind, "focus down", strlen("focus down")) == 0 ||
+                strncasecmp(bind, "border normal", strlen("border normal")) == 0 ||
+                strncasecmp(bind, "border 1pixel", strlen("border 1pixel")) == 0 ||
+                strncasecmp(bind, "border borderless", strlen("border borderless")) == 0) {
+                printf("deciding for version 4 due to this line: %.*s\n", (int)(walk-line), line);
+                return 4;
+            }
+        }
+
+next:
+        /* advance to the next line */
+        walk++;
+        line = walk;
+    }
+
+    return 3;
+}
+
+/*
+ * Calls i3-migrate-config-to-v4 to migrate a configuration file (input
+ * buffer).
+ *
+ * Returns the converted config file or NULL if there was an error (for
+ * example the script could not be found in $PATH or the i3 executable’s
+ * directory).
+ *
+ */
+static char *migrate_config(char *input, off_t size) {
+    int writepipe[2];
+    int readpipe[2];
+
+    if (pipe(writepipe) != 0 ||
+        pipe(readpipe) != 0) {
+        warn("migrate_config: Could not create pipes");
+        return NULL;
+    }
+
+    pid_t pid = fork();
+    if (pid == -1) {
+        warn("Could not fork()");
+        return NULL;
+    }
+
+    /* child */
+    if (pid == 0) {
+        /* close writing end of writepipe, connect reading side to stdin */
+        close(writepipe[1]);
+        dup2(writepipe[0], 0);
+
+        /* close reading end of readpipe, connect writing side to stdout */
+        close(readpipe[0]);
+        dup2(readpipe[1], 1);
+
+        static char *argv[] = {
+            NULL, /* will be replaced by the executable path */
+            NULL
+        };
+        exec_i3_utility("i3-migrate-config-to-v4", argv);
+    }
+
+    /* parent */
+
+    /* close reading end of the writepipe (connected to the script’s stdin) */
+    close(writepipe[0]);
+
+    /* write the whole config file to the pipe, the script will read everything
+     * immediately */
+    int written = 0;
+    int ret;
+    while (written < size) {
+        if ((ret = write(writepipe[1], input + written, size - written)) < 0) {
+            warn("Could not write to pipe");
+            return NULL;
+        }
+        written += ret;
+    }
+    close(writepipe[1]);
+
+    /* close writing end of the readpipe (connected to the script’s stdout) */
+    close(readpipe[1]);
+
+    /* read the script’s output */
+    int conv_size = 65535;
+    char *converted = malloc(conv_size);
+    int read_bytes = 0;
+    do {
+        if (read_bytes == conv_size) {
+            conv_size += 65535;
+            converted = realloc(converted, conv_size);
+        }
+        ret = read(readpipe[0], converted + read_bytes, conv_size - read_bytes);
+        if (ret == -1) {
+            warn("Cannot read from pipe");
+            return NULL;
+        }
+        read_bytes += ret;
+    } while (ret > 0);
+
+    /* get the returncode */
+    int status;
+    wait(&status);
+    if (!WIFEXITED(status)) {
+        fprintf(stderr, "Child did not terminate normally, using old config file (will lead to broken behaviour)\n");
+        return NULL;
+    }
+
+    int returncode = WEXITSTATUS(status);
+    if (returncode != 0) {
+        fprintf(stderr, "Migration process exit code was != 0\n");
+        if (returncode == 2) {
+            fprintf(stderr, "could not start the migration script\n");
+            /* TODO: script was not found. tell the user to fix his system or create a v4 config */
+        } else if (returncode == 1) {
+            fprintf(stderr, "This already was a v4 config. Please add the following line to your config file:\n");
+            fprintf(stderr, "# i3 config file (v4)\n");
+            /* TODO: nag the user with a message to include a hint for i3 in his config file */
+        }
+        return NULL;
+    }
+
+    return converted;
+}
+
+/*
+ * Handler which will be called when we get a SIGCHLD for the nagbar, meaning
+ * it exited (or could not be started, depending on the exit code).
+ *
+ */
+static void nagbar_exited(EV_P_ ev_child *watcher, int revents) {
+    ev_child_stop(EV_A_ watcher);
+    if (!WIFEXITED(watcher->rstatus)) {
+        fprintf(stderr, "ERROR: i3-nagbar did not exit normally.\n");
+        return;
+    }
+
+    int exitcode = WEXITSTATUS(watcher->rstatus);
+    printf("i3-nagbar process exited with status %d\n", exitcode);
+    if (exitcode == 2) {
+        fprintf(stderr, "ERROR: i3-nagbar could not be found. Is it correctly installed on your system?\n");
+    }
+
+    configerror_pid = -1;
+}
+
+/*
+ * Starts an i3-nagbar process which alerts the user that his configuration
+ * file contains one or more errors. Also offers two buttons: One to launch an
+ * $EDITOR on the config file and another one to launch a $PAGER on the error
+ * logfile.
+ *
+ */
+static void start_configerror_nagbar(const char *config_path) {
+    fprintf(stderr, "Would start i3-nagscreen now\n");
+    configerror_pid = fork();
+    if (configerror_pid == -1) {
+        warn("Could not fork()");
+        return;
+    }
+
+    /* child */
+    if (configerror_pid == 0) {
+        char *editaction,
+             *pageraction;
+        if (asprintf(&editaction, TERM_EMU " -e sh -c \"${EDITOR:-vi} \"%s\" && i3-msg reload\"", config_path) == -1)
+            exit(1);
+        if (asprintf(&pageraction, TERM_EMU " -e sh -c \"${PAGER:-less} \"%s\"\"", errorfilename) == -1)
+            exit(1);
+        char *argv[] = {
+            NULL, /* will be replaced by the executable path */
+            "-m",
+            "You have an error in your i3 config file!",
+            "-b",
+            "edit config",
+            editaction,
+            (errorfilename ? "-b" : NULL),
+            "show errors",
+            pageraction,
+            NULL
+        };
+        exec_i3_utility("i3-nagbar", argv);
+    }
+
+    /* parent */
+    /* install a child watcher */
+    ev_child *child = smalloc(sizeof(ev_child));
+    ev_child_init(child, &nagbar_exited, configerror_pid, 0);
+    ev_child_start(main_loop, child);
+}
+
+/*
+ * Kills the configerror i3-nagbar process, if any.
+ *
+ * Called when reloading/restarting.
+ *
+ * If wait_for_it is set (restarting), this function will waitpid(), otherwise,
+ * ev is assumed to handle it (reloading).
+ *
+ */
+void kill_configerror_nagbar(bool wait_for_it) {
+    if (configerror_pid == -1)
+        return;
+
+    if (kill(configerror_pid, SIGTERM) == -1)
+        warn("kill(configerror_nagbar) failed");
+
+    if (!wait_for_it)
+        return;
+
+    /* When restarting, we don’t enter the ev main loop anymore and after the
+     * exec(), our old pid is no longer watched. So, ev won’t handle SIGCHLD
+     * for us and we would end up with a <defunct> process. Therefore we
+     * waitpid() here. */
+    waitpid(configerror_pid, NULL, 0);
+}
+
+void parse_file(const char *f) {
+    SLIST_HEAD(variables_head, Variable) variables = SLIST_HEAD_INITIALIZER(&variables);
+    int fd, ret, read_bytes = 0;
+    struct stat stbuf;
+    char *buf;
+    FILE *fstr;
+    char buffer[1026], key[512], value[512];
+
+    if ((fd = open(f, O_RDONLY)) == -1)
+        die("Could not open configuration file: %s\n", strerror(errno));
+
+    if (fstat(fd, &stbuf) == -1)
+        die("Could not fstat file: %s\n", strerror(errno));
+
+    buf = scalloc((stbuf.st_size + 1) * sizeof(char));
+    while (read_bytes < stbuf.st_size) {
+        if ((ret = read(fd, buf + read_bytes, (stbuf.st_size - read_bytes))) < 0)
+            die("Could not read(): %s\n", strerror(errno));
+        read_bytes += ret;
+    }
+
+    if (lseek(fd, 0, SEEK_SET) == (off_t)-1)
+        die("Could not lseek: %s\n", strerror(errno));
+
+    if ((fstr = fdopen(fd, "r")) == NULL)
+        die("Could not fdopen: %s\n", strerror(errno));
+
+    while (!feof(fstr)) {
+        if (fgets(buffer, 1024, fstr) == NULL) {
+            if (feof(fstr))
+                break;
+            die("Could not read configuration file\n");
+        }
+
+        /* sscanf implicitly strips whitespace. Also, we skip comments and empty lines. */
+        if (sscanf(buffer, "%s %[^\n]", key, value) < 1 ||
+            key[0] == '#' || strlen(key) < 3)
+            continue;
+
+        if (strcasecmp(key, "set") == 0) {
+            if (value[0] != '$')
+                die("Malformed variable assignment, name has to start with $\n");
+
+            /* get key/value for this variable */
+            char *v_key = value, *v_value;
+            if ((v_value = strstr(value, " ")) == NULL)
+                die("Malformed variable assignment, need a value\n");
+
+            *(v_value++) = '\0';
+
+            struct Variable *new = scalloc(sizeof(struct Variable));
+            new->key = sstrdup(v_key);
+            new->value = sstrdup(v_value);
+            SLIST_INSERT_HEAD(&variables, new, variables);
+            DLOG("Got new variable %s = %s\n", v_key, v_value);
+            continue;
+        }
+    }
+    fclose(fstr);
+
+    /* For every custom variable, see how often it occurs in the file and
+     * how much extra bytes it requires when replaced. */
+    struct Variable *current, *nearest;
+    int extra_bytes = 0;
+    /* We need to copy the buffer because we need to invalidate the
+     * variables (otherwise we will count them twice, which is bad when
+     * 'extra' is negative) */
+    char *bufcopy = sstrdup(buf);
+    SLIST_FOREACH(current, &variables, variables) {
+        int extra = (strlen(current->value) - strlen(current->key));
+        char *next;
+        for (next = bufcopy;
+             (next = strcasestr(bufcopy + (next - bufcopy), current->key)) != NULL;
+             next += strlen(current->key)) {
+            *next = '_';
+            extra_bytes += extra;
+        }
+    }
+    FREE(bufcopy);
+
+    /* Then, allocate a new buffer and copy the file over to the new one,
+     * but replace occurences of our variables */
+    char *walk = buf, *destwalk;
+    char *new = smalloc((stbuf.st_size + extra_bytes + 1) * sizeof(char));
+    destwalk = new;
+    while (walk < (buf + stbuf.st_size)) {
+        /* Find the next variable */
+        SLIST_FOREACH(current, &variables, variables)
+            current->next_match = strcasestr(walk, current->key);
+        nearest = NULL;
+        int distance = stbuf.st_size;
+        SLIST_FOREACH(current, &variables, variables) {
+            if (current->next_match == NULL)
+                continue;
+            if ((current->next_match - walk) < distance) {
+                distance = (current->next_match - walk);
+                nearest = current;
+            }
+        }
+        if (nearest == NULL) {
+            /* If there are no more variables, we just copy the rest */
+            strncpy(destwalk, walk, (buf + stbuf.st_size) - walk);
+            destwalk += (buf + stbuf.st_size) - walk;
+            *destwalk = '\0';
+            break;
+        } else {
+            /* Copy until the next variable, then copy its value */
+            strncpy(destwalk, walk, distance);
+            strncpy(destwalk + distance, nearest->value, strlen(nearest->value));
+            walk += distance + strlen(nearest->key);
+            destwalk += distance + strlen(nearest->value);
+        }
+    }
+
+    /* analyze the string to find out whether this is an old config file (3.x)
+     * or a new config file (4.x). If it’s old, we run the converter script. */
+    int version = detect_version(buf);
+    if (version == 3) {
+        /* We need to convert this v3 configuration */
+        char *converted = migrate_config(new, stbuf.st_size);
+        if (converted != NULL) {
+            printf("\n");
+            printf("****************************************************************\n");
+            printf("NOTE: Automatically converted configuration file from v3 to v4.\n");
+            printf("\n");
+            printf("Please convert your config file to v4. You can use this command:\n");
+            printf("    mv %s %s.O\n", f, f);
+            printf("    i3-migrate-config-to-v4 %s.O > %s\n", f, f);
+            printf("****************************************************************\n");
+            printf("\n");
+            free(new);
+            new = converted;
+        } else {
+            printf("\n");
+            printf("**********************************************************************\n");
+            printf("ERROR: Could not convert config file. Maybe i3-migrate-config-to-v4\n");
+            printf("was not correctly installed on your system?\n");
+            printf("**********************************************************************\n");
+            printf("\n");
+        }
+    }
+
+    /* now lex/parse it */
+    yy_scan_string(new);
+
+    context = scalloc(sizeof(struct context));
+    context->filename = f;
+
+    if (yyparse() != 0) {
+        fprintf(stderr, "Could not parse configfile\n");
+        exit(1);
+    }
+
+    if (context->has_errors) {
+        start_configerror_nagbar(f);
+    }
+
+    yylex_destroy();
+    FREE(context->line_copy);
+    free(context);
+    free(new);
+    free(buf);
+
+    while (!SLIST_EMPTY(&variables)) {
+        current = SLIST_FIRST(&variables);
+        FREE(current->key);
+        FREE(current->value);
+        SLIST_REMOVE_HEAD(&variables, variables);
+        FREE(current);
+    }
+}
+
+%}
+
+%error-verbose
+%lex-param { struct context *context }
+
+%union {
+    int number;
+    char *string;
+    uint32_t *single_color;
+    struct Colortriple *color;
+    Match *match;
+    struct Binding *binding;
+}
+
+%token  <number>        NUMBER                      "<number>"
+%token  <string>        WORD                        "<word>"
+%token  <string>        STR                         "<string>"
+%token  <string>        STR_NG                      "<string (non-greedy)>"
+%token  <string>        HEX                         "<hex>"
+%token  <string>        OUTPUT                      "<RandR output>"
+%token                  TOKBINDCODE
+%token                  TOKTERMINAL
+%token                  TOKCOMMENT                  "<comment>"
+%token                  TOKFONT                     "font"
+%token                  TOKBINDSYM                  "bindsym"
+%token  <number>        MODIFIER                    "<modifier>"
+%token                  TOKCONTROL                  "control"
+%token                  TOKSHIFT                    "shift"
+%token                  TOKFLOATING_MODIFIER        "floating_modifier"
+%token  <string>        QUOTEDSTRING                "<quoted string>"
+%token                  TOKWORKSPACE                "workspace"
+%token                  TOKOUTPUT                   "output"
+%token                  TOKASSIGN                   "assign"
+%token                  TOKSET
+%token                  TOKIPCSOCKET                "ipc_socket"
+%token                  TOKRESTARTSTATE             "restart_state"
+%token                  TOKEXEC                     "exec"
+%token                  TOKEXEC_ALWAYS              "exec_always"
+%token  <single_color>  TOKSINGLECOLOR
+%token  <color>         TOKCOLOR
+%token                  TOKARROW                    "→"
+%token                  TOKMODE                     "mode"
+%token                  TOK_ORIENTATION             "default_orientation"
+%token                  TOK_HORIZ                   "horizontal"
+%token                  TOK_VERT                    "vertical"
+%token                  TOK_AUTO                    "auto"
+%token                  TOK_WORKSPACE_LAYOUT        "workspace_layout"
+%token                  TOKNEWWINDOW                "new_window"
+%token                  TOK_NORMAL                  "normal"
+%token                  TOK_NONE                    "none"
+%token                  TOK_1PIXEL                  "1pixel"
+%token                  TOKFOCUSFOLLOWSMOUSE        "focus_follows_mouse"
+%token                  TOK_FORCE_FOCUS_WRAPPING    "force_focus_wrapping"
+%token                  TOKWORKSPACEBAR             "workspace_bar"
+%token                  TOK_DEFAULT                 "default"
+%token                  TOK_STACKING                "stacking"
+%token                  TOK_TABBED                  "tabbed"
+%token  <number>        TOKSTACKLIMIT               "stack-limit"
+%token                  TOK_POPUP_DURING_FULLSCREEN "popup_during_fullscreen"
+%token                  TOK_IGNORE                  "ignore"
+%token                  TOK_LEAVE_FULLSCREEN        "leave_fullscreen"
+%token                  TOK_FOR_WINDOW              "for_window"
+
+%token              TOK_MARK            "mark"
+%token              TOK_CLASS           "class"
+%token              TOK_ID              "id"
+%token              TOK_CON_ID          "con_id"
+%token              TOK_TITLE           "title"
+
+%type   <binding>       binding
+%type   <binding>       bindcode
+%type   <binding>       bindsym
+%type   <number>        binding_modifiers
+%type   <number>        binding_modifier
+%type   <number>        direction
+%type   <number>        layout_mode
+%type   <number>        border_style
+%type   <number>        new_window
+%type   <number>        colorpixel
+%type   <number>        bool
+%type   <number>        popup_setting
+%type   <string>        command
+%type   <string>        word_or_number
+%type   <string>        optional_workspace_name
+%type   <string>        workspace_name
+%type   <string>        window_class
+
+%%
+
+lines: /* empty */
+    | lines error
+    | lines line
+    ;
+
+line:
+    bindline
+    | for_window
+    | mode
+    | floating_modifier
+    | orientation
+    | workspace_layout
+    | new_window
+    | focus_follows_mouse
+    | force_focus_wrapping
+    | workspace_bar
+    | workspace
+    | assign
+    | ipcsocket
+    | restart_state
+    | exec
+    | exec_always
+    | single_color
+    | color
+    | terminal
+    | font
+    | comment
+    | popup_during_fullscreen
+    ;
+
+comment:
+    TOKCOMMENT
+    ;
+
+command:
+    STR
+    ;
+
+bindline:
+    binding
+    {
+        TAILQ_INSERT_TAIL(bindings, $1, bindings);
+    }
+    ;
+
+binding:
+    TOKBINDCODE bindcode         { $$ = $2; }
+    | TOKBINDSYM bindsym         { $$ = $2; }
+    ;
+
+bindcode:
+    binding_modifiers NUMBER command
+    {
+        printf("\tFound keycode binding mod%d with key %d and command %s\n", $1, $2, $3);
+        Binding *new = scalloc(sizeof(Binding));
+
+        new->keycode = $2;
+        new->mods = $1;
+        new->command = $3;
+
+        $$ = new;
+    }
+    ;
+
+bindsym:
+    binding_modifiers word_or_number command
+    {
+        printf("\tFound keysym binding mod%d with key %s and command %s\n", $1, $2, $3);
+        Binding *new = scalloc(sizeof(Binding));
+
+        new->symbol = $2;
+        new->mods = $1;
+        new->command = $3;
+
+        $$ = new;
+    }
+    ;
+
+for_window:
+    TOK_FOR_WINDOW match command
+    {
+        printf("\t should execute command %s for the criteria mentioned above\n", $3);
+        Assignment *assignment = scalloc(sizeof(Assignment));
+        assignment->type = A_COMMAND;
+        assignment->match = current_match;
+        assignment->dest.command = $3;
+        TAILQ_INSERT_TAIL(&assignments, assignment, assignments);
+    }
+    ;
+
+match:
+    | matchstart criteria matchend
+    {
+        printf("match parsed\n");
+    }
+    ;
+
+matchstart:
+    '['
+    {
+        printf("start\n");
+        match_init(&current_match);
+    }
+    ;
+
+matchend:
+    ']'
+    {
+        printf("match specification finished\n");
+    }
+    ;
+
+criteria:
+    TOK_CLASS '=' STR
+    {
+        printf("criteria: class = %s\n", $3);
+        current_match.class = $3;
+    }
+    | TOK_CON_ID '=' STR
+    {
+        printf("criteria: id = %s\n", $3);
+        char *end;
+        long parsed = strtol($3, &end, 10);
+        if (parsed == LONG_MIN ||
+            parsed == LONG_MAX ||
+            parsed < 0 ||
+            (end && *end != '\0')) {
+            ELOG("Could not parse con id \"%s\"\n", $3);
+        } else {
+            current_match.con_id = (Con*)parsed;
+            printf("id as int = %p\n", current_match.con_id);
+        }
+    }
+    | TOK_ID '=' STR
+    {
+        printf("criteria: window id = %s\n", $3);
+        char *end;
+        long parsed = strtol($3, &end, 10);
+        if (parsed == LONG_MIN ||
+            parsed == LONG_MAX ||
+            parsed < 0 ||
+            (end && *end != '\0')) {
+            ELOG("Could not parse window id \"%s\"\n", $3);
+        } else {
+            current_match.id = parsed;
+            printf("window id as int = %d\n", current_match.id);
+        }
+    }
+    | TOK_MARK '=' STR
+    {
+        printf("criteria: mark = %s\n", $3);
+        current_match.mark = $3;
+    }
+    | TOK_TITLE '=' STR
+    {
+        printf("criteria: title = %s\n", $3);
+        current_match.title = $3;
+    }
+    ;
+
+
+
+word_or_number:
+    WORD
+    | NUMBER
+    {
+        asprintf(&$$, "%d", $1);
+    }
+    ;
+
+mode:
+    TOKMODE QUOTEDSTRING '{' modelines '}'
+    {
+        if (strcasecmp($2, "default") == 0) {
+            printf("You cannot use the name \"default\" for your mode\n");
+            exit(1);
+        }
+        printf("\t now in mode %s\n", $2);
+        printf("\t current bindings = %p\n", current_bindings);
+        Binding *binding;
+        TAILQ_FOREACH(binding, current_bindings, bindings) {
+            printf("got binding on mods %d, keycode %d, symbol %s, command %s\n",
+                            binding->mods, binding->keycode, binding->symbol, binding->command);
+        }
+
+        struct Mode *mode = scalloc(sizeof(struct Mode));
+        mode->name = $2;
+        mode->bindings = current_bindings;
+        current_bindings = NULL;
+        SLIST_INSERT_HEAD(&modes, mode, modes);
+    }
+    ;
+
+
+modelines:
+    /* empty */
+    | modelines modeline
+    ;
+
+modeline:
+    comment
+    | binding
+    {
+        if (current_bindings == NULL) {
+            current_bindings = scalloc(sizeof(struct bindings_head));
+            TAILQ_INIT(current_bindings);
+        }
+
+        TAILQ_INSERT_TAIL(current_bindings, $1, bindings);
+    }
+    ;
+
+floating_modifier:
+    TOKFLOATING_MODIFIER binding_modifiers
+    {
+        DLOG("floating modifier = %d\n", $2);
+        config.floating_modifier = $2;
+    }
+    ;
+
+orientation:
+    TOK_ORIENTATION direction
+    {
+        DLOG("New containers should start with split direction %d\n", $2);
+        config.default_orientation = $2;
+    }
+    ;
+
+direction:
+    TOK_HORIZ       { $$ = HORIZ; }
+    | TOK_VERT      { $$ = VERT; }
+    | TOK_AUTO      { $$ = NO_ORIENTATION; }
+    ;
+
+workspace_layout:
+    TOK_WORKSPACE_LAYOUT layout_mode
+    {
+        DLOG("new containers will be in mode %d\n", $2);
+        config.default_layout = $2;
+
+#if 0
+        /* We also need to change the layout of the already existing
+         * workspaces here. Workspaces may exist at this point because
+         * of the other directives which are modifying workspaces
+         * (setting the preferred screen or name). While the workspace
+         * objects are already created, they have never been used.
+         * Thus, the user very likely awaits the default container mode
+         * to trigger in this case, regardless of where it is inside
+         * his configuration file. */
+        Workspace *ws;
+        TAILQ_FOREACH(ws, workspaces, workspaces) {
+                if (ws->table == NULL)
+                        continue;
+                switch_layout_mode(global_conn,
+                                   ws->table[0][0],
+                                   config.container_mode);
+        }
+#endif
+    }
+    | TOK_WORKSPACE_LAYOUT TOKSTACKLIMIT TOKSTACKLIMIT NUMBER
+    {
+        DLOG("stack-limit %d with val %d\n", $3, $4);
+        config.container_stack_limit = $3;
+        config.container_stack_limit_value = $4;
+
+#if 0
+        /* See the comment above */
+        Workspace *ws;
+        TAILQ_FOREACH(ws, workspaces, workspaces) {
+                if (ws->table == NULL)
+                        continue;
+                Container *con = ws->table[0][0];
+                con->stack_limit = config.container_stack_limit;
+                con->stack_limit_value = config.container_stack_limit_value;
+        }
+#endif
+    }
+    ;
+
+layout_mode:
+    TOK_DEFAULT       { $$ = L_DEFAULT; }
+    | TOK_STACKING    { $$ = L_STACKED; }
+    | TOK_TABBED      { $$ = L_TABBED; }
+    ;
+
+new_window:
+    TOKNEWWINDOW border_style
+    {
+        DLOG("new windows should start with border style %d\n", $2);
+        config.default_border = $2;
+    }
+    ;
+
+border_style:
+    TOK_NORMAL      { $$ = BS_NORMAL; }
+    | TOK_NONE      { $$ = BS_NONE; }
+    | TOK_1PIXEL    { $$ = BS_1PIXEL; }
+    ;
+
+bool:
+    NUMBER
+    {
+        $$ = ($1 == 1);
+    }
+    | WORD
+    {
+        DLOG("checking word \"%s\"\n", $1);
+        $$ = (strcasecmp($1, "yes") == 0 ||
+              strcasecmp($1, "true") == 0 ||
+              strcasecmp($1, "on") == 0 ||
+              strcasecmp($1, "enable") == 0 ||
+              strcasecmp($1, "active") == 0);
+    }
+    ;
+
+focus_follows_mouse:
+    TOKFOCUSFOLLOWSMOUSE bool
+    {
+        DLOG("focus follows mouse = %d\n", $2);
+        config.disable_focus_follows_mouse = !($2);
+    }
+    ;
+
+force_focus_wrapping:
+    TOK_FORCE_FOCUS_WRAPPING bool
+    {
+        DLOG("force focus wrapping = %d\n", $2);
+        config.force_focus_wrapping = $2;
+    }
+    ;
+
+workspace_bar:
+    TOKWORKSPACEBAR bool
+    {
+        DLOG("workspace bar = %d\n", $2);
+        config.disable_workspace_bar = !($2);
+    }
+    ;
+
+workspace:
+    TOKWORKSPACE NUMBER TOKOUTPUT OUTPUT optional_workspace_name
+    {
+        int ws_num = $2;
+        if (ws_num < 1) {
+            DLOG("Invalid workspace assignment, workspace number %d out of range\n", ws_num);
+        } else {
+            char *ws_name = NULL;
+            if ($5 == NULL) {
+                asprintf(&ws_name, "%d", ws_num);
+            } else {
+                ws_name = $5;
+            }
+
+            DLOG("Should assign workspace %s to output %s\n", ws_name, $4);
+            struct Workspace_Assignment *assignment = scalloc(sizeof(struct Workspace_Assignment));
+            assignment->name = ws_name;
+            assignment->output = $4;
+            TAILQ_INSERT_TAIL(&ws_assignments, assignment, ws_assignments);
+        }
+    }
+    | TOKWORKSPACE NUMBER workspace_name
+    {
+        int ws_num = $2;
+        if (ws_num < 1) {
+            DLOG("Invalid workspace assignment, workspace number %d out of range\n", ws_num);
+        } else {
+            DLOG("workspace name to: %s\n", $3);
+#if 0
+            if ($<string>3 != NULL) {
+                    workspace_set_name(workspace_get(ws_num - 1), $<string>3);
+                    free($<string>3);
+            }
+#endif
+        }
+    }
+    ;
+
+optional_workspace_name:
+    /* empty */          { $$ = NULL; }
+    | workspace_name     { $$ = $1; }
+    ;
+
+workspace_name:
+    QUOTEDSTRING         { $$ = $1; }
+    | STR                { $$ = $1; }
+    | WORD               { $$ = $1; }
+    ;
+
+assign:
+    TOKASSIGN window_class STR
+    {
+        printf("assignment of %s to *%s*\n", $2, $3);
+        char *workspace = $3;
+        char *criteria = $2;
+
+        Assignment *assignment = scalloc(sizeof(Assignment));
+        Match *match = &(assignment->match);
+        match_init(match);
+
+        char *separator = NULL;
+        if ((separator = strchr(criteria, '/')) != NULL) {
+            *(separator++) = '\0';
+            match->title = sstrdup(separator);
+        }
+        if (*criteria != '\0')
+            match->class = sstrdup(criteria);
+        free(criteria);
+
+        printf("  class = %s\n", match->class);
+        printf("  title = %s\n", match->title);
+
+        /* Compatibility with older versions: If the assignment target starts
+         * with ~, we create the equivalent of:
+         *
+         * for_window [class="foo"] mode floating
+         */
+        if (*workspace == '~') {
+            workspace++;
+            if (*workspace == '\0') {
+                /* This assignment was *only* for floating */
+                assignment->type = A_COMMAND;
+                assignment->dest.command = sstrdup("floating enable");
+                TAILQ_INSERT_TAIL(&assignments, assignment, assignments);
+                break;
+            } else {
+                /* Create a new assignment and continue afterwards */
+                Assignment *floating = scalloc(sizeof(Assignment));
+                match_copy(&(floating->match), match);
+                floating->type = A_COMMAND;
+                floating->dest.command = sstrdup("floating enable");
+                TAILQ_INSERT_TAIL(&assignments, floating, assignments);
+            }
+        }
+
+        assignment->type = A_TO_WORKSPACE;
+        assignment->dest.workspace = workspace;
+        TAILQ_INSERT_TAIL(&assignments, assignment, assignments);
+    }
+    ;
+
+window_class:
+    QUOTEDSTRING
+    | STR_NG
+    ;
+
+ipcsocket:
+    TOKIPCSOCKET STR
+    {
+        config.ipc_socket_path = $2;
+    }
+    ;
+
+restart_state:
+    TOKRESTARTSTATE STR
+    {
+        config.restart_state_path = $2;
+    }
+    ;
+
+exec:
+    TOKEXEC STR
+    {
+        struct Autostart *new = smalloc(sizeof(struct Autostart));
+        new->command = $2;
+        TAILQ_INSERT_TAIL(&autostarts, new, autostarts);
+    }
+    ;
+
+exec_always:
+    TOKEXEC_ALWAYS STR
+    {
+        struct Autostart *new = smalloc(sizeof(struct Autostart));
+        new->command = $2;
+        TAILQ_INSERT_TAIL(&autostarts_always, new, autostarts_always);
+    }
+    ;
+
+terminal:
+    TOKTERMINAL STR
+    {
+        ELOG("The terminal option is DEPRECATED and has no effect. "
+            "Please remove it from your configuration file.\n");
+    }
+    ;
+
+font:
+    TOKFONT STR
+    {
+        config.font = load_font($2, true);
+        printf("font %s\n", $2);
+        free($2);
+    }
+    ;
+
+single_color:
+    TOKSINGLECOLOR colorpixel
+    {
+        uint32_t *dest = $1;
+        *dest = $2;
+    }
+    ;
+
+color:
+    TOKCOLOR colorpixel colorpixel colorpixel
+    {
+        struct Colortriple *dest = $1;
+
+        dest->border = $2;
+        dest->background = $3;
+        dest->text = $4;
+    }
+    ;
+
+colorpixel:
+    '#' HEX
+    {
+        char *hex;
+        if (asprintf(&hex, "#%s", $2) == -1)
+            die("asprintf()");
+        $$ = get_colorpixel(hex);
+        free(hex);
+    }
+    ;
+
+
+binding_modifiers:
+    /* NULL */                               { $$ = 0; }
+    | binding_modifier
+    | binding_modifiers '+' binding_modifier { $$ = $1 | $3; }
+    | binding_modifiers '+'                  { $$ = $1; }
+    ;
+
+binding_modifier:
+    MODIFIER        { $$ = $1; }
+    | TOKCONTROL    { $$ = BIND_CONTROL; }
+    | TOKSHIFT      { $$ = BIND_SHIFT; }
+    ;
+
+popup_during_fullscreen:
+    TOK_POPUP_DURING_FULLSCREEN popup_setting
+    {
+        DLOG("popup_during_fullscreen setting: %d\n", $2);
+        config.popup_during_fullscreen = $2;
+    }
+    ;
+
+popup_setting:
+    TOK_IGNORE              { $$ = PDF_IGNORE; }
+    | TOK_LEAVE_FULLSCREEN  { $$ = PDF_LEAVE_FULLSCREEN; }
+    ;
diff --git a/src/click.c b/src/click.c
new file mode 100644 (file)
index 0000000..acfcad8
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * src/click.c: Contains the handlers for button press (mouse click) events
+ *              because they are quite large.
+ *
+ */
+#include <time.h>
+#include <math.h>
+
+#include <xcb/xcb_atom.h>
+#include <xcb/xcb_icccm.h>
+
+#include <X11/XKBlib.h>
+
+#include "all.h"
+
+
+typedef enum { CLICK_BORDER = 0, CLICK_DECORATION = 1, CLICK_INSIDE = 2 } click_destination_t;
+
+/*
+ * Finds the correct pair of first/second cons between the resize will take
+ * place according to the passed border position (top, left, right, bottom),
+ * then calls resize_graphical_handler().
+ *
+ */
+static bool tiling_resize_for_border(Con *con, border_t border, xcb_button_press_event_t *event) {
+    DLOG("border = %d\n", border);
+    char way = (border == BORDER_TOP || border == BORDER_LEFT ? 'p' : 'n');
+    orientation_t orientation = (border == BORDER_TOP || border == BORDER_BOTTOM ? VERT : HORIZ);
+
+    /* look for a parent container with the right orientation */
+    Con *first = NULL, *second = NULL;
+    Con *resize_con = con;
+    while (resize_con->type != CT_WORKSPACE &&
+           resize_con->type != CT_FLOATING_CON &&
+           resize_con->parent->orientation != orientation)
+        resize_con = resize_con->parent;
+
+    if (resize_con->type != CT_WORKSPACE &&
+        resize_con->type != CT_FLOATING_CON &&
+        resize_con->parent->orientation == orientation) {
+        first = resize_con;
+        second = (way == 'n') ? TAILQ_NEXT(first, nodes) : TAILQ_PREV(first, nodes_head, nodes);
+        if (second == TAILQ_END(&(first->nodes_head))) {
+            second = NULL;
+        }
+        else if (way == 'p') {
+            Con *tmp = first;
+            first = second;
+            second = tmp;
+        }
+    }
+
+    if (first == NULL || second == NULL) {
+        DLOG("Resize not possible\n");
+        return false;
+    }
+    else {
+        assert(first != second);
+        assert(first->parent == second->parent);
+        resize_graphical_handler(first, second, orientation, event);
+    }
+
+    DLOG("After resize handler, rendering\n");
+    tree_render();
+    return true;
+}
+
+/*
+ * Called when the user clicks using the floating_modifier, but the client is in
+ * tiling layout.
+ *
+ * Returns false if it does not do anything (that is, the click should be sent
+ * to the client).
+ *
+ */
+static bool floating_mod_on_tiled_client(Con *con, xcb_button_press_event_t *event) {
+    /* The client is in tiling layout. We can still initiate a resize with the
+     * right mouse button, by chosing the border which is the most near one to
+     * the position of the mouse pointer */
+    int to_right = con->rect.width - event->event_x,
+        to_left = event->event_x,
+        to_top = event->event_y,
+        to_bottom = con->rect.height - event->event_y;
+
+    DLOG("click was %d px to the right, %d px to the left, %d px to top, %d px to bottom\n",
+                    to_right, to_left, to_top, to_bottom);
+
+    if (to_right < to_left &&
+        to_right < to_top &&
+        to_right < to_bottom)
+        return tiling_resize_for_border(con, BORDER_RIGHT, event);
+
+    if (to_left < to_right &&
+        to_left < to_top &&
+        to_left < to_bottom)
+        return tiling_resize_for_border(con, BORDER_LEFT, event);
+
+    if (to_top < to_right &&
+        to_top < to_left &&
+        to_top < to_bottom)
+        return tiling_resize_for_border(con, BORDER_TOP, event);
+
+    if (to_bottom < to_right &&
+        to_bottom < to_left &&
+        to_bottom < to_top)
+        return tiling_resize_for_border(con, BORDER_BOTTOM, event);
+
+    return false;
+}
+
+/*
+ * Finds out which border was clicked on and calls tiling_resize_for_border().
+ *
+ */
+static bool tiling_resize(Con *con, xcb_button_press_event_t *event, click_destination_t dest) {
+    /* check if this was a click on the window border (and on which one) */
+    Rect bsr = con_border_style_rect(con);
+    DLOG("BORDER x = %d, y = %d for con %p, window 0x%08x\n",
+            event->event_x, event->event_y, con, event->event);
+    DLOG("checks for right >= %d\n", con->window_rect.x + con->window_rect.width);
+    if (dest == CLICK_DECORATION)
+        return tiling_resize_for_border(con, BORDER_TOP, event);
+
+    if (event->event_x >= 0 && event->event_x <= bsr.x &&
+        event->event_y >= bsr.y && event->event_y <= con->rect.height + bsr.height)
+        return tiling_resize_for_border(con, BORDER_LEFT, event);
+
+    if (event->event_x >= (con->window_rect.x + con->window_rect.width) &&
+        event->event_y >= bsr.y && event->event_y <= con->rect.height + bsr.height)
+        return tiling_resize_for_border(con, BORDER_RIGHT, event);
+
+    if (event->event_y >= (con->window_rect.y + con->window_rect.height))
+        return tiling_resize_for_border(con, BORDER_BOTTOM, event);
+
+    return false;
+}
+
+/*
+ * Being called by handle_button_press, this function calls the appropriate
+ * functions for resizing/dragging.
+ *
+ */
+static int route_click(Con *con, xcb_button_press_event_t *event, bool mod_pressed, click_destination_t dest) {
+    DLOG("--> click properties: mod = %d, destination = %d\n", mod_pressed, dest);
+    DLOG("--> OUTCOME = %p\n", con);
+    DLOG("type = %d, name = %s\n", con->type, con->name);
+
+    /* don’t handle dockarea cons, they must not be focused */
+    if (con->parent->type == CT_DOCKAREA)
+        goto done;
+
+    /* get the floating con */
+    Con *floatingcon = con_inside_floating(con);
+    const bool proportional = (event->state & BIND_SHIFT);
+    const bool in_stacked = (con->parent->layout == L_STACKED || con->parent->layout == L_TABBED);
+
+    /* 1: see if the user scrolled on the decoration of a stacked/tabbed con */
+    if (in_stacked &&
+        dest == CLICK_DECORATION &&
+        (event->detail == XCB_BUTTON_INDEX_4 ||
+         event->detail == XCB_BUTTON_INDEX_5)) {
+        DLOG("Scrolling on a window decoration\n");
+        orientation_t orientation = (con->parent->layout == L_STACKED ? VERT : HORIZ);
+        if (event->detail == XCB_BUTTON_INDEX_4)
+            tree_next('p', orientation);
+        else tree_next('n', orientation);
+        goto done;
+    }
+
+    /* 2: focus this con */
+    con_focus(con);
+
+    /* 3: for floating containers, we also want to raise them on click */
+    if (floatingcon != NULL) {
+        floating_raise_con(floatingcon);
+
+        /* 4: floating_modifier plus left mouse button drags */
+        if (mod_pressed && event->detail == 1) {
+            floating_drag_window(floatingcon, event);
+            return 1;
+        }
+
+        /* 5: resize (floating) if this was a click on the left/right/bottom
+         * border. also try resizing (tiling) if it was a click on the top
+         * border, but continue if that does not work */
+        if (mod_pressed && event->detail == 3) {
+            DLOG("floating resize due to floatingmodifier\n");
+            floating_resize_window(floatingcon, proportional, event);
+            return 1;
+        }
+
+        if (!in_stacked && dest == CLICK_DECORATION) {
+            /* try tiling resize, but continue if it doesn’t work */
+            DLOG("tiling resize with fallback\n");
+            if (tiling_resize(con, event, dest))
+                goto done;
+        }
+
+        if (dest == CLICK_BORDER) {
+            DLOG("floating resize due to border click\n");
+            floating_resize_window(floatingcon, proportional, event);
+            return 1;
+        }
+
+        /* 6: dragging, if this was a click on a decoration (which did not lead
+         * to a resize) */
+        if (!in_stacked && dest == CLICK_DECORATION) {
+            floating_drag_window(floatingcon, event);
+            return 1;
+        }
+
+        goto done;
+    }
+
+    if (in_stacked) {
+        /* for stacked/tabbed cons, the resizing applies to the parent
+         * container */
+        con = con->parent;
+    }
+
+    /* 7: floating modifier pressed, initiate a resize */
+    if (mod_pressed && event->detail == 3) {
+        if (floating_mod_on_tiled_client(con, event))
+            return 1;
+    }
+    /* 8: otherwise, check for border/decoration clicks and resize */
+    else if (dest == CLICK_BORDER || dest == CLICK_DECORATION) {
+        DLOG("Trying to resize (tiling)\n");
+        tiling_resize(con, event, dest);
+    }
+
+done:
+    xcb_allow_events(conn, XCB_ALLOW_REPLAY_POINTER, event->time);
+    xcb_flush(conn);
+    tree_render();
+    return 0;
+}
+
+/*
+ * The button press X callback. This function determines whether the floating
+ * modifier is pressed and where the user clicked (decoration, border, inside
+ * the window).
+ *
+ * Then, route_click is called on the appropriate con.
+ *
+ */
+int handle_button_press(xcb_button_press_event_t *event) {
+    Con *con;
+    DLOG("Button %d pressed on window 0x%08x\n", event->state, event->event);
+
+    const uint32_t mod = config.floating_modifier;
+    bool mod_pressed = (mod != 0 && (event->state & mod) == mod);
+    DLOG("floating_mod = %d, detail = %d\n", mod_pressed, event->detail);
+    if ((con = con_by_window_id(event->event)))
+        return route_click(con, event, mod_pressed, CLICK_INSIDE);
+
+    if (!(con = con_by_frame_id(event->event))) {
+        ELOG("Clicked into unknown window?!\n");
+        xcb_allow_events(conn, XCB_ALLOW_REPLAY_POINTER, event->time);
+        xcb_flush(conn);
+        return 0;
+    }
+
+    /* Check if the click was on the decoration of a child */
+    Con *child;
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        if (!rect_contains(child->deco_rect, event->event_x, event->event_y))
+            continue;
+
+        return route_click(child, event, mod_pressed, CLICK_DECORATION);
+    }
+
+    return route_click(con, event, mod_pressed, CLICK_BORDER);
+}
diff --git a/src/cmdparse.l b/src/cmdparse.l
new file mode 100644 (file)
index 0000000..898416c
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * cmdparse.l: the lexer for commands you send to i3 (or bind on keys)
+ *
+ */
+%option nounput
+%option noinput
+%option noyy_top_state
+%option stack
+
+%{
+#include <stdio.h>
+#include <string.h>
+#include "cmdparse.tab.h"
+
+#include "config.h"
+#include "util.h"
+
+int cmdyycolumn = 1;
+
+#define YY_DECL int yylex (struct context *context)
+
+#define YY_USER_ACTION { \
+    context->first_column = cmdyycolumn; \
+    context->last_column = cmdyycolumn+yyleng-1; \
+    cmdyycolumn += yyleng; \
+}
+
+/* macro to first eat whitespace, then expect a string */
+#define WS_STRING do { \
+    yy_push_state(WANT_STRING); \
+    yy_push_state(EAT_WHITESPACE); \
+} while (0)
+
+%}
+
+EOL (\r?\n)
+
+/* handle everything up to \n as a string */
+%s WANT_STRING
+/* eat a whitespace, then go to the next state on the stack */
+%s EAT_WHITESPACE
+/* handle a quoted string or everything up to the next whitespace */
+%s WANT_QSTRING
+
+%x BUFFER_LINE
+
+%%
+
+    {
+        /* This is called when a new line is lexed. We only want the
+         * first line to match to go into state BUFFER_LINE */
+        if (context->line_number == 0) {
+            context->line_number = 1;
+            BEGIN(INITIAL);
+            yy_push_state(BUFFER_LINE);
+        }
+    }
+
+<BUFFER_LINE>^[^\r\n]*/{EOL}? {
+    /* save whole line */
+    context->line_copy = sstrdup(yytext);
+
+    yyless(0);
+    yy_pop_state();
+    yy_set_bol(true);
+    cmdyycolumn = 1;
+}
+
+    /* the next/prev tokens are here to recognize them *before* handling
+     * strings ('workspace' command) */
+next                            { return TOK_NEXT; }
+prev                            { return TOK_PREV; }
+
+<WANT_STRING>\"[^\"]+\"         {
+                                  BEGIN(INITIAL);
+                                  /* strip quotes */
+                                  char *copy = sstrdup(yytext+1);
+                                  copy[strlen(copy)-1] = '\0';
+                                  cmdyylval.string = copy;
+                                  return STR;
+                                }
+<WANT_QSTRING>\"[^\"]+\"        {
+                                  BEGIN(INITIAL);
+                                  /* strip quotes */
+                                  char *copy = sstrdup(yytext+1);
+                                  copy[strlen(copy)-1] = '\0';
+                                  cmdyylval.string = copy;
+                                  return STR;
+                                }
+
+<WANT_STRING>[^;\n]+            { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; }
+
+<EAT_WHITESPACE>[;\n]           { BEGIN(INITIAL); return ';'; }
+<EAT_WHITESPACE>[ \t]*          { yy_pop_state(); }
+
+[ \t]*                          { /* ignore whitespace */ ; }
+exec                            { WS_STRING; return TOK_EXEC; }
+exit                            { return TOK_EXIT; }
+reload                          { return TOK_RELOAD; }
+restart                         { return TOK_RESTART; }
+kill                            { return TOK_KILL; }
+window                          { return TOK_WINDOW; }
+client                          { return TOK_CLIENT; }
+fullscreen                      { return TOK_FULLSCREEN; }
+global                          { return TOK_GLOBAL; }
+layout                          { return TOK_LAYOUT; }
+default                         { return TOK_DEFAULT; }
+stacked                         { return TOK_STACKED; }
+stacking                        { return TOK_STACKED; }
+tabbed                          { return TOK_TABBED; }
+border                          { return TOK_BORDER; }
+normal                          { return TOK_NORMAL; }
+none                            { return TOK_NONE; }
+1pixel                          { return TOK_1PIXEL; }
+mode                            { BEGIN(WANT_QSTRING); return TOK_MODE; }
+tiling                          { return TOK_TILING; }
+floating                        { return TOK_FLOATING; }
+toggle                          { return TOK_TOGGLE; }
+mode_toggle                     { return TOK_MODE_TOGGLE; }
+workspace                       { WS_STRING; return TOK_WORKSPACE; }
+focus                           { return TOK_FOCUS; }
+move                            { return TOK_MOVE; }
+open                            { return TOK_OPEN; }
+split                           { return TOK_SPLIT; }
+horizontal                      { return TOK_HORIZONTAL; }
+vertical                        { return TOK_VERTICAL; }
+up                              { return TOK_UP; }
+down                            { return TOK_DOWN; }
+left                            { return TOK_LEFT; }
+right                           { return TOK_RIGHT; }
+parent                          { return TOK_PARENT; }
+child                           { return TOK_CHILD; }
+resize                          { return TOK_RESIZE; }
+shrink                          { return TOK_SHRINK; }
+grow                            { return TOK_GROW; }
+px                              { return TOK_PX; }
+or                              { return TOK_OR; }
+ppt                             { return TOK_PPT; }
+nop                             { WS_STRING; return TOK_NOP; }
+append_layout                   { WS_STRING; return TOK_APPEND_LAYOUT; }
+mark                            { WS_STRING; return TOK_MARK; }
+
+enable                          { return TOK_ENABLE; }
+true                            { return TOK_ENABLE; }
+yes                             { return TOK_ENABLE; }
+disable                         { return TOK_DISABLE; }
+false                           { return TOK_DISABLE; }
+no                              { return TOK_DISABLE; }
+
+class                           { BEGIN(WANT_QSTRING); return TOK_CLASS; }
+id                              { BEGIN(WANT_QSTRING); return TOK_ID; }
+con_id                          { BEGIN(WANT_QSTRING); return TOK_CON_ID; }
+con_mark                        { BEGIN(WANT_QSTRING); return TOK_MARK; }
+title                           { BEGIN(WANT_QSTRING); return TOK_TITLE; }
+
+[0-9]+                          { cmdyylval.number = atoi(yytext); return NUMBER; }
+
+.                               { return (int)yytext[0]; }
+
+<<EOF>> {
+    while (yy_start_stack_ptr > 0)
+        yy_pop_state();
+    yyterminate();
+}
+
+%%
diff --git a/src/cmdparse.y b/src/cmdparse.y
new file mode 100644 (file)
index 0000000..d84023c
--- /dev/null
@@ -0,0 +1,859 @@
+%{
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * cmdparse.y: the parser for commands you send to i3 (or bind on keys)
+ *
+
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include "all.h"
+
+/** When the command did not include match criteria (!), we use the currently
+ * focused command. Do not confuse this case with a command which included
+ * criteria but which did not match any windows. This macro has to be called in
+ * every command.
+ */
+#define HANDLE_EMPTY_MATCH do { \
+    if (match_is_empty(&current_match)) { \
+        owindow *ow = smalloc(sizeof(owindow)); \
+        ow->con = focused; \
+        TAILQ_INIT(&owindows); \
+        TAILQ_INSERT_TAIL(&owindows, ow, owindows); \
+    } \
+} while (0)
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+extern int cmdyylex(struct context *context);
+extern int cmdyyparse(void);
+extern int cmdyylex_destroy(void);
+extern FILE *cmdyyin;
+YY_BUFFER_STATE cmdyy_scan_string(const char *);
+
+static struct context *context;
+static Match current_match;
+
+/*
+ * Helper data structure for an operation window (window on which the operation
+ * will be performed). Used to build the TAILQ owindows.
+ *
+ */
+typedef struct owindow {
+    Con *con;
+    TAILQ_ENTRY(owindow) owindows;
+} owindow;
+static TAILQ_HEAD(owindows_head, owindow) owindows;
+
+/* Holds the JSON which will be returned via IPC or NULL for the default return
+ * message */
+static char *json_output;
+
+/* We don’t need yydebug for now, as we got decent error messages using
+ * yyerror(). Should you ever want to extend the parser, it might be handy
+ * to just comment it in again, so it stays here. */
+//int cmdyydebug = 1;
+
+void cmdyyerror(const char *error_message) {
+    ELOG("\n");
+    ELOG("CMD: %s\n", error_message);
+    ELOG("CMD: in command:\n");
+    ELOG("CMD:   %s\n", context->line_copy);
+    ELOG("CMD:   ");
+    for (int c = 1; c <= context->last_column; c++)
+        if (c >= context->first_column)
+                printf("^");
+        else printf(" ");
+    printf("\n");
+    ELOG("\n");
+    context->compact_error = sstrdup(error_message);
+}
+
+int cmdyywrap() {
+    return 1;
+}
+
+char *parse_cmd(const char *new) {
+    LOG("COMMAND: *%s*\n", new);
+    cmdyy_scan_string(new);
+
+    match_init(&current_match);
+    context = scalloc(sizeof(struct context));
+    context->filename = "cmd";
+    FREE(json_output);
+    if (cmdyyparse() != 0) {
+        fprintf(stderr, "Could not parse command\n");
+        asprintf(&json_output, "{\"success\":false, \"error\":\"%s at position %d\"}",
+                 context->compact_error, context->first_column);
+        FREE(context->line_copy);
+        FREE(context->compact_error);
+        free(context);
+        return json_output;
+    }
+    printf("done, json output = %s\n", json_output);
+
+    cmdyylex_destroy();
+    FREE(context->line_copy);
+    FREE(context->compact_error);
+    free(context);
+    return json_output;
+}
+
+%}
+
+%error-verbose
+%lex-param { struct context *context }
+
+%union {
+    char *string;
+    char chr;
+    int number;
+}
+
+%token              TOK_EXEC            "exec"
+%token              TOK_EXIT            "exit"
+%token              TOK_RELOAD          "reload"
+%token              TOK_RESTART         "restart"
+%token              TOK_KILL            "kill"
+%token              TOK_WINDOW          "window"
+%token              TOK_CLIENT          "client"
+%token              TOK_FULLSCREEN      "fullscreen"
+%token              TOK_GLOBAL          "global"
+%token              TOK_LAYOUT          "layout"
+%token              TOK_DEFAULT         "default"
+%token              TOK_STACKED         "stacked"
+%token              TOK_TABBED          "tabbed"
+%token              TOK_BORDER          "border"
+%token              TOK_NORMAL          "normal"
+%token              TOK_NONE            "none"
+%token              TOK_1PIXEL          "1pixel"
+%token              TOK_MODE            "mode"
+%token              TOK_TILING          "tiling"
+%token              TOK_FLOATING        "floating"
+%token              TOK_MODE_TOGGLE     "mode_toggle"
+%token              TOK_ENABLE          "enable"
+%token              TOK_DISABLE         "disable"
+%token              TOK_WORKSPACE       "workspace"
+%token              TOK_TOGGLE          "toggle"
+%token              TOK_FOCUS           "focus"
+%token              TOK_MOVE            "move"
+%token              TOK_OPEN            "open"
+%token              TOK_NEXT            "next"
+%token              TOK_PREV            "prev"
+%token              TOK_SPLIT           "split"
+%token              TOK_HORIZONTAL      "horizontal"
+%token              TOK_VERTICAL        "vertical"
+%token              TOK_UP              "up"
+%token              TOK_DOWN            "down"
+%token              TOK_LEFT            "left"
+%token              TOK_RIGHT           "right"
+%token              TOK_PARENT          "parent"
+%token              TOK_CHILD           "child"
+%token              TOK_APPEND_LAYOUT   "append_layout"
+%token              TOK_MARK            "mark"
+%token              TOK_RESIZE          "resize"
+%token              TOK_GROW            "grow"
+%token              TOK_SHRINK          "shrink"
+%token              TOK_PX              "px"
+%token              TOK_OR              "or"
+%token              TOK_PPT             "ppt"
+%token              TOK_NOP             "nop"
+
+%token              TOK_CLASS           "class"
+%token              TOK_ID              "id"
+%token              TOK_CON_ID          "con_id"
+%token              TOK_TITLE           "title"
+
+%token  <string>    STR                 "<string>"
+%token  <number>    NUMBER              "<number>"
+
+%type   <number>    direction
+%type   <number>    split_direction
+%type   <number>    fullscreen_mode
+%type   <number>    level
+%type   <number>    window_mode
+%type   <number>    boolean
+%type   <number>    border_style
+%type   <number>    layout_mode
+%type   <number>    resize_px
+%type   <number>    resize_way
+%type   <number>    resize_tiling
+%type   <number>    optional_kill_mode
+
+%%
+
+commands:
+    commands ';' command
+    | command
+    {
+        owindow *current;
+
+        printf("single command completely parsed, dropping state...\n");
+        while (!TAILQ_EMPTY(&owindows)) {
+            current = TAILQ_FIRST(&owindows);
+            TAILQ_REMOVE(&owindows, current, owindows);
+            free(current);
+        }
+        match_init(&current_match);
+    }
+    ;
+
+command:
+    match operations
+    ;
+
+match:
+    | matchstart criteria matchend
+    {
+        printf("match parsed\n");
+    }
+    ;
+
+matchstart:
+    '['
+    {
+        printf("start\n");
+        match_init(&current_match);
+        TAILQ_INIT(&owindows);
+        /* copy all_cons */
+        Con *con;
+        TAILQ_FOREACH(con, &all_cons, all_cons) {
+            owindow *ow = smalloc(sizeof(owindow));
+            ow->con = con;
+            TAILQ_INSERT_TAIL(&owindows, ow, owindows);
+        }
+    }
+    ;
+
+matchend:
+    ']'
+    {
+        owindow *next, *current;
+
+        printf("match specification finished, matching...\n");
+        /* copy the old list head to iterate through it and start with a fresh
+         * list which will contain only matching windows */
+        struct owindows_head old = owindows;
+        TAILQ_INIT(&owindows);
+        for (next = TAILQ_FIRST(&old); next != TAILQ_END(&old);) {
+            /* make a copy of the next pointer and advance the pointer to the
+             * next element as we are going to invalidate the element’s
+             * next/prev pointers by calling TAILQ_INSERT_TAIL later */
+            current = next;
+            next = TAILQ_NEXT(next, owindows);
+
+            printf("checking if con %p / %s matches\n", current->con, current->con->name);
+            if (current_match.con_id != NULL) {
+                if (current_match.con_id == current->con) {
+                    printf("matches container!\n");
+                    TAILQ_INSERT_TAIL(&owindows, current, owindows);
+
+                }
+            } else if (current_match.mark != NULL && current->con->mark != NULL &&
+                    strcasecmp(current_match.mark, current->con->mark) == 0) {
+                printf("match by mark\n");
+                    TAILQ_INSERT_TAIL(&owindows, current, owindows);
+
+            } else {
+                if (current->con->window == NULL)
+                    continue;
+                if (match_matches_window(&current_match, current->con->window)) {
+                    printf("matches window!\n");
+                    TAILQ_INSERT_TAIL(&owindows, current, owindows);
+                } else {
+                    printf("doesnt match\n");
+                    free(current);
+                }
+            }
+        }
+
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            printf("matching: %p / %s\n", current->con, current->con->name);
+        }
+
+    }
+    ;
+
+criteria:
+    criteria criterion
+    | criterion
+    ;
+
+criterion:
+    TOK_CLASS '=' STR
+    {
+        printf("criteria: class = %s\n", $3);
+        current_match.class = $3;
+    }
+    | TOK_CON_ID '=' STR
+    {
+        printf("criteria: id = %s\n", $3);
+        char *end;
+        long parsed = strtol($3, &end, 10);
+        if (parsed == LONG_MIN ||
+            parsed == LONG_MAX ||
+            parsed < 0 ||
+            (end && *end != '\0')) {
+            ELOG("Could not parse con id \"%s\"\n", $3);
+        } else {
+            current_match.con_id = (Con*)parsed;
+            printf("id as int = %p\n", current_match.con_id);
+        }
+    }
+    | TOK_ID '=' STR
+    {
+        printf("criteria: window id = %s\n", $3);
+        char *end;
+        long parsed = strtol($3, &end, 10);
+        if (parsed == LONG_MIN ||
+            parsed == LONG_MAX ||
+            parsed < 0 ||
+            (end && *end != '\0')) {
+            ELOG("Could not parse window id \"%s\"\n", $3);
+        } else {
+            current_match.id = parsed;
+            printf("window id as int = %d\n", current_match.id);
+        }
+    }
+    | TOK_MARK '=' STR
+    {
+        printf("criteria: mark = %s\n", $3);
+        current_match.mark = $3;
+    }
+    | TOK_TITLE '=' STR
+    {
+        printf("criteria: title = %s\n", $3);
+        current_match.title = $3;
+    }
+    ;
+
+operations:
+    operation
+    | operations ',' operation
+    ;
+
+operation:
+    exec
+    | exit
+    | restart
+    | reload
+    | border
+    | layout
+    | append_layout
+    | move
+    | workspace
+    | focus
+    | kill
+    | open
+    | fullscreen
+    | split
+    | floating
+    | mark
+    | resize
+    | nop
+    | mode
+    ;
+
+exec:
+    TOK_EXEC STR
+    {
+        printf("should execute %s\n", $2);
+        start_application($2);
+        free($2);
+    }
+    ;
+
+exit:
+    TOK_EXIT
+    {
+        printf("exit, bye bye\n");
+        exit(0);
+    }
+    ;
+
+reload:
+    TOK_RELOAD
+    {
+        printf("reloading\n");
+        kill_configerror_nagbar(false);
+        load_configuration(conn, NULL, true);
+        x_set_i3_atoms();
+        /* Send an IPC event just in case the ws names have changed */
+        ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"reload\"}");
+    }
+    ;
+
+restart:
+    TOK_RESTART
+    {
+        printf("restarting i3\n");
+        i3_restart(false);
+    }
+    ;
+
+focus:
+    TOK_FOCUS
+    {
+        owindow *current;
+
+        if (match_is_empty(&current_match)) {
+            ELOG("You have to specify which window/container should be focused.\n");
+            ELOG("Example: [class=\"urxvt\" title=\"irssi\"] focus\n");
+
+            asprintf(&json_output, "{\"success\":false, \"error\":\"You have to "
+                     "specify which window/container should be focused\"}");
+            break;
+        }
+
+        int count = 0;
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            Con *ws = con_get_workspace(current->con);
+            workspace_show(ws->name);
+            LOG("focusing %p / %s\n", current->con, current->con->name);
+            con_focus(current->con);
+            count++;
+        }
+
+        if (count > 1)
+            LOG("WARNING: Your criteria for the focus command matches %d containers, "
+                "while only exactly one container can be focused at a time.\n", count);
+
+        tree_render();
+    }
+    | TOK_FOCUS direction
+    {
+        int direction = $2;
+        switch (direction) {
+            case TOK_LEFT:
+                LOG("Focusing left\n");
+                tree_next('p', HORIZ);
+                break;
+            case TOK_RIGHT:
+                LOG("Focusing right\n");
+                tree_next('n', HORIZ);
+                break;
+            case TOK_UP:
+                LOG("Focusing up\n");
+                tree_next('p', VERT);
+                break;
+            case TOK_DOWN:
+                LOG("Focusing down\n");
+                tree_next('n', VERT);
+                break;
+            default:
+                ELOG("Invalid focus direction (%d)\n", direction);
+                break;
+        }
+
+        tree_render();
+    }
+    | TOK_FOCUS window_mode
+    {
+        printf("should focus: ");
+
+        if ($2 == TOK_TILING)
+            printf("tiling\n");
+        else if ($2 == TOK_FLOATING)
+            printf("floating\n");
+        else printf("mode toggle\n");
+
+        Con *ws = con_get_workspace(focused);
+        Con *current;
+        if (ws != NULL) {
+            int to_focus = $2;
+            if ($2 == TOK_MODE_TOGGLE) {
+                current = TAILQ_FIRST(&(ws->focus_head));
+                if (current->type == CT_FLOATING_CON)
+                    to_focus = TOK_TILING;
+                else to_focus = TOK_FLOATING;
+            }
+            TAILQ_FOREACH(current, &(ws->focus_head), focused) {
+                if ((to_focus == TOK_FLOATING && current->type != CT_FLOATING_CON) ||
+                    (to_focus == TOK_TILING && current->type == CT_FLOATING_CON))
+                    continue;
+
+                con_focus(con_descend_focused(current));
+                break;
+            }
+        }
+
+        tree_render();
+    }
+    | TOK_FOCUS level
+    {
+        if ($2 == TOK_PARENT)
+            level_up();
+        else level_down();
+
+        tree_render();
+    }
+    ;
+
+window_mode:
+    TOK_TILING        { $$ = TOK_TILING; }
+    | TOK_FLOATING    { $$ = TOK_FLOATING; }
+    | TOK_MODE_TOGGLE { $$ = TOK_MODE_TOGGLE; }
+    ;
+
+level:
+    TOK_PARENT  { $$ = TOK_PARENT; }
+    | TOK_CHILD { $$ = TOK_CHILD;  }
+    ;
+
+kill:
+    TOK_KILL optional_kill_mode
+    {
+        owindow *current;
+
+        printf("killing!\n");
+        /* check if the match is empty, not if the result is empty */
+        if (match_is_empty(&current_match))
+            tree_close_con($2);
+        else {
+            TAILQ_FOREACH(current, &owindows, owindows) {
+                printf("matching: %p / %s\n", current->con, current->con->name);
+                tree_close(current->con, $2, false);
+            }
+        }
+
+        tree_render();
+    }
+    ;
+
+optional_kill_mode:
+    /* empty */             { $$ = KILL_WINDOW; }
+    | TOK_WINDOW { $$ = KILL_WINDOW; }
+    | TOK_CLIENT { $$ = KILL_CLIENT; }
+    ;
+
+workspace:
+    TOK_WORKSPACE TOK_NEXT
+    {
+        workspace_next();
+        tree_render();
+    }
+    | TOK_WORKSPACE TOK_PREV
+    {
+        workspace_prev();
+        tree_render();
+    }
+    | TOK_WORKSPACE STR
+    {
+        printf("should switch to workspace %s\n", $2);
+        workspace_show($2);
+        free($2);
+
+        tree_render();
+    }
+    ;
+
+open:
+    TOK_OPEN
+    {
+        printf("opening new container\n");
+        Con *con = tree_open_con(NULL, NULL);
+        con_focus(con);
+        asprintf(&json_output, "{\"success\":true, \"id\":%ld}", (long int)con);
+
+        tree_render();
+    }
+    ;
+
+fullscreen:
+    TOK_FULLSCREEN fullscreen_mode
+    {
+        printf("toggling fullscreen, mode = %s\n", ($2 == CF_OUTPUT ? "normal" : "global"));
+        owindow *current;
+
+        HANDLE_EMPTY_MATCH;
+
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            printf("matching: %p / %s\n", current->con, current->con->name);
+            con_toggle_fullscreen(current->con, $2);
+        }
+
+        tree_render();
+    }
+    ;
+
+fullscreen_mode:
+    /* empty */  { $$ = CF_OUTPUT; }
+    | TOK_GLOBAL { $$ = CF_GLOBAL; }
+    ;
+
+split:
+    TOK_SPLIT split_direction
+    {
+        /* TODO: use matches */
+        printf("splitting in direction %c\n", $2);
+        tree_split(focused, ($2 == 'v' ? VERT : HORIZ));
+
+        tree_render();
+    }
+    ;
+
+split_direction:
+    TOK_HORIZONTAL  { $$ = 'h'; }
+    | 'h'           { $$ = 'h'; }
+    | TOK_VERTICAL  { $$ = 'v'; }
+    | 'v'           { $$ = 'v'; }
+    ;
+
+floating:
+    TOK_FLOATING boolean
+    {
+        HANDLE_EMPTY_MATCH;
+
+        owindow *current;
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            printf("matching: %p / %s\n", current->con, current->con->name);
+            if ($2 == TOK_TOGGLE) {
+                printf("should toggle mode\n");
+                toggle_floating_mode(current->con, false);
+            } else {
+                printf("should switch mode to %s\n", ($2 == TOK_FLOATING ? "floating" : "tiling"));
+                if ($2 == TOK_ENABLE) {
+                    floating_enable(current->con, false);
+                } else {
+                    floating_disable(current->con, false);
+                }
+            }
+        }
+
+        tree_render();
+    }
+    ;
+
+boolean:
+    TOK_ENABLE    { $$ = TOK_ENABLE; }
+    | TOK_DISABLE { $$ = TOK_DISABLE; }
+    | TOK_TOGGLE  { $$ = TOK_TOGGLE; }
+    ;
+
+border:
+    TOK_BORDER border_style
+    {
+        printf("border style should be changed to %d\n", $2);
+        owindow *current;
+
+        HANDLE_EMPTY_MATCH;
+
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            printf("matching: %p / %s\n", current->con, current->con->name);
+            if ($2 == TOK_TOGGLE) {
+                current->con->border_style++;
+                current->con->border_style %= 3;
+            } else current->con->border_style = $2;
+        }
+
+        tree_render();
+    }
+    ;
+
+border_style:
+    TOK_NORMAL      { $$ = BS_NORMAL; }
+    | TOK_NONE      { $$ = BS_NONE; }
+    | TOK_1PIXEL    { $$ = BS_1PIXEL; }
+    | TOK_TOGGLE    { $$ = TOK_TOGGLE; }
+    ;
+
+move:
+    TOK_MOVE direction
+    {
+        printf("moving in direction %d\n", $2);
+        tree_move($2);
+
+        tree_render();
+    }
+    | TOK_MOVE TOK_WORKSPACE STR
+    {
+        owindow *current;
+
+        printf("should move window to workspace %s\n", $3);
+        /* get the workspace */
+        Con *ws = workspace_get($3, NULL);
+        free($3);
+
+        HANDLE_EMPTY_MATCH;
+
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            printf("matching: %p / %s\n", current->con, current->con->name);
+            con_move_to_workspace(current->con, ws);
+        }
+
+        tree_render();
+    }
+    ;
+
+append_layout:
+    TOK_APPEND_LAYOUT STR
+    {
+        printf("restoring \"%s\"\n", $2);
+        tree_append_json($2);
+        free($2);
+        tree_render();
+    }
+    ;
+
+layout:
+    TOK_LAYOUT layout_mode
+    {
+        printf("changing layout to %d\n", $2);
+        owindow *current;
+
+        /* check if the match is empty, not if the result is empty */
+        if (match_is_empty(&current_match))
+            con_set_layout(focused->parent, $2);
+        else {
+            TAILQ_FOREACH(current, &owindows, owindows) {
+                printf("matching: %p / %s\n", current->con, current->con->name);
+                con_set_layout(current->con, $2);
+            }
+        }
+
+        tree_render();
+    }
+    ;
+
+layout_mode:
+    TOK_DEFAULT   { $$ = L_DEFAULT; }
+    | TOK_STACKED { $$ = L_STACKED; }
+    | TOK_TABBED  { $$ = L_TABBED; }
+    ;
+
+mark:
+    TOK_MARK STR
+    {
+        printf("marking window with str %s\n", $2);
+        owindow *current;
+
+        HANDLE_EMPTY_MATCH;
+
+        TAILQ_FOREACH(current, &owindows, owindows) {
+            printf("matching: %p / %s\n", current->con, current->con->name);
+            current->con->mark = sstrdup($2);
+        }
+
+        free($<string>2);
+
+        tree_render();
+    }
+    ;
+
+nop:
+    TOK_NOP STR
+    {
+        printf("-------------------------------------------------\n");
+        printf("  NOP: %s\n", $2);
+        printf("-------------------------------------------------\n");
+        free($2);
+    }
+    ;
+
+resize:
+    TOK_RESIZE resize_way direction resize_px resize_tiling
+    {
+        /* resize <grow|shrink> <direction> [<px> px] [or <ppt> ppt] */
+        printf("resizing in way %d, direction %d, px %d or ppt %d\n", $2, $3, $4, $5);
+        int direction = $3;
+        int px = $4;
+        int ppt = $5;
+        if ($2 == TOK_SHRINK) {
+            px *= -1;
+            ppt *= -1;
+        }
+
+        if (con_is_floating(focused)) {
+            printf("floating resize\n");
+            if (direction == TOK_UP) {
+                focused->parent->rect.y -= px;
+                focused->parent->rect.height += px;
+            } else if (direction == TOK_DOWN) {
+                focused->rect.height += px;
+            } else if (direction == TOK_LEFT) {
+                focused->rect.x -= px;
+                focused->rect.width += px;
+            } else {
+                focused->rect.width += px;
+            }
+        } else {
+            LOG("tiling resize\n");
+            /* get the default percentage */
+            int children = con_num_children(focused->parent);
+            Con *other;
+            LOG("ins. %d children\n", children);
+            double percentage = 1.0 / children;
+            LOG("default percentage = %f\n", percentage);
+
+            if (direction == TOK_UP || direction == TOK_LEFT) {
+                other = TAILQ_PREV(focused, nodes_head, nodes);
+            } else {
+                other = TAILQ_NEXT(focused, nodes);
+            }
+            if (other == TAILQ_END(workspaces)) {
+                LOG("No other container in this direction found, cannot resize.\n");
+                return 0;
+            }
+            LOG("other->percent = %f\n", other->percent);
+            LOG("focused->percent before = %f\n", focused->percent);
+            if (focused->percent == 0.0)
+                focused->percent = percentage;
+            if (other->percent == 0.0)
+                other->percent = percentage;
+            focused->percent += ((double)ppt / 100.0);
+            other->percent -= ((double)ppt / 100.0);
+            LOG("focused->percent after = %f\n", focused->percent);
+            LOG("other->percent after = %f\n", other->percent);
+        }
+
+        tree_render();
+    }
+    ;
+
+resize_px:
+    /* empty */
+    {
+        $$ = 10;
+    }
+    | NUMBER TOK_PX
+    {
+        $$ = $1;
+    }
+    ;
+
+resize_tiling:
+    /* empty */
+    {
+        $$ = 10;
+    }
+    | TOK_OR NUMBER TOK_PPT
+    {
+        $$ = $2;
+    }
+    ;
+
+resize_way:
+    TOK_GROW        { $$ = TOK_GROW; }
+    | TOK_SHRINK    { $$ = TOK_SHRINK; }
+    ;
+
+direction:
+    TOK_UP          { $$ = TOK_UP; }
+    | TOK_DOWN      { $$ = TOK_DOWN; }
+    | TOK_LEFT      { $$ = TOK_LEFT; }
+    | TOK_RIGHT     { $$ = TOK_RIGHT; }
+    ;
+
+mode:
+    TOK_MODE STR
+    {
+        switch_mode($2);
+    }
+    ;
diff --git a/src/con.c b/src/con.c
new file mode 100644 (file)
index 0000000..1cf1779
--- /dev/null
+++ b/src/con.c
@@ -0,0 +1,970 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * con.c contains all functions which deal with containers directly (creating
+ * containers, searching containers, getting specific properties from
+ * containers, …).
+ *
+ */
+#include "all.h"
+
+char *colors[] = {
+    "#ff0000",
+    "#00FF00",
+    "#0000FF",
+    "#ff00ff",
+    "#00ffff",
+    "#ffff00",
+    "#aa0000",
+    "#00aa00",
+    "#0000aa",
+    "#aa00aa"
+};
+
+static void con_on_remove_child(Con *con);
+
+/*
+ * Create a new container (and attach it to the given parent, if not NULL).
+ * This function initializes the data structures and creates the appropriate
+ * X11 IDs using x_con_init().
+ *
+ */
+Con *con_new(Con *parent, i3Window *window) {
+    Con *new = scalloc(sizeof(Con));
+    new->on_remove_child = con_on_remove_child;
+    TAILQ_INSERT_TAIL(&all_cons, new, all_cons);
+    new->type = CT_CON;
+    new->window = window;
+    new->border_style = config.default_border;
+    static int cnt = 0;
+    DLOG("opening window %d\n", cnt);
+
+    /* TODO: remove window coloring after test-phase */
+    DLOG("color %s\n", colors[cnt]);
+    new->name = strdup(colors[cnt]);
+    //uint32_t cp = get_colorpixel(colors[cnt]);
+    cnt++;
+    if ((cnt % (sizeof(colors) / sizeof(char*))) == 0)
+        cnt = 0;
+
+    x_con_init(new);
+
+    TAILQ_INIT(&(new->floating_head));
+    TAILQ_INIT(&(new->nodes_head));
+    TAILQ_INIT(&(new->focus_head));
+    TAILQ_INIT(&(new->swallow_head));
+
+    if (parent != NULL)
+        con_attach(new, parent, false);
+
+    return new;
+}
+
+/*
+ * Attaches the given container to the given parent. This happens when moving
+ * a container or when inserting a new container at a specific place in the
+ * tree.
+ *
+ * ignore_focus is to just insert the Con at the end (useful when creating a
+ * new split container *around* some containers, that is, detaching and
+ * attaching them in order without wanting to mess with the focus in between).
+ *
+ */
+void con_attach(Con *con, Con *parent, bool ignore_focus) {
+    con->parent = parent;
+    Con *loop;
+    Con *current = NULL;
+    struct nodes_head *nodes_head = &(parent->nodes_head);
+    struct focus_head *focus_head = &(parent->focus_head);
+
+    /* Workspaces are handled differently: they need to be inserted at the
+     * right position. */
+    if (con->type == CT_WORKSPACE) {
+        DLOG("it's a workspace. num = %d\n", con->num);
+        if (con->num == -1 || TAILQ_EMPTY(nodes_head)) {
+            TAILQ_INSERT_TAIL(nodes_head, con, nodes);
+        } else {
+            current = TAILQ_FIRST(nodes_head);
+            if (con->num < current->num) {
+                /* we need to insert the container at the beginning */
+                TAILQ_INSERT_HEAD(nodes_head, con, nodes);
+            } else {
+                while (current->num != -1 && con->num > current->num) {
+                    current = TAILQ_NEXT(current, nodes);
+                    if (current == TAILQ_END(nodes_head)) {
+                        current = NULL;
+                        break;
+                    }
+                }
+                /* we need to insert con after current, if current is not NULL */
+                if (current)
+                    TAILQ_INSERT_BEFORE(current, con, nodes);
+                else TAILQ_INSERT_TAIL(nodes_head, con, nodes);
+            }
+        }
+        goto add_to_focus_head;
+    }
+
+    if (con->type == CT_FLOATING_CON) {
+        DLOG("Inserting into floating containers\n");
+        TAILQ_INSERT_TAIL(&(parent->floating_head), con, floating_windows);
+    } else {
+        if (!ignore_focus) {
+            /* Get the first tiling container in focus stack */
+            TAILQ_FOREACH(loop, &(parent->focus_head), focused) {
+                if (loop->type == CT_FLOATING_CON)
+                    continue;
+                current = loop;
+                break;
+            }
+        }
+
+        /* When the container is not a split container (but contains a window)
+         * and is attached to a workspace, we check if the user configured a
+         * workspace_layout. This is done in workspace_attach_to, which will
+         * provide us with the container to which we should attach (either the
+         * workspace or a new split container with the configured
+         * workspace_layout).
+         */
+        if (con->window != NULL && parent->type == CT_WORKSPACE) {
+            DLOG("Parent is a workspace. Applying default layout...\n");
+            Con *target = workspace_attach_to(parent);
+
+            /* Attach the original con to this new split con instead */
+            nodes_head = &(target->nodes_head);
+            focus_head = &(target->focus_head);
+            con->parent = target;
+            current = NULL;
+
+            DLOG("done\n");
+        }
+
+        /* Insert the container after the tiling container, if found.
+         * When adding to a CT_OUTPUT, just append one after another. */
+        if (current && parent->type != CT_OUTPUT) {
+            DLOG("Inserting con = %p after last focused tiling con %p\n",
+                 con, current);
+            TAILQ_INSERT_AFTER(nodes_head, current, con, nodes);
+        } else TAILQ_INSERT_TAIL(nodes_head, con, nodes);
+    }
+
+add_to_focus_head:
+    /* We insert to the TAIL because con_focus() will correct this.
+     * This way, we have the option to insert Cons without having
+     * to focus them. */
+    TAILQ_INSERT_TAIL(focus_head, con, focused);
+}
+
+/*
+ * Detaches the given container from its current parent
+ *
+ */
+void con_detach(Con *con) {
+    if (con->type == CT_FLOATING_CON) {
+        TAILQ_REMOVE(&(con->parent->floating_head), con, floating_windows);
+        TAILQ_REMOVE(&(con->parent->focus_head), con, focused);
+    } else {
+        TAILQ_REMOVE(&(con->parent->nodes_head), con, nodes);
+        TAILQ_REMOVE(&(con->parent->focus_head), con, focused);
+    }
+}
+
+/*
+ * Sets input focus to the given container. Will be updated in X11 in the next
+ * run of x_push_changes().
+ *
+ */
+void con_focus(Con *con) {
+    assert(con != NULL);
+    DLOG("con_focus = %p\n", con);
+
+    /* 1: set focused-pointer to the new con */
+    /* 2: exchange the position of the container in focus stack of the parent all the way up */
+    TAILQ_REMOVE(&(con->parent->focus_head), con, focused);
+    TAILQ_INSERT_HEAD(&(con->parent->focus_head), con, focused);
+    if (con->parent->parent != NULL)
+        con_focus(con->parent);
+
+    focused = con;
+    if (con->urgent) {
+        con->urgent = false;
+        workspace_update_urgent_flag(con_get_workspace(con));
+    }
+    DLOG("con_focus done = %p\n", con);
+}
+
+/*
+ * Returns true when this node is a leaf node (has no children)
+ *
+ */
+bool con_is_leaf(Con *con) {
+    return TAILQ_EMPTY(&(con->nodes_head));
+}
+
+/*
+ * Returns true if this node accepts a window (if the node swallows windows,
+ * it might already have swallowed enough and cannot hold any more).
+ *
+ */
+bool con_accepts_window(Con *con) {
+    /* 1: workspaces never accept direct windows */
+    if (con->type == CT_WORKSPACE)
+        return false;
+
+    if (con->orientation != NO_ORIENTATION) {
+        DLOG("container %p does not accepts windows, orientation != NO_ORIENTATION\n", con);
+        return false;
+    }
+
+    /* TODO: if this is a swallowing container, we need to check its max_clients */
+    return (con->window == NULL);
+}
+
+/*
+ * Gets the output container (first container with CT_OUTPUT in hierarchy) this
+ * node is on.
+ *
+ */
+Con *con_get_output(Con *con) {
+    Con *result = con;
+    while (result != NULL && result->type != CT_OUTPUT)
+        result = result->parent;
+    /* We must be able to get an output because focus can never be set higher
+     * in the tree (root node cannot be focused). */
+    assert(result != NULL);
+    return result;
+}
+
+/*
+ * Gets the workspace container this node is on.
+ *
+ */
+Con *con_get_workspace(Con *con) {
+    Con *result = con;
+    while (result != NULL && result->type != CT_WORKSPACE)
+        result = result->parent;
+    return result;
+}
+
+/*
+ * Searches parenst of the given 'con' until it reaches one with the specified
+ * 'orientation'. Aborts when it comes across a floating_con.
+ *
+ */
+Con *con_parent_with_orientation(Con *con, orientation_t orientation) {
+    DLOG("Searching for parent of Con %p with orientation %d\n", con, orientation);
+    Con *parent = con->parent;
+    if (parent->type == CT_FLOATING_CON)
+        return NULL;
+    while (con_orientation(parent) != orientation) {
+        DLOG("Need to go one level further up\n");
+        parent = parent->parent;
+        /* Abort when we reach a floating con */
+        if (parent && parent->type == CT_FLOATING_CON)
+            parent = NULL;
+        if (parent == NULL)
+            break;
+    }
+    DLOG("Result: %p\n", parent);
+    return parent;
+}
+
+/*
+ * helper data structure for the breadth-first-search in
+ * con_get_fullscreen_con()
+ *
+ */
+struct bfs_entry {
+    Con *con;
+
+    TAILQ_ENTRY(bfs_entry) entries;
+};
+
+/*
+ * Returns the first fullscreen node below this node.
+ *
+ */
+Con *con_get_fullscreen_con(Con *con, int fullscreen_mode) {
+    Con *current, *child;
+
+    /* TODO: is breadth-first-search really appropriate? (check as soon as
+     * fullscreen levels and fullscreen for containers is implemented) */
+    TAILQ_HEAD(bfs_head, bfs_entry) bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head);
+    struct bfs_entry *entry = smalloc(sizeof(struct bfs_entry));
+    entry->con = con;
+    TAILQ_INSERT_TAIL(&bfs_head, entry, entries);
+
+    while (!TAILQ_EMPTY(&bfs_head)) {
+        entry = TAILQ_FIRST(&bfs_head);
+        current = entry->con;
+        if (current != con && current->fullscreen_mode == fullscreen_mode) {
+            /* empty the queue */
+            while (!TAILQ_EMPTY(&bfs_head)) {
+                entry = TAILQ_FIRST(&bfs_head);
+                TAILQ_REMOVE(&bfs_head, entry, entries);
+                free(entry);
+            }
+            return current;
+        }
+
+        TAILQ_REMOVE(&bfs_head, entry, entries);
+        free(entry);
+
+        TAILQ_FOREACH(child, &(current->nodes_head), nodes) {
+            entry = smalloc(sizeof(struct bfs_entry));
+            entry->con = child;
+            TAILQ_INSERT_TAIL(&bfs_head, entry, entries);
+        }
+
+        TAILQ_FOREACH(child, &(current->floating_head), floating_windows) {
+            entry = smalloc(sizeof(struct bfs_entry));
+            entry->con = child;
+            TAILQ_INSERT_TAIL(&bfs_head, entry, entries);
+        }
+    }
+
+    return NULL;
+}
+
+/*
+ * Returns true if the node is floating.
+ *
+ */
+bool con_is_floating(Con *con) {
+    assert(con != NULL);
+    DLOG("checking if con %p is floating\n", con);
+    return (con->floating >= FLOATING_AUTO_ON);
+}
+
+/*
+ * Checks if the given container is either floating or inside some floating
+ * container. It returns the FLOATING_CON container.
+ *
+ */
+Con *con_inside_floating(Con *con) {
+    assert(con != NULL);
+    if (con->type == CT_FLOATING_CON)
+        return con;
+
+    if (con->floating >= FLOATING_AUTO_ON)
+        return con->parent;
+
+    if (con->type == CT_WORKSPACE || con->type == CT_OUTPUT)
+        return NULL;
+
+    return con_inside_floating(con->parent);
+}
+
+/*
+ * Returns the container with the given client window ID or NULL if no such
+ * container exists.
+ *
+ */
+Con *con_by_window_id(xcb_window_t window) {
+    Con *con;
+    TAILQ_FOREACH(con, &all_cons, all_cons)
+        if (con->window != NULL && con->window->id == window)
+            return con;
+    return NULL;
+}
+
+/*
+ * Returns the container with the given frame ID or NULL if no such container
+ * exists.
+ *
+ */
+Con *con_by_frame_id(xcb_window_t frame) {
+    Con *con;
+    TAILQ_FOREACH(con, &all_cons, all_cons)
+        if (con->frame == frame)
+            return con;
+    return NULL;
+}
+
+/*
+ * Returns the first container below 'con' which wants to swallow this window
+ * TODO: priority
+ *
+ */
+Con *con_for_window(Con *con, i3Window *window, Match **store_match) {
+    Con *child;
+    Match *match;
+    DLOG("searching con for window %p starting at con %p\n", window, con);
+    DLOG("class == %s\n", window->class_class);
+
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        TAILQ_FOREACH(match, &(child->swallow_head), matches) {
+            if (!match_matches_window(match, window))
+                continue;
+            if (store_match != NULL)
+                *store_match = match;
+            return child;
+        }
+        Con *result = con_for_window(child, window, store_match);
+        if (result != NULL)
+            return result;
+    }
+
+    TAILQ_FOREACH(child, &(con->floating_head), floating_windows) {
+        TAILQ_FOREACH(match, &(child->swallow_head), matches) {
+            if (!match_matches_window(match, window))
+                continue;
+            if (store_match != NULL)
+                *store_match = match;
+            return child;
+        }
+        Con *result = con_for_window(child, window, store_match);
+        if (result != NULL)
+            return result;
+    }
+
+    return NULL;
+}
+
+/*
+ * Returns the number of children of this container.
+ *
+ */
+int con_num_children(Con *con) {
+    Con *child;
+    int children = 0;
+
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+        children++;
+
+    return children;
+}
+
+/*
+ * Updates the percent attribute of the children of the given container. This
+ * function needs to be called when a window is added or removed from a
+ * container.
+ *
+ */
+void con_fix_percent(Con *con) {
+    Con *child;
+    int children = con_num_children(con);
+
+    // calculate how much we have distributed and how many containers
+    // with a percentage set we have
+    double total = 0.0;
+    int children_with_percent = 0;
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        if (child->percent > 0.0) {
+            total += child->percent;
+            ++children_with_percent;
+        }
+    }
+
+    // if there were children without a percentage set, set to a value that
+    // will make those children proportional to all others
+    if (children_with_percent != children) {
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+            if (child->percent <= 0.0) {
+                if (children_with_percent == 0)
+                    total += (child->percent = 1.0);
+                else total += (child->percent = total / children_with_percent);
+            }
+        }
+    }
+
+    // if we got a zero, just distribute the space equally, otherwise
+    // distribute according to the proportions we got
+    if (total == 0.0) {
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+            child->percent = 1.0 / children;
+    } else if (total != 1.0) {
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+            child->percent /= total;
+    }
+}
+
+/*
+ * Toggles fullscreen mode for the given container. Fullscreen mode will not be
+ * entered when there already is a fullscreen container on this workspace.
+ *
+ */
+void con_toggle_fullscreen(Con *con, int fullscreen_mode) {
+    Con *workspace, *fullscreen;
+
+    if (con->type == CT_WORKSPACE) {
+        DLOG("You cannot make a workspace fullscreen.\n");
+        return;
+    }
+
+    DLOG("toggling fullscreen for %p / %s\n", con, con->name);
+    if (con->fullscreen_mode == CF_NONE) {
+        /* 1: check if there already is a fullscreen con */
+        if (fullscreen_mode == CF_GLOBAL)
+            fullscreen = con_get_fullscreen_con(croot, CF_GLOBAL);
+        else {
+            workspace = con_get_workspace(con);
+            fullscreen = con_get_fullscreen_con(workspace, CF_OUTPUT);
+        }
+        if (fullscreen != NULL) {
+            LOG("Not entering fullscreen mode, container (%p/%s) "
+                "already is in fullscreen mode\n",
+                fullscreen, fullscreen->name);
+            goto update_netwm_state;
+        }
+
+        /* 2: enable fullscreen */
+        con->fullscreen_mode = fullscreen_mode;
+    } else {
+        /* 1: disable fullscreen */
+        con->fullscreen_mode = CF_NONE;
+    }
+
+update_netwm_state:
+    DLOG("mode now: %d\n", con->fullscreen_mode);
+
+    /* update _NET_WM_STATE if this container has a window */
+    /* TODO: when a window is assigned to a container which is already
+     * fullscreened, this state needs to be pushed to the client, too */
+    if (con->window == NULL)
+        return;
+
+    uint32_t values[1];
+    unsigned int num = 0;
+
+    if (con->fullscreen_mode != CF_NONE)
+        values[num++] = A__NET_WM_STATE_FULLSCREEN;
+
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->window->id,
+                        A__NET_WM_STATE, A_ATOM, 32, num, values);
+}
+
+/*
+ * Moves the given container to the currently focused container on the given
+ * workspace.
+ * TODO: is there a better place for this function?
+ *
+ */
+void con_move_to_workspace(Con *con, Con *workspace) {
+    if (con->type == CT_WORKSPACE) {
+        DLOG("Moving workspaces is not yet implemented.\n");
+        return;
+    }
+
+    if (con_is_floating(con)) {
+        DLOG("Using FLOATINGCON instead\n");
+        con = con->parent;
+    }
+
+    Con *source_output = con_get_output(con),
+        *dest_output = con_get_output(workspace);
+
+    /* 1: save the container which is going to be focused after the current
+     * container is moved away */
+    Con *focus_next = con_next_focused(con);
+
+    /* 2: get the focused container of this workspace */
+    Con *next = con_descend_focused(workspace);
+
+    /* 3: we go up one level, but only when next is a normal container */
+    if (next->type != CT_WORKSPACE) {
+        DLOG("next originally = %p / %s / type %d\n", next, next->name, next->type);
+        next = next->parent;
+    }
+
+    /* 4: if the target container is floating, we get the workspace instead.
+     * Only tiling windows need to get inserted next to the current container.
+     * */
+    Con *floatingcon = con_inside_floating(next);
+    if (floatingcon != NULL) {
+        DLOG("floatingcon, going up even further\n");
+        next = floatingcon->parent;
+    }
+
+    if (con->type == CT_FLOATING_CON) {
+        Con *ws = con_get_workspace(next);
+        DLOG("This is a floating window, using workspace %p / %s\n", ws, ws->name);
+        next = ws;
+    }
+
+    DLOG("Re-attaching container to %p / %s\n", next, next->name);
+    /* 5: re-attach the con to the parent of this focused container */
+    Con *parent = con->parent;
+    con_detach(con);
+    con_attach(con, next, false);
+
+    /* 6: fix the percentages */
+    con_fix_percent(parent);
+    con->percent = 0.0;
+    con_fix_percent(next);
+
+    /* 7: focus the con on the target workspace (the X focus is only updated by
+     * calling tree_render(), so for the "real" focus this is a no-op) */
+    con_focus(con);
+
+    /* 8: when moving to a visible workspace on a different output, we keep the
+     * con focused. Otherwise, we leave the focus on the current workspace as we
+     * don’t want to focus invisible workspaces */
+    if (source_output != dest_output &&
+        workspace_is_visible(workspace)) {
+        DLOG("Moved to a different output, focusing target\n");
+    } else {
+        con_focus(focus_next);
+    }
+
+    CALL(parent, on_remove_child);
+}
+
+/*
+ * Returns the orientation of the given container (for stacked containers,
+ * vertical orientation is used regardless of the actual orientation of the
+ * container).
+ *
+ */
+int con_orientation(Con *con) {
+    /* stacking containers behave like they are in vertical orientation */
+    if (con->layout == L_STACKED)
+        return VERT;
+
+    if (con->layout == L_TABBED)
+        return HORIZ;
+
+    return con->orientation;
+}
+
+/*
+ * Returns the container which will be focused next when the given container
+ * is not available anymore. Called in tree_close and con_move_to_workspace
+ * to properly restore focus.
+ *
+ */
+Con *con_next_focused(Con *con) {
+    Con *next;
+    /* floating containers are attached to a workspace, so we focus either the
+     * next floating container (if any) or the workspace itself. */
+    if (con->type == CT_FLOATING_CON) {
+        DLOG("selecting next for CT_FLOATING_CON\n");
+        next = TAILQ_NEXT(con, floating_windows);
+        DLOG("next = %p\n", next);
+        if (!next) {
+            next = TAILQ_PREV(con, floating_head, floating_windows);
+            DLOG("using prev, next = %p\n", next);
+        }
+        if (!next) {
+            Con *ws = con_get_workspace(con);
+            next = ws;
+            DLOG("no more floating containers for next = %p, restoring workspace focus\n", next);
+            while (next != TAILQ_END(&(ws->focus_head)) && !TAILQ_EMPTY(&(next->focus_head))) {
+                next = TAILQ_FIRST(&(next->focus_head));
+                if (next == con) {
+                    DLOG("skipping container itself, we want the next client\n");
+                    next = TAILQ_NEXT(next, focused);
+                }
+            }
+            if (next == TAILQ_END(&(ws->focus_head))) {
+                DLOG("Focus list empty, returning ws\n");
+                next = ws;
+            }
+        } else {
+            /* Instead of returning the next CT_FLOATING_CON, we descend it to
+             * get an actual window to focus. */
+            next = con_descend_focused(next);
+        }
+        return next;
+    }
+
+    /* dock clients cannot be focused, so we focus the workspace instead */
+    if (con->parent->type == CT_DOCKAREA) {
+        DLOG("selecting workspace for dock client\n");
+        return con_descend_focused(output_get_content(con->parent->parent));
+    }
+
+    /* if 'con' is not the first entry in the focus stack, use the first one as
+     * it’s currently focused already */
+    Con *first = TAILQ_FIRST(&(con->parent->focus_head));
+    if (first != con) {
+        DLOG("Using first entry %p\n", first);
+        next = first;
+    } else {
+        /* try to focus the next container on the same level as this one or fall
+         * back to its parent */
+        if (!(next = TAILQ_NEXT(con, focused)))
+            next = con->parent;
+    }
+
+    /* now go down the focus stack as far as
+     * possible, excluding the current container */
+    while (!TAILQ_EMPTY(&(next->focus_head)) &&
+           TAILQ_FIRST(&(next->focus_head)) != con)
+        next = TAILQ_FIRST(&(next->focus_head));
+
+    return next;
+}
+
+/*
+ * Get the next/previous container in the specified orientation. This may
+ * travel up until it finds a container with suitable orientation.
+ *
+ */
+Con *con_get_next(Con *con, char way, orientation_t orientation) {
+    DLOG("con_get_next(way=%c, orientation=%d)\n", way, orientation);
+    /* 1: get the first parent with the same orientation */
+    Con *cur = con;
+    while (con_orientation(cur->parent) != orientation) {
+        DLOG("need to go one level further up\n");
+        if (cur->parent->type == CT_WORKSPACE) {
+            LOG("that's a workspace, we can't go further up\n");
+            return NULL;
+        }
+        cur = cur->parent;
+    }
+
+    /* 2: chose next (or previous) */
+    Con *next;
+    if (way == 'n') {
+        next = TAILQ_NEXT(cur, nodes);
+        /* if we are at the end of the list, we need to wrap */
+        if (next == TAILQ_END(&(parent->nodes_head)))
+            return NULL;
+    } else {
+        next = TAILQ_PREV(cur, nodes_head, nodes);
+        /* if we are at the end of the list, we need to wrap */
+        if (next == TAILQ_END(&(cur->nodes_head)))
+            return NULL;
+    }
+    DLOG("next = %p\n", next);
+
+    return next;
+}
+
+/*
+ * Returns the focused con inside this client, descending the tree as far as
+ * possible. This comes in handy when attaching a con to a workspace at the
+ * currently focused position, for example.
+ *
+ */
+Con *con_descend_focused(Con *con) {
+    Con *next = con;
+    while (!TAILQ_EMPTY(&(next->focus_head)))
+        next = TAILQ_FIRST(&(next->focus_head));
+    return next;
+}
+
+/*
+ * Returns the focused con inside this client, descending the tree as far as
+ * possible. This comes in handy when attaching a con to a workspace at the
+ * currently focused position, for example.
+ *
+ * Works like con_descend_focused but considers only tiling cons.
+ *
+ */
+Con *con_descend_tiling_focused(Con *con) {
+    Con *next = con;
+    Con *before;
+    Con *child;
+    do {
+        before = next;
+        TAILQ_FOREACH(child, &(next->focus_head), focused) {
+            if (child->type == CT_FLOATING_CON)
+                continue;
+
+            next = child;
+            break;
+        }
+    } while (before != next);
+    return next;
+}
+
+
+/*
+ * Returns a "relative" Rect which contains the amount of pixels that need to
+ * be added to the original Rect to get the final position (obviously the
+ * amount of pixels for normal, 1pixel and borderless are different).
+ *
+ */
+Rect con_border_style_rect(Con *con) {
+    switch (con_border_style(con)) {
+    case BS_NORMAL:
+        return (Rect){2, 0, -(2 * 2), -2};
+
+    case BS_1PIXEL:
+        return (Rect){1, 1, -2, -2};
+
+    case BS_NONE:
+        return (Rect){0, 0, 0, 0};
+
+    default:
+        assert(false);
+    }
+}
+
+/*
+ * Use this function to get a container’s border style. This is important
+ * because when inside a stack, the border style is always BS_NORMAL.
+ * For tabbed mode, the same applies, with one exception: when the container is
+ * borderless and the only element in the tabbed container, the border is not
+ * rendered.
+ *
+ * For children of a CT_DOCKAREA, the border style is always none.
+ *
+ */
+int con_border_style(Con *con) {
+    Con *fs = con_get_fullscreen_con(con->parent, CF_OUTPUT);
+    if (fs == con) {
+        DLOG("this one is fullscreen! overriding BS_NONE\n");
+        return BS_NONE;
+    }
+
+    if (con->parent->layout == L_STACKED)
+        return (con_num_children(con->parent) == 1 ? con->border_style : BS_NORMAL);
+
+    if (con->parent->layout == L_TABBED && con->border_style != BS_NORMAL)
+        return (con_num_children(con->parent) == 1 ? con->border_style : BS_NORMAL);
+
+    if (con->parent->type == CT_DOCKAREA)
+        return BS_NONE;
+
+    return con->border_style;
+}
+
+/*
+ * This function changes the layout of a given container. Use it to handle
+ * special cases like changing a whole workspace to stacked/tabbed (creates a
+ * new split container before).
+ *
+ */
+void con_set_layout(Con *con, int layout) {
+    /* When the container type is CT_WORKSPACE, the user wants to change the
+     * whole workspace into stacked/tabbed mode. To do this and still allow
+     * intuitive operations (like level-up and then opening a new window), we
+     * need to create a new split container. */
+    if (con->type == CT_WORKSPACE) {
+        DLOG("Creating new split container\n");
+        /* 1: create a new split container */
+        Con *new = con_new(NULL, NULL);
+        new->parent = con;
+
+        /* 2: set the requested layout on the split con */
+        new->layout = layout;
+
+        /* 3: While the layout is irrelevant in stacked/tabbed mode, it needs
+         * to be set. Otherwise, this con will not be interpreted as a split
+         * container. */
+        if (config.default_orientation == NO_ORIENTATION) {
+            new->orientation = (con->rect.height > con->rect.width) ? VERT : HORIZ;
+        } else {
+            new->orientation = config.default_orientation;
+        }
+
+        Con *old_focused = TAILQ_FIRST(&(con->focus_head));
+        if (old_focused == TAILQ_END(&(con->focus_head)))
+            old_focused = NULL;
+
+        /* 4: move the existing cons of this workspace below the new con */
+        DLOG("Moving cons\n");
+        Con *child;
+        while (!TAILQ_EMPTY(&(con->nodes_head))) {
+            child = TAILQ_FIRST(&(con->nodes_head));
+            con_detach(child);
+            con_attach(child, new, true);
+        }
+
+        /* 4: attach the new split container to the workspace */
+        DLOG("Attaching new split to ws\n");
+        con_attach(new, con, false);
+
+        if (old_focused)
+            con_focus(old_focused);
+
+        tree_flatten(croot);
+
+        return;
+    }
+
+    con->layout = layout;
+}
+
+/*
+ * Callback which will be called when removing a child from the given con.
+ * Kills the container if it is empty and replaces it with the child if there
+ * is exactly one child.
+ *
+ */
+static void con_on_remove_child(Con *con) {
+    DLOG("on_remove_child\n");
+
+    /* Every container 'above' (in the hierarchy) the workspace content should
+     * not be closed when the last child was removed */
+    if (con->type == CT_WORKSPACE ||
+        con->type == CT_OUTPUT ||
+        con->type == CT_ROOT ||
+        con->type == CT_DOCKAREA) {
+        DLOG("not handling, type = %d\n", con->type);
+        return;
+    }
+
+    /* TODO: check if this container would swallow any other client and
+     * don’t close it automatically. */
+    int children = con_num_children(con);
+    if (children == 0) {
+        DLOG("Container empty, closing\n");
+        tree_close(con, DONT_KILL_WINDOW, false);
+        return;
+    }
+}
+
+/*
+ * Determines the minimum size of the given con by looking at its children (for
+ * split/stacked/tabbed cons). Will be called when resizing floating cons
+ *
+ */
+Rect con_minimum_size(Con *con) {
+    DLOG("Determining minimum size for con %p\n", con);
+
+    if (con_is_leaf(con)) {
+        DLOG("leaf node, returning 75x50\n");
+        return (Rect){ 0, 0, 75, 50 };
+    }
+
+    if (con->type == CT_FLOATING_CON) {
+        DLOG("floating con\n");
+        Con *child = TAILQ_FIRST(&(con->nodes_head));
+        return con_minimum_size(child);
+    }
+
+    if (con->layout == L_STACKED || con->layout == L_TABBED) {
+        uint32_t max_width = 0, max_height = 0, deco_height = 0;
+        Con *child;
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+            Rect min = con_minimum_size(child);
+            deco_height += child->deco_rect.height;
+            max_width = max(max_width, min.width);
+            max_height = max(max_height, min.height);
+        }
+        DLOG("stacked/tabbed now, returning %d x %d + deco_rect = %d\n",
+             max_width, max_height, deco_height);
+        return (Rect){ 0, 0, max_width, max_height + deco_height };
+    }
+
+    /* For horizontal/vertical split containers we sum up the width (h-split)
+     * or height (v-split) and use the maximum of the height (h-split) or width
+     * (v-split) as minimum size. */
+    if (con->orientation == HORIZ || con->orientation == VERT) {
+        uint32_t width = 0, height = 0;
+        Con *child;
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+            Rect min = con_minimum_size(child);
+            if (con->orientation == HORIZ) {
+                width += min.width;
+                height = max(height, min.height);
+            } else {
+                height += min.height;
+                width = max(width, min.width);
+            }
+        }
+        DLOG("split container, returning width = %d x height = %d\n", width, height);
+        return (Rect){ 0, 0, width, height };
+    }
+
+    ELOG("Unhandled case, type = %d, layout = %d, orientation = %d\n",
+         con->type, con->layout, con->orientation);
+    assert(false);
+}
diff --git a/src/config.c b/src/config.c
new file mode 100644 (file)
index 0000000..9088e4c
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * src/config.c: Contains all functions handling the configuration file (calling
+ * the parser (src/cfgparse.y) with the correct path, switching key bindings
+ * mode).
+ *
+ */
+
+/* We need Xlib for XStringToKeysym */
+#include <X11/Xlib.h>
+
+#include "all.h"
+
+char *current_configpath = NULL;
+Config config;
+struct modes_head modes;
+
+/**
+ * Ungrabs all keys, to be called before re-grabbing the keys because of a
+ * mapping_notify event or a configuration file reload
+ *
+ */
+void ungrab_all_keys(xcb_connection_t *conn) {
+        DLOG("Ungrabbing all keys\n");
+        xcb_ungrab_key(conn, XCB_GRAB_ANY, root, XCB_BUTTON_MASK_ANY);
+}
+
+static void grab_keycode_for_binding(xcb_connection_t *conn, Binding *bind, uint32_t keycode) {
+        DLOG("Grabbing %d\n", keycode);
+        /* Grab the key in all combinations */
+        #define GRAB_KEY(modifier) \
+                do { \
+                        xcb_grab_key(conn, 0, root, modifier, keycode, \
+                                     XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC); \
+                } while (0)
+        int mods = bind->mods;
+        if ((bind->mods & BIND_MODE_SWITCH) != 0) {
+                mods &= ~BIND_MODE_SWITCH;
+                if (mods == 0)
+                        mods = XCB_MOD_MASK_ANY;
+        }
+        GRAB_KEY(mods);
+        GRAB_KEY(mods | xcb_numlock_mask);
+        GRAB_KEY(mods | xcb_numlock_mask | XCB_MOD_MASK_LOCK);
+}
+
+/*
+ * Returns a pointer to the Binding with the specified modifiers and keycode
+ * or NULL if no such binding exists.
+ *
+ */
+Binding *get_binding(uint16_t modifiers, xcb_keycode_t keycode) {
+        Binding *bind;
+
+        TAILQ_FOREACH(bind, bindings, bindings) {
+                /* First compare the modifiers */
+                if (bind->mods != modifiers)
+                        continue;
+
+                /* If a symbol was specified by the user, we need to look in
+                 * the array of translated keycodes for the event’s keycode */
+                if (bind->symbol != NULL) {
+                        if (memmem(bind->translated_to,
+                                   bind->number_keycodes * sizeof(xcb_keycode_t),
+                                   &keycode, sizeof(xcb_keycode_t)) != NULL)
+                                break;
+                } else {
+                        /* This case is easier: The user specified a keycode */
+                        if (bind->keycode == keycode)
+                                break;
+                }
+        }
+
+        return (bind == TAILQ_END(bindings) ? NULL : bind);
+}
+
+/*
+ * Translates keysymbols to keycodes for all bindings which use keysyms.
+ *
+ */
+void translate_keysyms() {
+        Binding *bind;
+        TAILQ_FOREACH(bind, bindings, bindings) {
+                if (bind->keycode > 0)
+                        continue;
+
+                /* We need to translate the symbol to a keycode */
+                xcb_keysym_t keysym = XStringToKeysym(bind->symbol);
+                if (keysym == NoSymbol) {
+                        ELOG("Could not translate string to key symbol: \"%s\"\n", bind->symbol);
+                        continue;
+                }
+
+                uint32_t last_keycode = 0;
+                xcb_keycode_t *keycodes = xcb_key_symbols_get_keycode(keysyms, keysym);
+                if (keycodes == NULL) {
+                        DLOG("Could not translate symbol \"%s\"\n", bind->symbol);
+                        continue;
+                }
+
+                bind->number_keycodes = 0;
+
+                for (xcb_keycode_t *walk = keycodes; *walk != 0; walk++) {
+                        /* We hope duplicate keycodes will be returned in order
+                         * and skip them */
+                        if (last_keycode == *walk)
+                                continue;
+                        last_keycode = *walk;
+                        bind->number_keycodes++;
+                }
+                DLOG("Translated symbol \"%s\" to %d keycode\n", bind->symbol, bind->number_keycodes);
+                bind->translated_to = smalloc(bind->number_keycodes * sizeof(xcb_keycode_t));
+                memcpy(bind->translated_to, keycodes, bind->number_keycodes * sizeof(xcb_keycode_t));
+                free(keycodes);
+        }
+}
+
+/*
+ * Grab the bound keys (tell X to send us keypress events for those keycodes)
+ *
+ */
+void grab_all_keys(xcb_connection_t *conn, bool bind_mode_switch) {
+        Binding *bind;
+        TAILQ_FOREACH(bind, bindings, bindings) {
+                if ((bind_mode_switch && (bind->mods & BIND_MODE_SWITCH) == 0) ||
+                    (!bind_mode_switch && (bind->mods & BIND_MODE_SWITCH) != 0))
+                        continue;
+
+                /* The easy case: the user specified a keycode directly. */
+                if (bind->keycode > 0) {
+                        grab_keycode_for_binding(conn, bind, bind->keycode);
+                        continue;
+                }
+
+                xcb_keycode_t *walk = bind->translated_to;
+                for (int i = 0; i < bind->number_keycodes; i++)
+                        grab_keycode_for_binding(conn, bind, *walk);
+        }
+}
+
+/*
+ * Switches the key bindings to the given mode, if the mode exists
+ *
+ */
+void switch_mode(const char *new_mode) {
+        struct Mode *mode;
+
+        LOG("Switching to mode %s\n", new_mode);
+
+        SLIST_FOREACH(mode, &modes, modes) {
+                if (strcasecmp(mode->name, new_mode) != 0)
+                        continue;
+
+                ungrab_all_keys(conn);
+                bindings = mode->bindings;
+                translate_keysyms();
+                grab_all_keys(conn, false);
+                return;
+        }
+
+        ELOG("ERROR: Mode not found\n");
+}
+
+/*
+ * Get the path of the first configuration file found. If override_configpath
+ * is specified, that path is returned and saved for further calls. Otherwise,
+ * checks the home directory first, then the system directory first, always
+ * taking into account the XDG Base Directory Specification ($XDG_CONFIG_HOME,
+ * $XDG_CONFIG_DIRS)
+ *
+ */
+static char *get_config_path(const char *override_configpath) {
+    char *xdg_config_home, *xdg_config_dirs, *config_path;
+
+    static const char *saved_configpath = NULL;
+
+    if (override_configpath != NULL) {
+        saved_configpath = override_configpath;
+        return sstrdup(saved_configpath);
+    }
+
+    if (saved_configpath != NULL)
+        return sstrdup(saved_configpath);
+
+    /* 1: check the traditional path under the home directory */
+    config_path = resolve_tilde("~/.i3/config");
+    if (path_exists(config_path))
+        return config_path;
+
+    /* 2: check for $XDG_CONFIG_HOME/i3/config */
+    if ((xdg_config_home = getenv("XDG_CONFIG_HOME")) == NULL)
+        xdg_config_home = "~/.config";
+
+    xdg_config_home = resolve_tilde(xdg_config_home);
+    if (asprintf(&config_path, "%s/i3/config", xdg_config_home) == -1)
+        die("asprintf() failed");
+    free(xdg_config_home);
+
+    if (path_exists(config_path))
+        return config_path;
+    free(config_path);
+
+    /* 3: check the traditional path under /etc */
+    config_path = SYSCONFDIR "/i3/config";
+    if (path_exists(config_path))
+        return sstrdup(config_path);
+
+    /* 4: check for $XDG_CONFIG_DIRS/i3/config */
+    if ((xdg_config_dirs = getenv("XDG_CONFIG_DIRS")) == NULL)
+        xdg_config_dirs = "/etc/xdg";
+
+    char *buf = sstrdup(xdg_config_dirs);
+    char *tok = strtok(buf, ":");
+    while (tok != NULL) {
+        tok = resolve_tilde(tok);
+        if (asprintf(&config_path, "%s/i3/config", tok) == -1)
+            die("asprintf() failed");
+        free(tok);
+        if (path_exists(config_path)) {
+            free(buf);
+            return config_path;
+        }
+        free(config_path);
+        tok = strtok(NULL, ":");
+    }
+    free(buf);
+
+    die("Unable to find the configuration file (looked at "
+            "~/.i3/config, $XDG_CONFIG_HOME/i3/config, "
+            SYSCONFDIR "i3/config and $XDG_CONFIG_DIRS/i3/config)");
+}
+
+/*
+ * Finds the configuration file to use (either the one specified by
+ * override_configpath), the user’s one or the system default) and calls
+ * parse_file().
+ *
+ */
+static void parse_configuration(const char *override_configpath) {
+    char *path = get_config_path(override_configpath);
+    DLOG("Parsing configfile %s\n", path);
+    FREE(current_configpath);
+    current_configpath = path;
+    parse_file(path);
+}
+
+/*
+ * (Re-)loads the configuration file (sets useful defaults before).
+ *
+ */
+void load_configuration(xcb_connection_t *conn, const char *override_configpath, bool reload) {
+        if (reload) {
+                /* First ungrab the keys */
+                ungrab_all_keys(conn);
+
+                struct Mode *mode;
+                Binding *bind;
+                while (!SLIST_EMPTY(&modes)) {
+                        mode = SLIST_FIRST(&modes);
+                        FREE(mode->name);
+
+                        /* Clear the old binding list */
+                        bindings = mode->bindings;
+                        while (!TAILQ_EMPTY(bindings)) {
+                                bind = TAILQ_FIRST(bindings);
+                                TAILQ_REMOVE(bindings, bind, bindings);
+                                FREE(bind->translated_to);
+                                FREE(bind->command);
+                                FREE(bind);
+                        }
+                        FREE(bindings);
+                        SLIST_REMOVE(&modes, mode, Mode, modes);
+                }
+
+#if 0
+                struct Assignment *assign;
+                while (!TAILQ_EMPTY(&assignments)) {
+                        assign = TAILQ_FIRST(&assignments);
+                        FREE(assign->windowclass_title);
+                        TAILQ_REMOVE(&assignments, assign, assignments);
+                        FREE(assign);
+                }
+#endif
+
+                /* Clear workspace names */
+#if 0
+                Workspace *ws;
+                TAILQ_FOREACH(ws, workspaces, workspaces)
+                        workspace_set_name(ws, NULL);
+#endif
+        }
+
+        SLIST_INIT(&modes);
+
+        struct Mode *default_mode = scalloc(sizeof(struct Mode));
+        default_mode->name = sstrdup("default");
+        default_mode->bindings = scalloc(sizeof(struct bindings_head));
+        TAILQ_INIT(default_mode->bindings);
+        SLIST_INSERT_HEAD(&modes, default_mode, modes);
+
+        bindings = default_mode->bindings;
+
+#define REQUIRED_OPTION(name) \
+        if (config.name == NULL) \
+                die("You did not specify required configuration option " #name "\n");
+
+        /* Clear the old config or initialize the data structure */
+        memset(&config, 0, sizeof(config));
+
+        /* Initialize default colors */
+#define INIT_COLOR(x, cborder, cbackground, ctext) \
+        do { \
+                x.border = get_colorpixel(cborder); \
+                x.background = get_colorpixel(cbackground); \
+                x.text = get_colorpixel(ctext); \
+        } while (0)
+
+        config.client.background = get_colorpixel("#000000");
+        INIT_COLOR(config.client.focused, "#4c7899", "#285577", "#ffffff");
+        INIT_COLOR(config.client.focused_inactive, "#333333", "#5f676a", "#ffffff");
+        INIT_COLOR(config.client.unfocused, "#333333", "#222222", "#888888");
+        INIT_COLOR(config.client.urgent, "#2f343a", "#900000", "#ffffff");
+        INIT_COLOR(config.bar.focused, "#4c7899", "#285577", "#ffffff");
+        INIT_COLOR(config.bar.unfocused, "#333333", "#222222", "#888888");
+        INIT_COLOR(config.bar.urgent, "#2f343a", "#900000", "#ffffff");
+
+        config.default_border = BS_NORMAL;
+        /* Set default_orientation to NO_ORIENTATION for auto orientation. */
+        config.default_orientation = NO_ORIENTATION;
+
+        parse_configuration(override_configpath);
+
+        if (reload) {
+                translate_keysyms();
+                grab_all_keys(conn, false);
+        }
+
+        if (config.font.id == 0) {
+                ELOG("You did not specify required configuration option \"font\"\n");
+                config.font = load_font("fixed", true);
+        }
+
+#if 0
+        /* Set an empty name for every workspace which got no name */
+        Workspace *ws;
+        TAILQ_FOREACH(ws, workspaces, workspaces) {
+                if (ws->name != NULL) {
+                        /* If the font was not specified when the workspace name
+                         * was loaded, we need to predict the text width now */
+                        if (ws->text_width == 0)
+                                ws->text_width = predict_text_width(global_conn,
+                                                config.font, ws->name, ws->name_len);
+                        continue;
+                }
+
+                workspace_set_name(ws, NULL);
+        }
+#endif
+}
diff --git a/src/debug.c b/src/debug.c
new file mode 100644 (file)
index 0000000..1e0f828
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * debug.c: Contains debugging functions, especially FormatEvent, which prints unhandled events.
+ *          This code is from xcb-util.
+ *
+ */
+#include <stdio.h>
+#include <xcb/xcb.h>
+
+#include "log.h"
+
+static const char *labelError[] = {
+    "Success",
+    "BadRequest",
+    "BadValue",
+    "BadWindow",
+    "BadPixmap",
+    "BadAtom",
+    "BadCursor",
+    "BadFont",
+    "BadMatch",
+    "BadDrawable",
+    "BadAccess",
+    "BadAlloc",
+    "BadColor",
+    "BadGC",
+    "BadIDChoice",
+    "BadName",
+    "BadLength",
+    "BadImplementation",
+};
+
+static const char *labelRequest[] = {
+    "no request",
+    "CreateWindow",
+    "ChangeWindowAttributes",
+    "GetWindowAttributes",
+    "DestroyWindow",
+    "DestroySubwindows",
+    "ChangeSaveSet",
+    "ReparentWindow",
+    "MapWindow",
+    "MapSubwindows",
+    "UnmapWindow",
+    "UnmapSubwindows",
+    "ConfigureWindow",
+    "CirculateWindow",
+    "GetGeometry",
+    "QueryTree",
+    "InternAtom",
+    "GetAtomName",
+    "ChangeProperty",
+    "DeleteProperty",
+    "GetProperty",
+    "ListProperties",
+    "SetSelectionOwner",
+    "GetSelectionOwner",
+    "ConvertSelection",
+    "SendEvent",
+    "GrabPointer",
+    "UngrabPointer",
+    "GrabButton",
+    "UngrabButton",
+    "ChangeActivePointerGrab",
+    "GrabKeyboard",
+    "UngrabKeyboard",
+    "GrabKey",
+    "UngrabKey",
+    "AllowEvents",
+    "GrabServer",
+    "UngrabServer",
+    "QueryPointer",
+    "GetMotionEvents",
+    "TranslateCoords",
+    "WarpPointer",
+    "SetInputFocus",
+    "GetInputFocus",
+    "QueryKeymap",
+    "OpenFont",
+    "CloseFont",
+    "QueryFont",
+    "QueryTextExtents",
+    "ListFonts",
+    "ListFontsWithInfo",
+    "SetFontPath",
+    "GetFontPath",
+    "CreatePixmap",
+    "FreePixmap",
+    "CreateGC",
+    "ChangeGC",
+    "CopyGC",
+    "SetDashes",
+    "SetClipRectangles",
+    "FreeGC",
+    "ClearArea",
+    "CopyArea",
+    "CopyPlane",
+    "PolyPoint",
+    "PolyLine",
+    "PolySegment",
+    "PolyRectangle",
+    "PolyArc",
+    "FillPoly",
+    "PolyFillRectangle",
+    "PolyFillArc",
+    "PutImage",
+    "GetImage",
+    "PolyText",
+    "PolyText",
+    "ImageText",
+    "ImageText",
+    "CreateColormap",
+    "FreeColormap",
+    "CopyColormapAndFree",
+    "InstallColormap",
+    "UninstallColormap",
+    "ListInstalledColormaps",
+    "AllocColor",
+    "AllocNamedColor",
+    "AllocColorCells",
+    "AllocColorPlanes",
+    "FreeColors",
+    "StoreColors",
+    "StoreNamedColor",
+    "QueryColors",
+    "LookupColor",
+    "CreateCursor",
+    "CreateGlyphCursor",
+    "FreeCursor",
+    "RecolorCursor",
+    "QueryBestSize",
+    "QueryExtension",
+    "ListExtensions",
+    "ChangeKeyboardMapping",
+    "GetKeyboardMapping",
+    "ChangeKeyboardControl",
+    "GetKeyboardControl",
+    "Bell",
+    "ChangePointerControl",
+    "GetPointerControl",
+    "SetScreenSaver",
+    "GetScreenSaver",
+    "ChangeHosts",
+    "ListHosts",
+    "SetAccessControl",
+    "SetCloseDownMode",
+    "KillClient",
+    "RotateProperties",
+    "ForceScreenSaver",
+    "SetPointerMapping",
+    "GetPointerMapping",
+    "SetModifierMapping",
+    "GetModifierMapping",
+    "major 120",
+    "major 121",
+    "major 122",
+    "major 123",
+    "major 124",
+    "major 125",
+    "major 126",
+    "NoOperation",
+};
+
+static const char *labelEvent[] = {
+    "error",
+    "reply",
+    "KeyPress",
+    "KeyRelease",
+    "ButtonPress",
+    "ButtonRelease",
+    "MotionNotify",
+    "EnterNotify",
+    "LeaveNotify",
+    "FocusIn",
+    "FocusOut",
+    "KeymapNotify",
+    "Expose",
+    "GraphicsExpose",
+    "NoExpose",
+    "VisibilityNotify",
+    "CreateNotify",
+    "DestroyNotify",
+    "UnmapNotify",
+    "MapNotify",
+    "MapRequest",
+    "ReparentNotify",
+    "ConfigureNotify",
+    "ConfigureRequest",
+    "GravityNotify",
+    "ResizeRequest",
+    "CirculateNotify",
+    "CirculateRequest",
+    "PropertyNotify",
+    "SelectionClear",
+    "SelectionRequest",
+    "SelectionNotify",
+    "ColormapNotify",
+    "ClientMessage",
+    "MappingNotify",
+};
+
+static const char *labelSendEvent[] = {
+    "",
+    " (from SendEvent)",
+};
+
+int format_event(xcb_generic_event_t *e) {
+    uint8_t sendEvent;
+    uint16_t seqnum;
+
+    sendEvent = (e->response_type & 0x80) ? 1 : 0;
+    e->response_type &= ~0x80;
+    seqnum = *((uint16_t *) e + 1);
+
+    switch(e->response_type) {
+    case 0:
+        DLOG("Error %s on seqnum %d (%s).\n",
+            labelError[*((uint8_t *) e + 1)],
+            seqnum,
+            labelRequest[*((uint8_t *) e + 10)]);
+        break;
+    default:
+        if (e->response_type > sizeof(labelEvent) / sizeof(char*))
+                break;
+        DLOG("Event %s following seqnum %d%s.\n",
+            labelEvent[e->response_type],
+            seqnum,
+            labelSendEvent[sendEvent]);
+        break;
+    case XCB_KEYMAP_NOTIFY:
+        DLOG("Event %s%s.\n",
+            labelEvent[e->response_type],
+            labelSendEvent[sendEvent]);
+        break;
+    }
+
+    fflush(stdout);
+    return 1;
+}
diff --git a/src/ewmh.c b/src/ewmh.c
new file mode 100644 (file)
index 0000000..7b2cc3e
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * ewmh.c: Functions to get/set certain EWMH properties easily.
+ *
+ */
+
+#include "all.h"
+
+/*
+ * Updates _NET_CURRENT_DESKTOP with the current desktop number.
+ *
+ * EWMH: The index of the current desktop. This is always an integer between 0
+ * and _NET_NUMBER_OF_DESKTOPS - 1.
+ *
+ */
+void ewmh_update_current_desktop() {
+    Con *focused_ws = con_get_workspace(focused);
+    Con *output;
+    uint32_t idx = 0;
+    /* We count to get the index of this workspace because named workspaces
+     * don’t have the ->num property */
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
+        Con *ws;
+        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
+            if (ws == focused_ws) {
+                xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
+                        A__NET_CURRENT_DESKTOP, A_CARDINAL, 32, 1, &idx);
+                return;
+            }
+            ++idx;
+        }
+    }
+}
+
+/*
+ * Updates _NET_ACTIVE_WINDOW with the currently focused window.
+ *
+ * EWMH: The window ID of the currently active window or None if no window has
+ * the focus.
+ *
+ */
+void ewmh_update_active_window(xcb_window_t window) {
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
+            A__NET_ACTIVE_WINDOW, A_WINDOW, 32, 1, &window);
+}
+
+/*
+ * Updates the workarea for each desktop.
+ *
+ * EWMH: Contains a geometry for each desktop. These geometries specify an area
+ * that is completely contained within the viewport. Work area SHOULD be used by
+ * desktop applications to place desktop icons appropriately.
+ *
+ */
+void ewmh_update_workarea() {
+    int num_workspaces = 0, count = 0;
+    Rect last_rect = {0, 0, 0, 0};
+    Con *output;
+
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
+        Con *ws;
+        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
+            /* Check if we need to initialize last_rect. The case that the
+             * first workspace is all-zero may happen when the user
+             * assigned workspace 2 for his first screen, for example. Thus
+             * we need an initialized last_rect in the very first run of
+             * the following loop. */
+            if (last_rect.width == 0 && last_rect.height == 0 &&
+                    ws->rect.width != 0 && ws->rect.height != 0) {
+                memcpy(&last_rect, &(ws->rect), sizeof(Rect));
+            }
+            num_workspaces++;
+        }
+    }
+
+    DLOG("Got %d workspaces\n", num_workspaces);
+    uint8_t *workarea = smalloc(sizeof(Rect) * num_workspaces);
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
+        Con *ws;
+        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
+            DLOG("storing %d: %dx%d with %d x %d\n", count, ws->rect.x,
+                 ws->rect.y, ws->rect.width, ws->rect.height);
+            /* If a workspace is not yet initialized and thus its
+             * dimensions are zero, we will instead put the dimensions
+             * of the last workspace in the list. For example firefox
+             * intersects all workspaces and does not cope so well with
+             * an all-zero workspace. */
+            if (ws->rect.width == 0 || ws->rect.height == 0) {
+                DLOG("re-using last_rect (%dx%d, %d, %d)\n",
+                     last_rect.x, last_rect.y, last_rect.width,
+                     last_rect.height);
+                memcpy(workarea + (sizeof(Rect) * count++), &last_rect, sizeof(Rect));
+                continue;
+            }
+            memcpy(workarea + (sizeof(Rect) * count++), &(ws->rect), sizeof(Rect));
+            memcpy(&last_rect, &(ws->rect), sizeof(Rect));
+        }
+    }
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
+            A__NET_WORKAREA, A_CARDINAL, 32,
+            num_workspaces * (sizeof(Rect) / sizeof(uint32_t)),
+            workarea);
+    free(workarea);
+    xcb_flush(conn);
+}
diff --git a/src/floating.c b/src/floating.c
new file mode 100644 (file)
index 0000000..f13476d
--- /dev/null
@@ -0,0 +1,589 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * src/floating.c: contains all functions for handling floating clients
+ *
+ */
+
+
+#include "all.h"
+
+extern xcb_connection_t *conn;
+
+void floating_enable(Con *con, bool automatic) {
+    bool set_focus = true;
+
+    if (con_is_floating(con)) {
+        LOG("Container is already in floating mode, not doing anything.\n");
+        return;
+    }
+
+    /* 1: If the container is a workspace container, we need to create a new
+     * split-container with the same orientation and make that one floating. We
+     * cannot touch the workspace container itself because floating containers
+     * are children of the workspace. */
+    if (con->type == CT_WORKSPACE) {
+        LOG("This is a workspace, creating new container around content\n");
+        if (con_num_children(con) == 0) {
+            LOG("Workspace is empty, aborting\n");
+            return;
+        }
+        /* TODO: refactor this with src/con.c:con_set_layout */
+        Con *new = con_new(NULL, NULL);
+        new->parent = con;
+        new->orientation = con->orientation;
+
+        /* since the new container will be set into floating mode directly
+         * afterwards, we need to copy the workspace rect. */
+        memcpy(&(new->rect), &(con->rect), sizeof(Rect));
+
+        Con *old_focused = TAILQ_FIRST(&(con->focus_head));
+        if (old_focused == TAILQ_END(&(con->focus_head)))
+            old_focused = NULL;
+
+        /* 4: move the existing cons of this workspace below the new con */
+        DLOG("Moving cons\n");
+        Con *child;
+        while (!TAILQ_EMPTY(&(con->nodes_head))) {
+            child = TAILQ_FIRST(&(con->nodes_head));
+            con_detach(child);
+            con_attach(child, new, true);
+        }
+
+        /* 4: attach the new split container to the workspace */
+        DLOG("Attaching new split to ws\n");
+        con_attach(new, con, false);
+
+        if (old_focused)
+            con_focus(old_focused);
+
+        con = new;
+        set_focus = false;
+    }
+
+    /* 1: detach the container from its parent */
+    /* TODO: refactor this with tree_close() */
+    TAILQ_REMOVE(&(con->parent->nodes_head), con, nodes);
+    TAILQ_REMOVE(&(con->parent->focus_head), con, focused);
+
+    con_fix_percent(con->parent);
+
+    /* 2: create a new container to render the decoration on, add
+     * it as a floating window to the workspace */
+    Con *nc = con_new(NULL, NULL);
+    /* we need to set the parent afterwards instead of passing it as an
+     * argument to con_new() because nc would be inserted into the tiling layer
+     * otherwise. */
+    nc->parent = con_get_workspace(con);
+
+    /* check if the parent container is empty and close it if so */
+    if ((con->parent->type == CT_CON || con->parent->type == CT_FLOATING_CON) && con_num_children(con->parent) == 0) {
+        DLOG("Old container empty after setting this child to floating, closing\n");
+        tree_close(con->parent, DONT_KILL_WINDOW, false);
+    }
+
+    char *name;
+    asprintf(&name, "[i3 con] floatingcon around %p", con);
+    x_set_name(nc, name);
+    free(name);
+
+    /* find the height for the decorations */
+    int deco_height = config.font.height + 5;
+
+    DLOG("Original rect: (%d, %d) with %d x %d\n", con->rect.x, con->rect.y, con->rect.width, con->rect.height);
+    Rect zero = { 0, 0, 0, 0 };
+    nc->rect = con->geometry;
+    /* If the geometry was not set (split containers), we need to determine a
+     * sensible one by combining the geometry of all children */
+    if (memcmp(&(nc->rect), &zero, sizeof(Rect)) == 0) {
+        DLOG("Geometry not set, combining children\n");
+        Con *child;
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+            DLOG("child geometry: %d x %d\n", child->geometry.width, child->geometry.height);
+            nc->rect.width += child->geometry.width;
+            nc->rect.height = max(nc->rect.height, child->geometry.height);
+        }
+    }
+    /* Raise the width/height to at least 75x50 (minimum size for windows) */
+    nc->rect.width = max(nc->rect.width, 75);
+    nc->rect.height = max(nc->rect.height, 50);
+    /* add pixels for the decoration */
+    /* TODO: don’t add them when the user automatically puts new windows into
+     * 1pixel/borderless mode */
+    nc->rect.height += deco_height + 4;
+    nc->rect.width += 4;
+    DLOG("Floating rect: (%d, %d) with %d x %d\n", nc->rect.x, nc->rect.y, nc->rect.width, nc->rect.height);
+    nc->orientation = NO_ORIENTATION;
+    nc->type = CT_FLOATING_CON;
+    TAILQ_INSERT_TAIL(&(nc->parent->floating_head), nc, floating_windows);
+    TAILQ_INSERT_TAIL(&(nc->parent->focus_head), nc, focused);
+
+    /* 3: attach the child to the new parent container */
+    con->parent = nc;
+    con->percent = 1.0;
+    con->floating = FLOATING_USER_ON;
+
+    /* Some clients (like GIMP’s color picker window) get mapped
+     * to (0, 0), so we push them to a reasonable position
+     * (centered over their leader) */
+    if (nc->rect.x == 0 && nc->rect.y == 0) {
+        Con *leader;
+        if (con->window && con->window->leader != XCB_NONE &&
+            (leader = con_by_window_id(con->window->leader)) != NULL) {
+            DLOG("Centering above leader\n");
+            nc->rect.x = leader->rect.x + (leader->rect.width / 2) - (nc->rect.width / 2);
+            nc->rect.y = leader->rect.y + (leader->rect.height / 2) - (nc->rect.height / 2);
+        } else {
+            /* center the window on workspace as fallback */
+            Con *ws = nc->parent;
+            nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
+            nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
+        }
+    }
+
+    TAILQ_INSERT_TAIL(&(nc->nodes_head), con, nodes);
+    TAILQ_INSERT_TAIL(&(nc->focus_head), con, focused);
+
+    /* render the cons to get initial window_rect correct */
+    render_con(nc, false);
+    render_con(con, false);
+
+    // TODO: don’t influence focus handling when Con was not focused before.
+    if (set_focus)
+        con_focus(con);
+
+    /* Check if we need to re-assign it to a different workspace because of its
+     * coordinates and exit if that was done successfully. */
+    if (floating_maybe_reassign_ws(nc))
+        return;
+
+    /* Sanitize coordinates: Check if they are on any output */
+    if (get_output_containing(nc->rect.x, nc->rect.y) != NULL)
+        return;
+
+    ELOG("No output found at destination coordinates, centering floating window on current ws\n");
+    Con *ws = nc->parent;
+    nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
+    nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
+}
+
+void floating_disable(Con *con, bool automatic) {
+    if (!con_is_floating(con)) {
+        LOG("Container isn't floating, not doing anything.\n");
+        return;
+    }
+
+    Con *ws = con_get_workspace(con);
+
+    /* 1: detach from parent container */
+    TAILQ_REMOVE(&(con->parent->nodes_head), con, nodes);
+    TAILQ_REMOVE(&(con->parent->focus_head), con, focused);
+
+    /* 2: kill parent container */
+    TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows);
+    TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused);
+    tree_close(con->parent, DONT_KILL_WINDOW, false);
+
+    /* 3: re-attach to the parent of the currently focused con on the workspace
+     * this floating con was on */
+    Con *focused = con_descend_tiling_focused(ws);
+
+    /* if there is no other container on this workspace, focused will be the
+     * workspace itself */
+    if (focused->type == CT_WORKSPACE)
+        con->parent = focused;
+    else con->parent = focused->parent;
+
+    /* con_fix_percent will adjust the percent value */
+    con->percent = 0.0;
+
+    TAILQ_INSERT_TAIL(&(con->parent->nodes_head), con, nodes);
+    TAILQ_INSERT_TAIL(&(con->parent->focus_head), con, focused);
+
+    con->floating = FLOATING_USER_OFF;
+
+    con_fix_percent(con->parent);
+    // TODO: don’t influence focus handling when Con was not focused before.
+    con_focus(con);
+}
+
+/*
+ * Toggles floating mode for the given container.
+ *
+ * If the automatic flag is set to true, this was an automatic update by a change of the
+ * window class from the application which can be overwritten by the user.
+ *
+ */
+void toggle_floating_mode(Con *con, bool automatic) {
+    /* see if the client is already floating */
+    if (con_is_floating(con)) {
+        LOG("already floating, re-setting to tiling\n");
+
+        floating_disable(con, automatic);
+        return;
+    }
+
+    floating_enable(con, automatic);
+}
+
+/*
+ * Raises the given container in the list of floating containers
+ *
+ */
+void floating_raise_con(Con *con) {
+    DLOG("Raising floating con %p / %s\n", con, con->name);
+    TAILQ_REMOVE(&(con->parent->floating_head), con, floating_windows);
+    TAILQ_INSERT_TAIL(&(con->parent->floating_head), con, floating_windows);
+}
+
+/*
+ * Checks if con’s coordinates are within its workspace and re-assigns it to
+ * the actual workspace if not.
+ *
+ */
+bool floating_maybe_reassign_ws(Con *con) {
+    Output *output = get_output_containing(
+        con->rect.x + (con->rect.width / 2),
+        con->rect.y + (con->rect.height / 2));
+
+    if (!output) {
+        ELOG("No output found at destination coordinates?\n");
+        return false;
+    }
+
+    if (con_get_output(con) == output->con) {
+        DLOG("still the same ws\n");
+        return false;
+    }
+
+    DLOG("Need to re-assign!\n");
+
+    Con *content = output_get_content(output->con);
+    Con *ws = TAILQ_FIRST(&(content->focus_head));
+    DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name);
+    con_move_to_workspace(con, ws);
+    con_focus(con_descend_focused(con));
+    return true;
+}
+
+DRAGGING_CB(drag_window_callback) {
+    struct xcb_button_press_event_t *event = extra;
+
+    /* Reposition the client correctly while moving */
+    con->rect.x = old_rect->x + (new_x - event->root_x);
+    con->rect.y = old_rect->y + (new_y - event->root_y);
+
+    render_con(con, false);
+    x_push_node(con);
+    xcb_flush(conn);
+
+    /* Check if we cross workspace boundaries while moving */
+    if (!floating_maybe_reassign_ws(con))
+        return;
+    tree_render();
+}
+
+/*
+ * Called when the user clicked on the titlebar of a floating window.
+ * Calls the drag_pointer function with the drag_window callback
+ *
+ */
+void floating_drag_window(Con *con, xcb_button_press_event_t *event) {
+    DLOG("floating_drag_window\n");
+
+    drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, drag_window_callback, event);
+    tree_render();
+}
+
+/*
+ * This is an ugly data structure which we need because there is no standard
+ * way of having nested functions (only available as a gcc extension at the
+ * moment, clang doesn’t support it) or blocks (only available as a clang
+ * extension and only on Mac OS X systems at the moment).
+ *
+ */
+struct resize_window_callback_params {
+    border_t corner;
+    bool proportional;
+    xcb_button_press_event_t *event;
+};
+
+DRAGGING_CB(resize_window_callback) {
+    struct resize_window_callback_params *params = extra;
+    xcb_button_press_event_t *event = params->event;
+    border_t corner = params->corner;
+
+    int32_t dest_x = con->rect.x;
+    int32_t dest_y = con->rect.y;
+    uint32_t dest_width;
+    uint32_t dest_height;
+
+    double ratio = (double) old_rect->width / old_rect->height;
+
+    /* First guess: We resize by exactly the amount the mouse moved,
+     * taking into account in which corner the client was grabbed */
+    if (corner & BORDER_LEFT)
+        dest_width = old_rect->width - (new_x - event->root_x);
+    else dest_width = old_rect->width + (new_x - event->root_x);
+
+    if (corner & BORDER_TOP)
+        dest_height = old_rect->height - (new_y - event->root_y);
+    else dest_height = old_rect->height + (new_y - event->root_y);
+
+    /* Obey minimum window size */
+    Rect minimum = con_minimum_size(con);
+    dest_width = max(dest_width, minimum.width);
+    dest_height = max(dest_height, minimum.height);
+
+    /* User wants to keep proportions, so we may have to adjust our values */
+    if (params->proportional) {
+        dest_width = max(dest_width, (int) (dest_height * ratio));
+        dest_height = max(dest_height, (int) (dest_width / ratio));
+    }
+
+    /* If not the lower right corner is grabbed, we must also reposition
+     * the client by exactly the amount we resized it */
+    if (corner & BORDER_LEFT)
+        dest_x = old_rect->x + (old_rect->width - dest_width);
+
+    if (corner & BORDER_TOP)
+        dest_y = old_rect->y + (old_rect->height - dest_height);
+
+    con->rect = (Rect) { dest_x, dest_y, dest_width, dest_height };
+
+    /* TODO: don’t re-render the whole tree just because we change
+     * coordinates of a floating window */
+    tree_render();
+    x_push_changes(croot);
+}
+
+/*
+ * Called when the user clicked on a floating window while holding the
+ * floating_modifier and the right mouse button.
+ * Calls the drag_pointer function with the resize_window callback
+ *
+ */
+void floating_resize_window(Con *con, bool proportional,
+                            xcb_button_press_event_t *event) {
+    DLOG("floating_resize_window\n");
+
+    /* corner saves the nearest corner to the original click. It contains
+     * a bitmask of the nearest borders (BORDER_LEFT, BORDER_RIGHT, …) */
+    border_t corner = 0;
+
+    if (event->event_x <= (con->rect.width / 2))
+        corner |= BORDER_LEFT;
+    else corner |= BORDER_RIGHT;
+
+    if (event->event_y <= (con->rect.height / 2))
+        corner |= BORDER_TOP;
+    else corner |= BORDER_BOTTOM;
+
+    struct resize_window_callback_params params = { corner, proportional, event };
+
+    drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, resize_window_callback, &params);
+}
+
+/*
+ * This function grabs your pointer and lets you drag stuff around (borders).
+ * Every time you move your mouse, an XCB_MOTION_NOTIFY event will be received
+ * and the given callback will be called with the parameters specified (client,
+ * border on which the click originally was), the original rect of the client,
+ * the event and the new coordinates (x, y).
+ *
+ */
+void drag_pointer(Con *con, xcb_button_press_event_t *event, xcb_window_t
+                confine_to, border_t border, callback_t callback, void *extra)
+{
+    uint32_t new_x, new_y;
+    Rect old_rect;
+    if (con != NULL)
+        memcpy(&old_rect, &(con->rect), sizeof(Rect));
+
+    /* Grab the pointer */
+    xcb_grab_pointer_cookie_t cookie;
+    xcb_grab_pointer_reply_t *reply;
+    cookie = xcb_grab_pointer(conn,
+        false,               /* get all pointer events specified by the following mask */
+        root,                /* grab the root window */
+        XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_POINTER_MOTION, /* which events to let through */
+        XCB_GRAB_MODE_ASYNC, /* pointer events should continue as normal */
+        XCB_GRAB_MODE_ASYNC, /* keyboard mode */
+        confine_to,          /* confine_to = in which window should the cursor stay */
+        XCB_NONE,            /* don’t display a special cursor */
+        XCB_CURRENT_TIME);
+
+    if ((reply = xcb_grab_pointer_reply(conn, cookie, NULL)) == NULL) {
+        ELOG("Could not grab pointer\n");
+        return;
+    }
+
+    free(reply);
+
+    /* Go into our own event loop */
+    xcb_flush(conn);
+
+    xcb_generic_event_t *inside_event, *last_motion_notify = NULL;
+    bool loop_done = false;
+    /* I’ve always wanted to have my own eventhandler… */
+    while (!loop_done && (inside_event = xcb_wait_for_event(conn))) {
+        /* We now handle all events we can get using xcb_poll_for_event */
+        do {
+            /* skip x11 errors */
+            if (inside_event->response_type == 0) {
+                free(inside_event);
+                continue;
+            }
+            /* Strip off the highest bit (set if the event is generated) */
+            int type = (inside_event->response_type & 0x7F);
+
+            switch (type) {
+                case XCB_BUTTON_RELEASE:
+                    loop_done = true;
+                    break;
+
+                case XCB_MOTION_NOTIFY:
+                    /* motion_notify events are saved for later */
+                    FREE(last_motion_notify);
+                    last_motion_notify = inside_event;
+                    break;
+
+                case XCB_UNMAP_NOTIFY:
+                case XCB_KEY_PRESS:
+                case XCB_KEY_RELEASE:
+                    DLOG("Unmap-notify, aborting\n");
+                    handle_event(type, inside_event);
+                    loop_done = true;
+                    break;
+
+                default:
+                    DLOG("Passing to original handler\n");
+                    /* Use original handler */
+                    handle_event(type, inside_event);
+                    break;
+            }
+            if (last_motion_notify != inside_event)
+                free(inside_event);
+        } while ((inside_event = xcb_poll_for_event(conn)) != NULL);
+
+        if (last_motion_notify == NULL)
+            continue;
+
+        new_x = ((xcb_motion_notify_event_t*)last_motion_notify)->root_x;
+        new_y = ((xcb_motion_notify_event_t*)last_motion_notify)->root_y;
+
+        callback(con, &old_rect, new_x, new_y, extra);
+        FREE(last_motion_notify);
+    }
+
+    xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
+    xcb_flush(conn);
+}
+
+#if 0
+/*
+ * Changes focus in the given direction for floating clients.
+ *
+ * Changing to the left/right means going to the previous/next floating client,
+ * changing to top/bottom means cycling through the Z-index.
+ *
+ */
+void floating_focus_direction(xcb_connection_t *conn, Client *currently_focused, direction_t direction) {
+        DLOG("floating focus\n");
+
+        if (direction == D_LEFT || direction == D_RIGHT) {
+                /* Go to the next/previous floating client */
+                Client *client;
+
+                while ((client = (direction == D_LEFT ? TAILQ_PREV(currently_focused, floating_clients_head, floating_clients) :
+                                                        TAILQ_NEXT(currently_focused, floating_clients))) !=
+                       TAILQ_END(&(currently_focused->workspace->floating_clients))) {
+                        if (!client->floating)
+                                continue;
+                        set_focus(conn, client, true);
+                        return;
+                }
+        }
+}
+
+/*
+ * Moves the client 10px to the specified direction.
+ *
+ */
+void floating_move(xcb_connection_t *conn, Client *currently_focused, direction_t direction) {
+        DLOG("floating move\n");
+
+        Rect destination = currently_focused->rect;
+        Rect *screen = &(currently_focused->workspace->output->rect);
+
+        switch (direction) {
+                case D_LEFT:
+                        destination.x -= 10;
+                        break;
+                case D_RIGHT:
+                        destination.x += 10;
+                        break;
+                case D_UP:
+                        destination.y -= 10;
+                        break;
+                case D_DOWN:
+                        destination.y += 10;
+                        break;
+                /* to make static analyzers happy */
+                default:
+                        break;
+        }
+
+        /* Prevent windows from vanishing completely */
+        if ((int32_t)(destination.x + destination.width - 5) <= (int32_t)screen->x ||
+            (int32_t)(destination.x + 5) >= (int32_t)(screen->x + screen->width) ||
+            (int32_t)(destination.y + destination.height - 5) <= (int32_t)screen->y ||
+            (int32_t)(destination.y + 5) >= (int32_t)(screen->y + screen->height)) {
+                DLOG("boundary check failed, not moving\n");
+                return;
+        }
+
+        currently_focused->rect = destination;
+        reposition_client(conn, currently_focused);
+
+        /* Because reposition_client does not send a faked configure event (only resize does),
+         * we need to initiate that on our own */
+        fake_absolute_configure_notify(conn, currently_focused);
+        /* fake_absolute_configure_notify flushes */
+}
+
+/*
+ * Hides all floating clients (or show them if they are currently hidden) on
+ * the specified workspace.
+ *
+ */
+void floating_toggle_hide(xcb_connection_t *conn, Workspace *workspace) {
+        Client *client;
+
+        workspace->floating_hidden = !workspace->floating_hidden;
+        DLOG("floating_hidden is now: %d\n", workspace->floating_hidden);
+        TAILQ_FOREACH(client, &(workspace->floating_clients), floating_clients) {
+                if (workspace->floating_hidden)
+                        client_unmap(conn, client);
+                else client_map(conn, client);
+        }
+
+        /* If we just unmapped all floating windows we should ensure that the focus
+         * is set correctly, that ist, to the first non-floating client in stack */
+        if (workspace->floating_hidden)
+                SLIST_FOREACH(client, &(workspace->focus_stack), focus_clients) {
+                        if (client_is_floating(client))
+                                continue;
+                        set_focus(conn, client, true);
+                        return;
+                }
+
+        xcb_flush(conn);
+}
+#endif
diff --git a/src/handlers.c b/src/handlers.c
new file mode 100644 (file)
index 0000000..0fd7dbb
--- /dev/null
@@ -0,0 +1,1075 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ */
+#include <time.h>
+#include <limits.h>
+
+#include <xcb/randr.h>
+
+#include <X11/XKBlib.h>
+
+#include "all.h"
+
+int randr_base = -1;
+
+/* After mapping/unmapping windows, a notify event is generated. However, we don’t want it,
+   since it’d trigger an infinite loop of switching between the different windows when
+   changing workspaces */
+static SLIST_HEAD(ignore_head, Ignore_Event) ignore_events;
+
+/*
+ * Adds the given sequence to the list of events which are ignored.
+ * If this ignore should only affect a specific response_type, pass
+ * response_type, otherwise, pass -1.
+ *
+ * Every ignored sequence number gets garbage collected after 5 seconds.
+ *
+ */
+void add_ignore_event(const int sequence, const int response_type) {
+    struct Ignore_Event *event = smalloc(sizeof(struct Ignore_Event));
+
+    event->sequence = sequence;
+    event->response_type = response_type;
+    event->added = time(NULL);
+
+    SLIST_INSERT_HEAD(&ignore_events, event, ignore_events);
+}
+
+/*
+ * Checks if the given sequence is ignored and returns true if so.
+ *
+ */
+bool event_is_ignored(const int sequence, const int response_type) {
+    struct Ignore_Event *event;
+    time_t now = time(NULL);
+    for (event = SLIST_FIRST(&ignore_events); event != SLIST_END(&ignore_events);) {
+        if ((now - event->added) > 5) {
+            struct Ignore_Event *save = event;
+            event = SLIST_NEXT(event, ignore_events);
+            SLIST_REMOVE(&ignore_events, save, Ignore_Event, ignore_events);
+            free(save);
+        } else event = SLIST_NEXT(event, ignore_events);
+    }
+
+    SLIST_FOREACH(event, &ignore_events, ignore_events) {
+        if (event->sequence != sequence)
+            continue;
+
+        if (event->response_type != -1 &&
+            event->response_type != response_type)
+            continue;
+
+        /* instead of removing a sequence number we better wait until it gets
+         * garbage collected. it may generate multiple events (there are multiple
+         * enter_notifies for one configure_request, for example). */
+        //SLIST_REMOVE(&ignore_events, event, Ignore_Event, ignore_events);
+        //free(event);
+        return true;
+    }
+
+    return false;
+}
+
+
+/*
+ * There was a key press. We compare this key code with our bindings table and pass
+ * the bound action to parse_command().
+ *
+ */
+static int handle_key_press(xcb_key_press_event_t *event) {
+    DLOG("Keypress %d, state raw = %d\n", event->detail, event->state);
+
+    /* Remove the numlock bit, all other bits are modifiers we can bind to */
+    uint16_t state_filtered = event->state & ~(xcb_numlock_mask | XCB_MOD_MASK_LOCK);
+    DLOG("(removed numlock, state = %d)\n", state_filtered);
+    /* Only use the lower 8 bits of the state (modifier masks) so that mouse
+     * button masks are filtered out */
+    state_filtered &= 0xFF;
+    DLOG("(removed upper 8 bits, state = %d)\n", state_filtered);
+
+    if (xkb_current_group == XkbGroup2Index)
+        state_filtered |= BIND_MODE_SWITCH;
+
+    DLOG("(checked mode_switch, state %d)\n", state_filtered);
+
+    /* Find the binding */
+    Binding *bind = get_binding(state_filtered, event->detail);
+
+    /* No match? Then the user has Mode_switch enabled but does not have a
+     * specific keybinding. Fall back to the default keybindings (without
+     * Mode_switch). Makes it much more convenient for users of a hybrid
+     * layout (like us, ru). */
+    if (bind == NULL) {
+        state_filtered &= ~(BIND_MODE_SWITCH);
+        DLOG("no match, new state_filtered = %d\n", state_filtered);
+        if ((bind = get_binding(state_filtered, event->detail)) == NULL) {
+            ELOG("Could not lookup key binding (modifiers %d, keycode %d)\n",
+                 state_filtered, event->detail);
+            return 1;
+        }
+    }
+
+    parse_cmd(bind->command);
+    return 1;
+}
+
+/*
+ * Called with coordinates of an enter_notify event or motion_notify event
+ * to check if the user crossed virtual screen boundaries and adjust the
+ * current workspace, if so.
+ *
+ */
+static void check_crossing_screen_boundary(uint32_t x, uint32_t y) {
+    Output *output;
+
+    /* If the user disable focus follows mouse, we have nothing to do here */
+    if (config.disable_focus_follows_mouse)
+        return;
+
+    if ((output = get_output_containing(x, y)) == NULL) {
+        ELOG("ERROR: No such screen\n");
+        return;
+    }
+
+    if (output->con == NULL) {
+        ELOG("ERROR: The screen is not recognized by i3 (no container associated)\n");
+        return;
+    }
+
+    /* Focus the output on which the user moved his cursor */
+    Con *old_focused = focused;
+    con_focus(con_descend_focused(output_get_content(output->con)));
+
+    /* If the focus changed, we re-render to get updated decorations */
+    if (old_focused != focused)
+        tree_render();
+}
+
+/*
+ * When the user moves the mouse pointer onto a window, this callback gets called.
+ *
+ */
+static int handle_enter_notify(xcb_enter_notify_event_t *event) {
+    Con *con;
+
+    DLOG("enter_notify for %08x, mode = %d, detail %d, serial %d\n",
+         event->event, event->mode, event->detail, event->sequence);
+    DLOG("coordinates %d, %d\n", event->event_x, event->event_y);
+    if (event->mode != XCB_NOTIFY_MODE_NORMAL) {
+        DLOG("This was not a normal notify, ignoring\n");
+        return 1;
+    }
+    /* Some events are not interesting, because they were not generated
+     * actively by the user, but by reconfiguration of windows */
+    if (event_is_ignored(event->sequence, XCB_ENTER_NOTIFY)) {
+        DLOG("Event ignored\n");
+        return 1;
+    }
+
+    bool enter_child = false;
+    /* Get container by frame or by child window */
+    if ((con = con_by_frame_id(event->event)) == NULL) {
+        con = con_by_window_id(event->event);
+        enter_child = true;
+    }
+
+    /* If not, then the user moved his cursor to the root window. In that case, we adjust c_ws */
+    if (con == NULL) {
+        DLOG("Getting screen at %d x %d\n", event->root_x, event->root_y);
+        check_crossing_screen_boundary(event->root_x, event->root_y);
+        return 1;
+    }
+
+    if (con->parent->type == CT_DOCKAREA) {
+        DLOG("Ignoring, this is a dock client\n");
+        return 1;
+    }
+
+    /* see if the user entered the window on a certain window decoration */
+    int layout = (enter_child ? con->parent->layout : con->layout);
+    if (layout == L_DEFAULT) {
+        Con *child;
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+            if (rect_contains(child->deco_rect, event->event_x, event->event_y)) {
+                LOG("using child %p / %s instead!\n", child, child->name);
+                con = child;
+                break;
+            }
+    }
+
+#if 0
+    if (client->workspace != c_ws && client->workspace->output == c_ws->output) {
+            /* This can happen when a client gets assigned to a different workspace than
+             * the current one (see src/mainx.c:reparent_window). Shortly after it was created,
+             * an enter_notify will follow. */
+            DLOG("enter_notify for a client on a different workspace but the same screen, ignoring\n");
+            return 1;
+    }
+#endif
+
+    if (config.disable_focus_follows_mouse)
+        return 1;
+
+    con_focus(con_descend_focused(con));
+    tree_render();
+
+    return 1;
+}
+
+/*
+ * When the user moves the mouse but does not change the active window
+ * (e.g. when having no windows opened but moving mouse on the root screen
+ * and crossing virtual screen boundaries), this callback gets called.
+ *
+ */
+static int handle_motion_notify(xcb_motion_notify_event_t *event) {
+    /* Skip events where the pointer was over a child window, we are only
+     * interested in events on the root window. */
+    if (event->child != 0)
+        return 1;
+
+    Con *con;
+    if ((con = con_by_frame_id(event->event)) == NULL) {
+        check_crossing_screen_boundary(event->root_x, event->root_y);
+        return 1;
+    }
+
+    if (config.disable_focus_follows_mouse)
+        return 1;
+
+    if (con->layout != L_DEFAULT)
+        return 1;
+
+    /* see over which rect the user is */
+    Con *current;
+    TAILQ_FOREACH(current, &(con->nodes_head), nodes) {
+        if (!rect_contains(current->deco_rect, event->event_x, event->event_y))
+            continue;
+
+        /* We found the rect, let’s see if this window is focused */
+        if (TAILQ_FIRST(&(con->focus_head)) == current)
+            return 1;
+
+        con_focus(current);
+        x_push_changes(croot);
+        return 1;
+    }
+
+    return 1;
+}
+
+/*
+ * Called when the keyboard mapping changes (for example by using Xmodmap),
+ * we need to update our key bindings then (re-translate symbols).
+ *
+ */
+static int handle_mapping_notify(xcb_mapping_notify_event_t *event) {
+    if (event->request != XCB_MAPPING_KEYBOARD &&
+        event->request != XCB_MAPPING_MODIFIER)
+        return 0;
+
+    DLOG("Received mapping_notify for keyboard or modifier mapping, re-grabbing keys\n");
+    xcb_refresh_keyboard_mapping(keysyms, event);
+
+    xcb_get_numlock_mask(conn);
+
+    ungrab_all_keys(conn);
+    translate_keysyms();
+    grab_all_keys(conn, false);
+
+    return 0;
+}
+
+/*
+ * A new window appeared on the screen (=was mapped), so let’s manage it.
+ *
+ */
+static int handle_map_request(xcb_map_request_event_t *event) {
+    xcb_get_window_attributes_cookie_t cookie;
+
+    cookie = xcb_get_window_attributes_unchecked(conn, event->window);
+
+    DLOG("window = 0x%08x, serial is %d.\n", event->window, event->sequence);
+    add_ignore_event(event->sequence, -1);
+
+    manage_window(event->window, cookie, false);
+    x_push_changes(croot);
+    return 1;
+}
+
+/*
+ * Configure requests are received when the application wants to resize windows on their own.
+ *
+ * We generate a synthethic configure notify event to signalize the client its "new" position.
+ *
+ */
+static int handle_configure_request(xcb_configure_request_event_t *event) {
+    Con *con;
+
+    DLOG("window 0x%08x wants to be at %dx%d with %dx%d\n",
+        event->window, event->x, event->y, event->width, event->height);
+
+    /* For unmanaged windows, we just execute the configure request. As soon as
+     * it gets mapped, we will take over anyways. */
+    if ((con = con_by_window_id(event->window)) == NULL) {
+        DLOG("Configure request for unmanaged window, can do that.\n");
+
+        uint32_t mask = 0;
+        uint32_t values[7];
+        int c = 0;
+#define COPY_MASK_MEMBER(mask_member, event_member) do { \
+        if (event->value_mask & mask_member) { \
+            mask |= mask_member; \
+            values[c++] = event->event_member; \
+        } \
+} while (0)
+
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_X, x);
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_Y, y);
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_WIDTH, width);
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_HEIGHT, height);
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_BORDER_WIDTH, border_width);
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_SIBLING, sibling);
+        COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_STACK_MODE, stack_mode);
+
+        xcb_configure_window(conn, event->window, mask, values);
+        xcb_flush(conn);
+
+        return 1;
+    }
+
+    DLOG("Configure request!\n");
+    if (con_is_floating(con) && con_is_leaf(con)) {
+        /* find the height for the decorations */
+        int deco_height = config.font.height + 5;
+        /* we actually need to apply the size/position changes to the *parent*
+         * container */
+        Rect bsr = con_border_style_rect(con);
+        if (con->border_style == BS_NORMAL) {
+            bsr.y += deco_height;
+            bsr.height -= deco_height;
+        }
+        con = con->parent;
+        DLOG("Container is a floating leaf node, will do that.\n");
+        if (event->value_mask & XCB_CONFIG_WINDOW_X) {
+            con->rect.x = event->x + (-1) * bsr.x;
+            DLOG("proposed x = %d, new x is %d\n", event->x, con->rect.x);
+        }
+        if (event->value_mask & XCB_CONFIG_WINDOW_Y) {
+            con->rect.y = event->y + (-1) * bsr.y;
+            DLOG("proposed y = %d, new y is %d\n", event->y, con->rect.y);
+        }
+        if (event->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
+            con->rect.width = event->width + (-1) * bsr.width;
+            DLOG("proposed width = %d, new width is %d\n", event->width, con->rect.width);
+        }
+        if (event->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
+            con->rect.height = event->height + (-1) * bsr.height;
+            DLOG("proposed height = %d, new height is %d\n", event->height, con->rect.height);
+        }
+        tree_render();
+    }
+
+    fake_absolute_configure_notify(con);
+
+    return 1;
+#if 0
+        /* Dock clients can be reconfigured in their height */
+        if (client->dock) {
+                DLOG("Reconfiguring height of this dock client\n");
+
+                if (!(event->value_mask & XCB_CONFIG_WINDOW_HEIGHT)) {
+                        DLOG("Ignoring configure request, no height given\n");
+                        return 1;
+                }
+
+                client->desired_height = event->height;
+                render_workspace(conn, c_ws->output, c_ws);
+                xcb_flush(conn);
+
+                return 1;
+        }
+
+        if (client->fullscreen) {
+                DLOG("Client is in fullscreen mode\n");
+
+                Rect child_rect = client->container->workspace->rect;
+                child_rect.x = child_rect.y = 0;
+                fake_configure_notify(conn, child_rect, client->child);
+
+                return 1;
+        }
+
+        fake_absolute_configure_notify(conn, client);
+
+        return 1;
+#endif
+}
+#if 0
+
+/*
+ * Configuration notifies are only handled because we need to set up ignore for
+ * the following enter notify events.
+ *
+ */
+int handle_configure_event(void *prophs, xcb_connection_t *conn, xcb_configure_notify_event_t *event) {
+    DLOG("configure_event, sequence %d\n", event->sequence);
+        /* We ignore this sequence twice because events for child and frame should be ignored */
+        add_ignore_event(event->sequence);
+        add_ignore_event(event->sequence);
+
+        return 1;
+}
+#endif
+
+/*
+ * Gets triggered upon a RandR screen change event, that is when the user
+ * changes the screen configuration in any way (mode, position, …)
+ *
+ */
+static int handle_screen_change(xcb_generic_event_t *e) {
+    DLOG("RandR screen change\n");
+
+    randr_query_outputs();
+
+    ipc_send_event("output", I3_IPC_EVENT_OUTPUT, "{\"change\":\"unspecified\"}");
+
+    return 1;
+}
+
+/*
+ * Our window decorations were unmapped. That means, the window will be killed
+ * now, so we better clean up before.
+ *
+ */
+static int handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
+    // XXX: this is commented out because in src/x.c we disable EnterNotify events
+    /* we need to ignore EnterNotify events which will be generated because a
+     * different window is visible now */
+    //add_ignore_event(event->sequence, XCB_ENTER_NOTIFY);
+
+    DLOG("UnmapNotify for 0x%08x (received from 0x%08x), serial %d\n", event->window, event->event, event->sequence);
+    Con *con = con_by_window_id(event->window);
+    if (con == NULL) {
+        /* This could also be an UnmapNotify for the frame. We need to
+         * decrement the ignore_unmap counter. */
+        con = con_by_frame_id(event->window);
+        if (con == NULL) {
+            LOG("Not a managed window, ignoring UnmapNotify event\n");
+            return 1;
+        }
+        if (con->ignore_unmap > 0)
+            con->ignore_unmap--;
+        DLOG("ignore_unmap = %d for frame of container %p\n", con->ignore_unmap, con);
+        return 1;
+    }
+
+    if (con->ignore_unmap > 0) {
+        DLOG("ignore_unmap = %d, dec\n", con->ignore_unmap);
+        con->ignore_unmap--;
+        return 1;
+    }
+
+    tree_close(con, DONT_KILL_WINDOW, false);
+    tree_render();
+    x_push_changes(croot);
+    return 1;
+
+#if 0
+        if (client == NULL) {
+                DLOG("not a managed window. Ignoring.\n");
+
+                /* This was most likely the destroyed frame of a client which is
+                 * currently being unmapped, so we add this sequence (again!) to
+                 * the ignore list (enter_notify events will get sent for both,
+                 * the child and its frame). */
+                add_ignore_event(event->sequence);
+
+                return 0;
+        }
+#endif
+
+
+#if 0
+        /* Let’s see how many clients there are left on the workspace to delete it if it’s empty */
+        bool workspace_empty = SLIST_EMPTY(&(client->workspace->focus_stack));
+        bool workspace_focused = (c_ws == client->workspace);
+        Client *to_focus = (!workspace_empty ? SLIST_FIRST(&(client->workspace->focus_stack)) : NULL);
+
+        /* If this workspace is currently visible, we don’t delete it */
+        if (workspace_is_visible(client->workspace))
+                workspace_empty = false;
+
+        if (workspace_empty) {
+                client->workspace->output = NULL;
+                ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"empty\"}");
+        }
+
+        /* Remove the urgency flag if set */
+        client->urgent = false;
+        workspace_update_urgent_flag(client->workspace);
+
+        render_layout(conn);
+#endif
+
+        return 1;
+}
+
+/*
+ * A destroy notify event is sent when the window is not unmapped, but
+ * immediately destroyed (for example when starting a window and immediately
+ * killing the program which started it).
+ *
+ * We just pass on the event to the unmap notify handler (by copying the
+ * important fields in the event data structure).
+ *
+ */
+static int handle_destroy_notify_event(xcb_destroy_notify_event_t *event) {
+    DLOG("destroy notify for 0x%08x, 0x%08x\n", event->event, event->window);
+
+    xcb_unmap_notify_event_t unmap;
+    unmap.sequence = event->sequence;
+    unmap.event = event->event;
+    unmap.window = event->window;
+
+    return handle_unmap_notify_event(&unmap);
+}
+
+/*
+ * Called when a window changes its title
+ *
+ */
+static bool handle_windowname_change(void *data, xcb_connection_t *conn, uint8_t state,
+                                xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *prop) {
+    Con *con;
+    if ((con = con_by_window_id(window)) == NULL || con->window == NULL)
+        return false;
+
+    window_update_name(con->window, prop, false);
+
+    x_push_changes(croot);
+
+    return true;
+}
+
+/*
+ * Handles legacy window name updates (WM_NAME), see also src/window.c,
+ * window_update_name_legacy().
+ *
+ */
+static bool handle_windowname_change_legacy(void *data, xcb_connection_t *conn, uint8_t state,
+                                xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *prop) {
+    Con *con;
+    if ((con = con_by_window_id(window)) == NULL || con->window == NULL)
+        return false;
+
+    window_update_name_legacy(con->window, prop, false);
+
+    x_push_changes(croot);
+
+    return true;
+}
+
+#if 0
+/*
+ * Updates the client’s WM_CLASS property
+ *
+ */
+static int handle_windowclass_change(void *data, xcb_connection_t *conn, uint8_t state,
+                             xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *prop) {
+    Con *con;
+    if ((con = con_by_window_id(window)) == NULL || con->window == NULL)
+        return 1;
+
+    window_update_class(con->window, prop, false);
+
+    return 0;
+}
+#endif
+
+/*
+ * Expose event means we should redraw our windows (= title bar)
+ *
+ */
+static int handle_expose_event(xcb_expose_event_t *event) {
+    Con *parent;
+
+    /* event->count is the number of minimum remaining expose events for this
+     * window, so we skip all events but the last one */
+    if (event->count != 0)
+        return 1;
+
+    DLOG("window = %08x\n", event->window);
+
+    if ((parent = con_by_frame_id(event->window)) == NULL) {
+        LOG("expose event for unknown window, ignoring\n");
+        return 1;
+    }
+
+    /* re-render the parent (recursively, if it’s a split con) */
+    x_deco_recurse(parent);
+    xcb_flush(conn);
+
+    return 1;
+}
+
+/*
+ * Handle client messages (EWMH)
+ *
+ */
+static int handle_client_message(xcb_client_message_event_t *event) {
+    LOG("ClientMessage for window 0x%08x\n", event->window);
+    if (event->type == A__NET_WM_STATE) {
+        if (event->format != 32 || event->data.data32[1] != A__NET_WM_STATE_FULLSCREEN) {
+            DLOG("atom in clientmessage is %d, fullscreen is %d\n",
+                    event->data.data32[1], A__NET_WM_STATE_FULLSCREEN);
+            DLOG("not about fullscreen atom\n");
+            return 0;
+        }
+
+        Con *con = con_by_window_id(event->window);
+        if (con == NULL) {
+            DLOG("Could not get window for client message\n");
+            return 0;
+        }
+
+        /* Check if the fullscreen state should be toggled */
+        if ((con->fullscreen_mode != CF_NONE &&
+             (event->data.data32[0] == _NET_WM_STATE_REMOVE ||
+              event->data.data32[0] == _NET_WM_STATE_TOGGLE)) ||
+            (con->fullscreen_mode == CF_NONE &&
+             (event->data.data32[0] == _NET_WM_STATE_ADD ||
+              event->data.data32[0] == _NET_WM_STATE_TOGGLE))) {
+            DLOG("toggling fullscreen\n");
+            con_toggle_fullscreen(con, CF_OUTPUT);
+        }
+
+        tree_render();
+        x_push_changes(croot);
+    } else {
+        ELOG("unhandled clientmessage\n");
+        return 0;
+    }
+
+    return 1;
+}
+
+#if 0
+int handle_window_type(void *data, xcb_connection_t *conn, uint8_t state, xcb_window_t window,
+                        xcb_atom_t atom, xcb_get_property_reply_t *property) {
+        /* TODO: Implement this one. To do this, implement a little test program which sleep(1)s
+         before changing this property. */
+        ELOG("_NET_WM_WINDOW_TYPE changed, this is not yet implemented.\n");
+        return 0;
+}
+#endif
+
+/*
+ * Handles the size hints set by a window, but currently only the part necessary for displaying
+ * clients proportionally inside their frames (mplayer for example)
+ *
+ * See ICCCM 4.1.2.3 for more details
+ *
+ */
+static bool handle_normal_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_window_t window,
+                        xcb_atom_t name, xcb_get_property_reply_t *reply) {
+    Con *con = con_by_window_id(window);
+    if (con == NULL) {
+        DLOG("Received WM_NORMAL_HINTS for unknown client\n");
+        return false;
+    }
+
+    xcb_size_hints_t size_hints;
+
+        //CLIENT_LOG(client);
+
+    /* If the hints were already in this event, use them, if not, request them */
+    if (reply != NULL)
+        xcb_icccm_get_wm_size_hints_from_reply(&size_hints, reply);
+    else
+        xcb_icccm_get_wm_normal_hints_reply(conn, xcb_icccm_get_wm_normal_hints_unchecked(conn, con->window->id), &size_hints, NULL);
+
+    if ((size_hints.flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE)) {
+        // TODO: Minimum size is not yet implemented
+        DLOG("Minimum size: %d (width) x %d (height)\n", size_hints.min_width, size_hints.min_height);
+    }
+
+    bool changed = false;
+    if ((size_hints.flags & XCB_ICCCM_SIZE_HINT_P_RESIZE_INC)) {
+        if (size_hints.width_inc > 0 && size_hints.width_inc < 0xFFFF)
+            if (con->width_increment != size_hints.width_inc) {
+                con->width_increment = size_hints.width_inc;
+                changed = true;
+            }
+        if (size_hints.height_inc > 0 && size_hints.height_inc < 0xFFFF)
+            if (con->height_increment != size_hints.height_inc) {
+                con->height_increment = size_hints.height_inc;
+                changed = true;
+            }
+
+        if (changed)
+            DLOG("resize increments changed\n");
+    }
+
+    int base_width = 0, base_height = 0;
+
+    /* base_width/height are the desired size of the window.
+       We check if either the program-specified size or the program-specified
+       min-size is available */
+    if (size_hints.flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE) {
+        base_width = size_hints.base_width;
+        base_height = size_hints.base_height;
+    } else if (size_hints.flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE) {
+        /* TODO: is this right? icccm says not */
+        base_width = size_hints.min_width;
+        base_height = size_hints.min_height;
+    }
+
+    if (base_width != con->base_width ||
+        base_height != con->base_height) {
+        con->base_width = base_width;
+        con->base_height = base_height;
+        DLOG("client's base_height changed to %d\n", base_height);
+        DLOG("client's base_width changed to %d\n", base_width);
+        changed = true;
+    }
+
+    /* If no aspect ratio was set or if it was invalid, we ignore the hints */
+    if (!(size_hints.flags & XCB_ICCCM_SIZE_HINT_P_ASPECT) ||
+        (size_hints.min_aspect_num <= 0) ||
+        (size_hints.min_aspect_den <= 0)) {
+        goto render_and_return;
+    }
+
+    /* XXX: do we really use rect here, not window_rect? */
+    double width = con->rect.width - base_width;
+    double height = con->rect.height - base_height;
+    /* Convert numerator/denominator to a double */
+    double min_aspect = (double)size_hints.min_aspect_num / size_hints.min_aspect_den;
+    double max_aspect = (double)size_hints.max_aspect_num / size_hints.min_aspect_den;
+
+    DLOG("Aspect ratio set: minimum %f, maximum %f\n", min_aspect, max_aspect);
+    DLOG("width = %f, height = %f\n", width, height);
+
+    /* Sanity checks, this is user-input, in a way */
+    if (max_aspect <= 0 || min_aspect <= 0 || height == 0 || (width / height) <= 0)
+        goto render_and_return;
+
+    /* Check if we need to set proportional_* variables using the correct ratio */
+    if ((width / height) < min_aspect) {
+        if (con->proportional_width != width ||
+            con->proportional_height != (width / min_aspect)) {
+            con->proportional_width = width;
+            con->proportional_height = width / min_aspect;
+            changed = true;
+        }
+    } else if ((width / height) > max_aspect) {
+        if (con->proportional_width != width ||
+            con->proportional_height != (width / max_aspect)) {
+            con->proportional_width = width;
+            con->proportional_height = width / max_aspect;
+            changed = true;
+        }
+    } else goto render_and_return;
+
+render_and_return:
+    if (changed)
+        tree_render();
+    FREE(reply);
+    return true;
+}
+
+/*
+ * Handles the WM_HINTS property for extracting the urgency state of the window.
+ *
+ */
+static bool handle_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_window_t window,
+                  xcb_atom_t name, xcb_get_property_reply_t *reply) {
+    Con *con = con_by_window_id(window);
+    if (con == NULL) {
+        DLOG("Received WM_HINTS for unknown client\n");
+        return false;
+    }
+
+    xcb_icccm_wm_hints_t hints;
+
+    if (reply != NULL) {
+        if (!xcb_icccm_get_wm_hints_from_reply(&hints, reply))
+            return false;
+    } else {
+        if (!xcb_icccm_get_wm_hints_reply(conn, xcb_icccm_get_wm_hints_unchecked(conn, con->window->id), &hints, NULL))
+            return false;
+    }
+
+    if (!con->urgent && focused == con) {
+        DLOG("Ignoring urgency flag for current client\n");
+        FREE(reply);
+        return true;
+    }
+
+    /* Update the flag on the client directly */
+    con->urgent = (xcb_icccm_wm_hints_get_urgency(&hints) != 0);
+    //CLIENT_LOG(con);
+    LOG("Urgency flag changed to %d\n", con->urgent);
+
+    Con *ws;
+    /* Set the urgency flag on the workspace, if a workspace could be found
+     * (for dock clients, that is not the case). */
+    if ((ws = con_get_workspace(con)) != NULL)
+        workspace_update_urgent_flag(ws);
+
+    tree_render();
+
+#if 0
+    /* If the workspace this client is on is not visible, we need to redraw
+     * the workspace bar */
+    if (!workspace_is_visible(client->workspace)) {
+            Output *output = client->workspace->output;
+            render_workspace(conn, output, output->current_workspace);
+            xcb_flush(conn);
+    }
+#endif
+
+    FREE(reply);
+    return true;
+}
+
+/*
+ * Handles the transient for hints set by a window, signalizing that this window is a popup window
+ * for some other window.
+ *
+ * See ICCCM 4.1.2.6 for more details
+ *
+ */
+static bool handle_transient_for(void *data, xcb_connection_t *conn, uint8_t state, xcb_window_t window,
+                         xcb_atom_t name, xcb_get_property_reply_t *prop) {
+    Con *con;
+
+    if ((con = con_by_window_id(window)) == NULL || con->window == NULL) {
+        DLOG("No such window\n");
+        return false;
+    }
+
+    if (prop == NULL) {
+        prop = xcb_get_property_reply(conn, xcb_get_property_unchecked(conn,
+                                false, window, A_WM_TRANSIENT_FOR, A_WINDOW, 0, 32), NULL);
+        if (prop == NULL)
+            return false;
+    }
+
+    window_update_transient_for(con->window, prop);
+
+    // TODO: put window in floating mode if con->window->transient_for != XCB_NONE:
+#if 0
+    if (client->floating == FLOATING_AUTO_OFF) {
+        DLOG("This is a popup window, putting into floating\n");
+        toggle_floating_mode(conn, client, true);
+    }
+#endif
+
+    return true;
+}
+
+/*
+ * Handles changes of the WM_CLIENT_LEADER atom which specifies if this is a
+ * toolwindow (or similar) and to which window it belongs (logical parent).
+ *
+ */
+static bool handle_clientleader_change(void *data, xcb_connection_t *conn, uint8_t state, xcb_window_t window,
+                        xcb_atom_t name, xcb_get_property_reply_t *prop) {
+    Con *con;
+    if ((con = con_by_window_id(window)) == NULL || con->window == NULL)
+        return false;
+
+    if (prop == NULL) {
+        prop = xcb_get_property_reply(conn, xcb_get_property_unchecked(conn,
+                                false, window, A_WM_CLIENT_LEADER, A_WINDOW, 0, 32), NULL);
+        if (prop == NULL)
+            return false;
+    }
+
+    window_update_leader(con->window, prop);
+
+    return true;
+}
+
+/*
+ * Handles FocusIn events which are generated by clients (i3’s focus changes
+ * don’t generate FocusIn events due to a different EventMask) and updates the
+ * decorations accordingly.
+ *
+ */
+static int handle_focus_in(xcb_focus_in_event_t *event) {
+    DLOG("focus change in, for window 0x%08x\n", event->event);
+    Con *con;
+    if ((con = con_by_window_id(event->event)) == NULL || con->window == NULL)
+        return 1;
+    DLOG("That is con %p / %s\n", con, con->name);
+
+    if (event->mode == XCB_NOTIFY_MODE_GRAB ||
+        event->mode == XCB_NOTIFY_MODE_UNGRAB) {
+        DLOG("FocusIn event for grab/ungrab, ignoring\n");
+        return 1;
+    }
+
+    if (event->detail == XCB_NOTIFY_DETAIL_POINTER) {
+        DLOG("notify detail is pointer, ignoring this event\n");
+        return 1;
+    }
+
+    if (focused_id == event->event) {
+        DLOG("focus matches the currently focused window, not doing anything\n");
+        return 1;
+    }
+
+    DLOG("focus is different, updating decorations\n");
+    con_focus(con);
+    /* We update focused_id because we don’t need to set focus again */
+    focused_id = event->event;
+    x_push_changes(croot);
+    return 1;
+}
+
+/* Returns false if the event could not be processed (e.g. the window could not
+ * be found), true otherwise */
+typedef bool (*cb_property_handler_t)(void *data, xcb_connection_t *c, uint8_t state, xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *property);
+
+struct property_handler_t {
+    xcb_atom_t atom;
+    uint32_t long_len;
+    cb_property_handler_t cb;
+};
+
+static struct property_handler_t property_handlers[] = {
+    { 0, 128, handle_windowname_change },
+    { 0, UINT_MAX, handle_hints },
+    { 0, 128, handle_windowname_change_legacy },
+    { 0, UINT_MAX, handle_normal_hints },
+    { 0, UINT_MAX, handle_clientleader_change },
+    { 0, UINT_MAX, handle_transient_for }
+};
+#define NUM_HANDLERS (sizeof(property_handlers) / sizeof(struct property_handler_t))
+
+/*
+ * Sets the appropriate atoms for the property handlers after the atoms were
+ * received from X11
+ *
+ */
+void property_handlers_init() {
+    property_handlers[0].atom = A__NET_WM_NAME;
+    property_handlers[1].atom = A_WM_HINTS;
+    property_handlers[2].atom = A_WM_NAME;
+    property_handlers[3].atom = A_WM_NORMAL_HINTS;
+    property_handlers[4].atom = A_WM_CLIENT_LEADER;
+    property_handlers[5].atom = A_WM_TRANSIENT_FOR;
+}
+
+static void property_notify(uint8_t state, xcb_window_t window, xcb_atom_t atom) {
+    struct property_handler_t *handler = NULL;
+    xcb_get_property_reply_t *propr = NULL;
+
+    for (int c = 0; c < sizeof(property_handlers) / sizeof(struct property_handler_t); c++) {
+        if (property_handlers[c].atom != atom)
+            continue;
+
+        handler = &property_handlers[c];
+        break;
+    }
+
+    if (handler == NULL) {
+        DLOG("Unhandled property notify for atom %d (0x%08x)\n", atom, atom);
+        return;
+    }
+
+    if (state != XCB_PROPERTY_DELETE) {
+        xcb_get_property_cookie_t cookie = xcb_get_property(conn, 0, window, atom, XCB_GET_PROPERTY_TYPE_ANY, 0, handler->long_len);
+        propr = xcb_get_property_reply(conn, cookie, 0);
+    }
+
+    /* the handler will free() the reply unless it returns false */
+    if (!handler->cb(NULL, conn, state, window, atom, propr))
+        FREE(propr);
+}
+
+/*
+ * Takes an xcb_generic_event_t and calls the appropriate handler, based on the
+ * event type.
+ *
+ */
+void handle_event(int type, xcb_generic_event_t *event) {
+    if (randr_base > -1 &&
+        type == randr_base + XCB_RANDR_SCREEN_CHANGE_NOTIFY) {
+        handle_screen_change(event);
+        return;
+    }
+
+    switch (type) {
+        case XCB_KEY_PRESS:
+            handle_key_press((xcb_key_press_event_t*)event);
+            break;
+
+        case XCB_BUTTON_PRESS:
+            handle_button_press((xcb_button_press_event_t*)event);
+            break;
+
+        case XCB_MAP_REQUEST:
+            handle_map_request((xcb_map_request_event_t*)event);
+            break;
+
+        case XCB_UNMAP_NOTIFY:
+            handle_unmap_notify_event((xcb_unmap_notify_event_t*)event);
+            break;
+
+        case XCB_DESTROY_NOTIFY:
+            handle_destroy_notify_event((xcb_destroy_notify_event_t*)event);
+            break;
+
+        case XCB_EXPOSE:
+            handle_expose_event((xcb_expose_event_t*)event);
+            break;
+
+        case XCB_MOTION_NOTIFY:
+            handle_motion_notify((xcb_motion_notify_event_t*)event);
+            break;
+
+        /* Enter window = user moved his mouse over the window */
+        case XCB_ENTER_NOTIFY:
+            handle_enter_notify((xcb_enter_notify_event_t*)event);
+            break;
+
+        /* Client message are sent to the root window. The only interesting
+         * client message for us is _NET_WM_STATE, we honour
+         * _NET_WM_STATE_FULLSCREEN */
+        case XCB_CLIENT_MESSAGE:
+            handle_client_message((xcb_client_message_event_t*)event);
+            break;
+
+        /* Configure request = window tried to change size on its own */
+        case XCB_CONFIGURE_REQUEST:
+            handle_configure_request((xcb_configure_request_event_t*)event);
+            break;
+
+        /* Mapping notify = keyboard mapping changed (Xmodmap), re-grab bindings */
+        case XCB_MAPPING_NOTIFY:
+            handle_mapping_notify((xcb_mapping_notify_event_t*)event);
+            break;
+
+        case XCB_FOCUS_IN:
+            handle_focus_in((xcb_focus_in_event_t*)event);
+            break;
+
+        case XCB_PROPERTY_NOTIFY:
+            DLOG("Property notify\n");
+            xcb_property_notify_event_t *e = (xcb_property_notify_event_t*)event;
+            property_notify(e->state, e->window, e->atom);
+            break;
+
+        default:
+            DLOG("Unhandled event of type %d\n", type);
+            break;
+    }
+}
diff --git a/src/ipc.c b/src/ipc.c
new file mode 100644 (file)
index 0000000..b2cd482
--- /dev/null
+++ b/src/ipc.c
@@ -0,0 +1,735 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * ipc.c: Everything about the UNIX domain sockets for IPC
+ *
+ */
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <fcntl.h>
+#include <libgen.h>
+#include <ev.h>
+#include <yajl/yajl_gen.h>
+#include <yajl/yajl_parse.h>
+#include <yajl/yajl_version.h>
+
+#include "all.h"
+
+char *current_socketpath = NULL;
+
+/* Shorter names for all those yajl_gen_* functions */
+#define y(x, ...) yajl_gen_ ## x (gen, ##__VA_ARGS__)
+#define ystr(str) yajl_gen_string(gen, (unsigned char*)str, strlen(str))
+
+TAILQ_HEAD(ipc_client_head, ipc_client) all_clients = TAILQ_HEAD_INITIALIZER(all_clients);
+
+/*
+ * Puts the given socket file descriptor into non-blocking mode or dies if
+ * setting O_NONBLOCK failed. Non-blocking sockets are a good idea for our
+ * IPC model because we should by no means block the window manager.
+ *
+ */
+static void set_nonblock(int sockfd) {
+    int flags = fcntl(sockfd, F_GETFL, 0);
+    flags |= O_NONBLOCK;
+    if (fcntl(sockfd, F_SETFL, flags) < 0)
+        err(-1, "Could not set O_NONBLOCK");
+}
+
+/*
+ * Emulates mkdir -p (creates any missing folders)
+ *
+ */
+static bool mkdirp(const char *path) {
+    if (mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0)
+        return true;
+    if (errno != ENOENT) {
+        ELOG("mkdir(%s) failed: %s\n", path, strerror(errno));
+        return false;
+    }
+    char *copy = strdup(path);
+    /* strip trailing slashes, if any */
+    while (copy[strlen(copy)-1] == '/')
+        copy[strlen(copy)-1] = '\0';
+
+    char *sep = strrchr(copy, '/');
+    if (sep == NULL)
+        return false;
+    *sep = '\0';
+    bool result = false;
+    if (mkdirp(copy))
+        result = mkdirp(path);
+    free(copy);
+
+    return result;
+}
+
+static void ipc_send_message(int fd, const unsigned char *payload,
+                             int message_type, int message_size) {
+    int buffer_size = strlen("i3-ipc") + sizeof(uint32_t) +
+                      sizeof(uint32_t) + message_size;
+    char msg[buffer_size];
+    char *walk = msg;
+
+    strncpy(walk, "i3-ipc", buffer_size - 1);
+    walk += strlen("i3-ipc");
+    memcpy(walk, &message_size, sizeof(uint32_t));
+    walk += sizeof(uint32_t);
+    memcpy(walk, &message_type, sizeof(uint32_t));
+    walk += sizeof(uint32_t);
+    memcpy(walk, payload, message_size);
+
+    int sent_bytes = 0;
+    int bytes_to_go = buffer_size;
+    while (sent_bytes < bytes_to_go) {
+        int n = write(fd, msg + sent_bytes, bytes_to_go);
+        if (n == -1) {
+            DLOG("write() failed: %s\n", strerror(errno));
+            return;
+        }
+
+        sent_bytes += n;
+        bytes_to_go -= n;
+    }
+}
+
+/*
+ * Sends the specified event to all IPC clients which are currently connected
+ * and subscribed to this kind of event.
+ *
+ */
+void ipc_send_event(const char *event, uint32_t message_type, const char *payload) {
+    ipc_client *current;
+    TAILQ_FOREACH(current, &all_clients, clients) {
+        /* see if this client is interested in this event */
+        bool interested = false;
+        for (int i = 0; i < current->num_events; i++) {
+            if (strcasecmp(current->events[i], event) != 0)
+                continue;
+            interested = true;
+            break;
+        }
+        if (!interested)
+            continue;
+
+        ipc_send_message(current->fd, (const unsigned char*)payload,
+                         message_type, strlen(payload));
+    }
+}
+
+/*
+ * Calls shutdown() on each socket and closes it. This function to be called
+ * when exiting or restarting only!
+ *
+ */
+void ipc_shutdown() {
+    ipc_client *current;
+    TAILQ_FOREACH(current, &all_clients, clients) {
+        shutdown(current->fd, SHUT_RDWR);
+        close(current->fd);
+    }
+}
+
+/*
+ * Executes the command and returns whether it could be successfully parsed
+ * or not (at the moment, always returns true).
+ *
+ */
+IPC_HANDLER(command) {
+    /* To get a properly terminated buffer, we copy
+     * message_size bytes out of the buffer */
+    char *command = scalloc(message_size + 1);
+    strncpy(command, (const char*)message, message_size);
+    LOG("IPC: received: *%s*\n", command);
+    const char *reply = parse_cmd((const char*)command);
+    free(command);
+
+    /* If no reply was provided, we just use the default success message */
+    if (reply == NULL)
+        reply = "{\"success\":true}";
+    ipc_send_message(fd, (const unsigned char*)reply,
+                     I3_IPC_REPLY_TYPE_COMMAND, strlen(reply));
+}
+
+static void dump_rect(yajl_gen gen, const char *name, Rect r) {
+    ystr(name);
+    y(map_open);
+    ystr("x");
+    y(integer, r.x);
+    ystr("y");
+    y(integer, r.y);
+    ystr("width");
+    y(integer, r.width);
+    ystr("height");
+    y(integer, r.height);
+    y(map_close);
+}
+
+void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) {
+    y(map_open);
+    ystr("id");
+    y(integer, (long int)con);
+
+    ystr("type");
+    y(integer, con->type);
+
+    ystr("orientation");
+    switch (con->orientation) {
+        case NO_ORIENTATION:
+            ystr("none");
+            break;
+        case HORIZ:
+            ystr("horizontal");
+            break;
+        case VERT:
+            ystr("vertical");
+            break;
+    }
+
+    ystr("percent");
+    if (con->percent == 0.0)
+        y(null);
+    else y(double, con->percent);
+
+    ystr("urgent");
+    y(bool, con->urgent);
+
+    ystr("focused");
+    y(bool, (con == focused));
+
+    ystr("layout");
+    switch (con->layout) {
+        case L_DEFAULT:
+            ystr("default");
+            break;
+        case L_STACKED:
+            ystr("stacked");
+            break;
+        case L_TABBED:
+            ystr("tabbed");
+            break;
+        case L_DOCKAREA:
+            ystr("dockarea");
+            break;
+        case L_OUTPUT:
+            ystr("output");
+            break;
+    }
+
+    ystr("border");
+    switch (con->border_style) {
+        case BS_NORMAL:
+            ystr("normal");
+            break;
+        case BS_NONE:
+            ystr("none");
+            break;
+        case BS_1PIXEL:
+            ystr("1pixel");
+            break;
+    }
+
+    dump_rect(gen, "rect", con->rect);
+    dump_rect(gen, "window_rect", con->window_rect);
+    dump_rect(gen, "geometry", con->geometry);
+
+    ystr("name");
+    ystr(con->name);
+
+    if (con->type == CT_WORKSPACE) {
+        ystr("num");
+        y(integer, con->num);
+    }
+
+    ystr("window");
+    if (con->window)
+        y(integer, con->window->id);
+    else y(null);
+
+    ystr("nodes");
+    y(array_open);
+    Con *node;
+    if (con->type != CT_DOCKAREA || !inplace_restart) {
+        TAILQ_FOREACH(node, &(con->nodes_head), nodes) {
+            dump_node(gen, node, inplace_restart);
+        }
+    }
+    y(array_close);
+
+    ystr("floating_nodes");
+    y(array_open);
+    TAILQ_FOREACH(node, &(con->floating_head), floating_windows) {
+        dump_node(gen, node, inplace_restart);
+    }
+    y(array_close);
+
+    ystr("focus");
+    y(array_open);
+    TAILQ_FOREACH(node, &(con->focus_head), nodes) {
+        y(integer, (long int)node);
+    }
+    y(array_close);
+
+    ystr("fullscreen_mode");
+    y(integer, con->fullscreen_mode);
+
+    ystr("swallows");
+    y(array_open);
+    Match *match;
+    TAILQ_FOREACH(match, &(con->swallow_head), matches) {
+        if (match->dock != -1) {
+            y(map_open);
+            ystr("dock");
+            y(integer, match->dock);
+            ystr("insert_where");
+            y(integer, match->insert_where);
+            y(map_close);
+        }
+
+        /* TODO: the other swallow keys */
+    }
+
+    if (inplace_restart) {
+        if (con->window != NULL) {
+            y(map_open);
+            ystr("id");
+            y(integer, con->window->id);
+            y(map_close);
+        }
+    }
+    y(array_close);
+
+    y(map_close);
+}
+
+IPC_HANDLER(tree) {
+    setlocale(LC_NUMERIC, "C");
+#if YAJL_MAJOR >= 2
+    yajl_gen gen = yajl_gen_alloc(NULL);
+#else
+    yajl_gen gen = yajl_gen_alloc(NULL, NULL);
+#endif
+    dump_node(gen, croot, false);
+    setlocale(LC_NUMERIC, "");
+
+    const unsigned char *payload;
+#if YAJL_MAJOR >= 2
+    size_t length;
+#else
+    unsigned int length;
+#endif
+    y(get_buf, &payload, &length);
+
+    ipc_send_message(fd, payload, I3_IPC_REPLY_TYPE_TREE, length);
+    y(free);
+}
+
+/*
+ * Formats the reply message for a GET_WORKSPACES request and sends it to the
+ * client
+ *
+ */
+IPC_HANDLER(get_workspaces) {
+#if YAJL_MAJOR >= 2
+    yajl_gen gen = yajl_gen_alloc(NULL);
+#else
+    yajl_gen gen = yajl_gen_alloc(NULL, NULL);
+#endif
+    y(array_open);
+
+    Con *focused_ws = con_get_workspace(focused);
+
+    Con *output;
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
+        Con *ws;
+        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
+            assert(ws->type == CT_WORKSPACE);
+            y(map_open);
+
+            ystr("num");
+            if (ws->num == -1)
+                y(null);
+            else y(integer, ws->num);
+
+            ystr("name");
+            ystr(ws->name);
+
+            ystr("visible");
+            y(bool, workspace_is_visible(ws));
+
+            ystr("focused");
+            y(bool, ws == focused_ws);
+
+            ystr("rect");
+            y(map_open);
+            ystr("x");
+            y(integer, ws->rect.x);
+            ystr("y");
+            y(integer, ws->rect.y);
+            ystr("width");
+            y(integer, ws->rect.width);
+            ystr("height");
+            y(integer, ws->rect.height);
+            y(map_close);
+
+            ystr("output");
+            ystr(output->name);
+
+            ystr("urgent");
+            y(bool, ws->urgent);
+
+            y(map_close);
+        }
+    }
+
+    y(array_close);
+
+    const unsigned char *payload;
+#if YAJL_MAJOR >= 2
+    size_t length;
+#else
+    unsigned int length;
+#endif
+    y(get_buf, &payload, &length);
+
+    ipc_send_message(fd, payload, I3_IPC_REPLY_TYPE_WORKSPACES, length);
+    y(free);
+}
+
+/*
+ * Formats the reply message for a GET_OUTPUTS request and sends it to the
+ * client
+ *
+ */
+IPC_HANDLER(get_outputs) {
+#if YAJL_MAJOR >= 2
+    yajl_gen gen = yajl_gen_alloc(NULL);
+#else
+    yajl_gen gen = yajl_gen_alloc(NULL, NULL);
+#endif
+    y(array_open);
+
+    Output *output;
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        y(map_open);
+
+        ystr("name");
+        ystr(output->name);
+
+        ystr("active");
+        y(bool, output->active);
+
+        ystr("rect");
+        y(map_open);
+        ystr("x");
+        y(integer, output->rect.x);
+        ystr("y");
+        y(integer, output->rect.y);
+        ystr("width");
+        y(integer, output->rect.width);
+        ystr("height");
+        y(integer, output->rect.height);
+        y(map_close);
+
+        ystr("current_workspace");
+        Con *ws = NULL;
+        if (output->con && (ws = con_get_fullscreen_con(output->con, CF_OUTPUT)))
+            ystr(ws->name);
+        else y(null);
+
+        y(map_close);
+    }
+
+    y(array_close);
+
+    const unsigned char *payload;
+#if YAJL_MAJOR >= 2
+    size_t length;
+#else
+    unsigned int length;
+#endif
+    y(get_buf, &payload, &length);
+
+    ipc_send_message(fd, payload, I3_IPC_REPLY_TYPE_OUTPUTS, length);
+    y(free);
+}
+
+/*
+ * Callback for the YAJL parser (will be called when a string is parsed).
+ *
+ */
+#if YAJL_MAJOR < 2
+static int add_subscription(void *extra, const unsigned char *s,
+                            unsigned int len) {
+#else
+static int add_subscription(void *extra, const unsigned char *s,
+                            size_t len) {
+#endif
+    ipc_client *client = extra;
+
+    DLOG("should add subscription to extra %p, sub %.*s\n", client, len, s);
+    int event = client->num_events;
+
+    client->num_events++;
+    client->events = realloc(client->events, client->num_events * sizeof(char*));
+    /* We copy the string because it is not null-terminated and strndup()
+     * is missing on some BSD systems */
+    client->events[event] = scalloc(len+1);
+    memcpy(client->events[event], s, len);
+
+    DLOG("client is now subscribed to:\n");
+    for (int i = 0; i < client->num_events; i++)
+        DLOG("event %s\n", client->events[i]);
+    DLOG("(done)\n");
+
+    return 1;
+}
+
+/*
+ * Subscribes this connection to the event types which were given as a JSON
+ * serialized array in the payload field of the message.
+ *
+ */
+IPC_HANDLER(subscribe) {
+    yajl_handle p;
+    yajl_callbacks callbacks;
+    yajl_status stat;
+    ipc_client *current, *client = NULL;
+
+    /* Search the ipc_client structure for this connection */
+    TAILQ_FOREACH(current, &all_clients, clients) {
+        if (current->fd != fd)
+            continue;
+
+        client = current;
+        break;
+    }
+
+    if (client == NULL) {
+        ELOG("Could not find ipc_client data structure for fd %d\n", fd);
+        return;
+    }
+
+    /* Setup the JSON parser */
+    memset(&callbacks, 0, sizeof(yajl_callbacks));
+    callbacks.yajl_string = add_subscription;
+
+#if YAJL_MAJOR >= 2
+    p = yajl_alloc(&callbacks, NULL, (void*)client);
+#else
+    p = yajl_alloc(&callbacks, NULL, NULL, (void*)client);
+#endif
+    stat = yajl_parse(p, (const unsigned char*)message, message_size);
+    if (stat != yajl_status_ok) {
+        unsigned char *err;
+        err = yajl_get_error(p, true, (const unsigned char*)message,
+                             message_size);
+        ELOG("YAJL parse error: %s\n", err);
+        yajl_free_error(p, err);
+
+        const char *reply = "{\"success\":false}";
+        ipc_send_message(fd, (const unsigned char*)reply,
+                         I3_IPC_REPLY_TYPE_SUBSCRIBE, strlen(reply));
+        yajl_free(p);
+        return;
+    }
+    yajl_free(p);
+    const char *reply = "{\"success\":true}";
+    ipc_send_message(fd, (const unsigned char*)reply,
+                     I3_IPC_REPLY_TYPE_SUBSCRIBE, strlen(reply));
+}
+
+/* The index of each callback function corresponds to the numeric
+ * value of the message type (see include/i3/ipc.h) */
+handler_t handlers[5] = {
+    handle_command,
+    handle_get_workspaces,
+    handle_subscribe,
+    handle_get_outputs,
+    handle_tree
+};
+
+/*
+ * Handler for activity on a client connection, receives a message from a
+ * client.
+ *
+ * For now, the maximum message size is 2048. I’m not sure for what the
+ * IPC interface will be used in the future, thus I’m not implementing a
+ * mechanism for arbitrarily long messages, as it seems like overkill
+ * at the moment.
+ *
+ */
+static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
+    char buf[2048];
+    int n = read(w->fd, buf, sizeof(buf));
+
+    /* On error or an empty message, we close the connection */
+    if (n <= 0) {
+#if 0
+        /* FIXME: I get these when closing a client socket,
+         * therefore we just treat them as an error. Is this
+         * correct? */
+        if (errno == EAGAIN || errno == EWOULDBLOCK)
+                return;
+#endif
+
+        /* If not, there was some kind of error. We don’t bother
+         * and close the connection */
+        close(w->fd);
+
+        /* Delete the client from the list of clients */
+        ipc_client *current;
+        TAILQ_FOREACH(current, &all_clients, clients) {
+            if (current->fd != w->fd)
+                continue;
+
+            for (int i = 0; i < current->num_events; i++)
+                free(current->events[i]);
+            /* We can call TAILQ_REMOVE because we break out of the
+             * TAILQ_FOREACH afterwards */
+            TAILQ_REMOVE(&all_clients, current, clients);
+            break;
+        }
+
+        ev_io_stop(EV_A_ w);
+
+        DLOG("IPC: client disconnected\n");
+        return;
+    }
+
+    /* Terminate the message correctly */
+    buf[n] = '\0';
+
+    /* Check if the message starts with the i3 IPC magic code */
+    if (n < strlen(I3_IPC_MAGIC)) {
+        DLOG("IPC: message too short, ignoring\n");
+        return;
+    }
+
+    if (strncmp(buf, I3_IPC_MAGIC, strlen(I3_IPC_MAGIC)) != 0) {
+        DLOG("IPC: message does not start with the IPC magic\n");
+        return;
+    }
+
+    uint8_t *message = (uint8_t*)buf;
+    while (n > 0) {
+        DLOG("IPC: n = %d\n", n);
+        message += strlen(I3_IPC_MAGIC);
+        n -= strlen(I3_IPC_MAGIC);
+
+        /* The next 32 bit after the magic are the message size */
+        uint32_t message_size;
+        memcpy(&message_size, (uint32_t*)message, sizeof(uint32_t));
+        message += sizeof(uint32_t);
+        n -= sizeof(uint32_t);
+
+        if (message_size > n) {
+            DLOG("IPC: Either the message size was wrong or the message was not read completely, dropping\n");
+            return;
+        }
+
+        /* The last 32 bits of the header are the message type */
+        uint32_t message_type;
+        memcpy(&message_type, (uint32_t*)message, sizeof(uint32_t));
+        message += sizeof(uint32_t);
+        n -= sizeof(uint32_t);
+
+        if (message_type >= (sizeof(handlers) / sizeof(handler_t)))
+            DLOG("Unhandled message type: %d\n", message_type);
+        else {
+            handler_t h = handlers[message_type];
+            h(w->fd, message, n, message_size, message_type);
+        }
+        n -= message_size;
+        message += message_size;
+    }
+}
+
+/*
+ * Handler for activity on the listening socket, meaning that a new client
+ * has just connected and we should accept() him. Sets up the event handler
+ * for activity on the new connection and inserts the file descriptor into
+ * the list of clients.
+ *
+ */
+void ipc_new_client(EV_P_ struct ev_io *w, int revents) {
+    struct sockaddr_un peer;
+    socklen_t len = sizeof(struct sockaddr_un);
+    int client;
+    if ((client = accept(w->fd, (struct sockaddr*)&peer, &len)) < 0) {
+        if (errno == EINTR)
+            return;
+        else perror("accept()");
+        return;
+    }
+
+    set_nonblock(client);
+
+    struct ev_io *package = scalloc(sizeof(struct ev_io));
+    ev_io_init(package, ipc_receive_message, client, EV_READ);
+    ev_io_start(EV_A_ package);
+
+    DLOG("IPC: new client connected\n");
+
+    ipc_client *new = scalloc(sizeof(ipc_client));
+    new->fd = client;
+
+    TAILQ_INSERT_TAIL(&all_clients, new, clients);
+}
+
+/*
+ * Creates the UNIX domain socket at the given path, sets it to non-blocking
+ * mode, bind()s and listen()s on it.
+ *
+ */
+int ipc_create_socket(const char *filename) {
+    int sockfd;
+
+    FREE(current_socketpath);
+
+    char *resolved = resolve_tilde(filename);
+    DLOG("Creating IPC-socket at %s\n", resolved);
+    char *copy = sstrdup(resolved);
+    const char *dir = dirname(copy);
+    if (!path_exists(dir))
+        mkdirp(dir);
+    free(copy);
+
+    /* Unlink the unix domain socket before */
+    unlink(resolved);
+
+    if ((sockfd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) {
+        perror("socket()");
+        free(resolved);
+        return -1;
+    }
+
+    (void)fcntl(sockfd, F_SETFD, FD_CLOEXEC);
+
+    struct sockaddr_un addr;
+    memset(&addr, 0, sizeof(struct sockaddr_un));
+    addr.sun_family = AF_LOCAL;
+    strncpy(addr.sun_path, resolved, sizeof(addr.sun_path) - 1);
+    if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) < 0) {
+        perror("bind()");
+        free(resolved);
+        return -1;
+    }
+
+    set_nonblock(sockfd);
+
+    if (listen(sockfd, 5) < 0) {
+        perror("listen()");
+        free(resolved);
+        return -1;
+    }
+
+    current_socketpath = resolved;
+    return sockfd;
+}
diff --git a/src/load_layout.c b/src/load_layout.c
new file mode 100644 (file)
index 0000000..6e311f1
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
+#include <yajl/yajl_common.h>
+#include <yajl/yajl_gen.h>
+#include <yajl/yajl_parse.h>
+#include <yajl/yajl_version.h>
+
+#include "all.h"
+
+/* TODO: refactor the whole parsing thing */
+
+static char *last_key;
+static Con *json_node;
+static Con *to_focus;
+static bool parsing_swallows;
+static bool parsing_rect;
+static bool parsing_window_rect;
+static bool parsing_geometry;
+struct Match *current_swallow;
+
+static int json_start_map(void *ctx) {
+    LOG("start of map, last_key = %s\n", last_key);
+    if (parsing_swallows) {
+        LOG("creating new swallow\n");
+        current_swallow = smalloc(sizeof(Match));
+        match_init(current_swallow);
+        TAILQ_INSERT_TAIL(&(json_node->swallow_head), current_swallow, matches);
+    } else {
+        if (!parsing_rect && !parsing_window_rect && !parsing_geometry) {
+            if (last_key && strcasecmp(last_key, "floating_nodes") == 0) {
+                DLOG("New floating_node\n");
+                Con *ws = con_get_workspace(json_node);
+                json_node = con_new(NULL, NULL);
+                json_node->parent = ws;
+                DLOG("Parent is workspace = %p\n", ws);
+            } else {
+                Con *parent = json_node;
+                json_node = con_new(NULL, NULL);
+                json_node->parent = parent;
+            }
+        }
+    }
+    return 1;
+}
+
+static int json_end_map(void *ctx) {
+    LOG("end of map\n");
+    if (!parsing_swallows && !parsing_rect && !parsing_window_rect && !parsing_geometry) {
+        LOG("attaching\n");
+        con_attach(json_node, json_node->parent, true);
+        json_node = json_node->parent;
+    }
+    if (parsing_rect)
+        parsing_rect = false;
+    if (parsing_window_rect)
+        parsing_window_rect = false;
+    if (parsing_geometry)
+        parsing_geometry = false;
+    return 1;
+}
+
+static int json_end_array(void *ctx) {
+    LOG("end of array\n");
+    parsing_swallows = false;
+    return 1;
+}
+
+#if YAJL_MAJOR < 2
+static int json_key(void *ctx, const unsigned char *val, unsigned int len) {
+#else
+static int json_key(void *ctx, const unsigned char *val, size_t len) {
+#endif
+    LOG("key: %.*s\n", (int)len, val);
+    FREE(last_key);
+    last_key = scalloc((len+1) * sizeof(char));
+    memcpy(last_key, val, len);
+    if (strcasecmp(last_key, "swallows") == 0) {
+        parsing_swallows = true;
+    }
+    if (strcasecmp(last_key, "rect") == 0)
+        parsing_rect = true;
+    if (strcasecmp(last_key, "window_rect") == 0)
+        parsing_window_rect = true;
+    if (strcasecmp(last_key, "geometry") == 0)
+        parsing_geometry = true;
+    return 1;
+}
+
+#if YAJL_MAJOR >= 2
+static int json_string(void *ctx, const unsigned char *val, size_t len) {
+#else
+static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
+#endif
+    LOG("string: %.*s for key %s\n", len, val, last_key);
+    if (parsing_swallows) {
+        /* TODO: the other swallowing keys */
+        if (strcasecmp(last_key, "class") == 0) {
+            current_swallow->class = scalloc((len+1) * sizeof(char));
+            memcpy(current_swallow->class, val, len);
+        }
+        LOG("unhandled yet: swallow\n");
+    } else {
+        if (strcasecmp(last_key, "name") == 0) {
+            json_node->name = scalloc((len+1) * sizeof(char));
+            memcpy(json_node->name, val, len);
+        } else if (strcasecmp(last_key, "sticky_group") == 0) {
+            json_node->sticky_group = scalloc((len+1) * sizeof(char));
+            memcpy(json_node->sticky_group, val, len);
+            LOG("sticky_group of this container is %s\n", json_node->sticky_group);
+        } else if (strcasecmp(last_key, "orientation") == 0) {
+            char *buf = NULL;
+            asprintf(&buf, "%.*s", (int)len, val);
+            if (strcasecmp(buf, "none") == 0)
+                json_node->orientation = NO_ORIENTATION;
+            else if (strcasecmp(buf, "horizontal") == 0)
+                json_node->orientation = HORIZ;
+            else if (strcasecmp(buf, "vertical") == 0)
+                json_node->orientation = VERT;
+            else LOG("Unhandled orientation: %s\n", buf);
+            free(buf);
+        } else if (strcasecmp(last_key, "border") == 0) {
+            char *buf = NULL;
+            asprintf(&buf, "%.*s", (int)len, val);
+            if (strcasecmp(buf, "none") == 0)
+                json_node->border_style = BS_NONE;
+            else if (strcasecmp(buf, "1pixel") == 0)
+                json_node->border_style = BS_1PIXEL;
+            else if (strcasecmp(buf, "normal") == 0)
+                json_node->border_style = BS_NORMAL;
+            else LOG("Unhandled \"border\": %s\n", buf);
+            free(buf);
+        } else if (strcasecmp(last_key, "layout") == 0) {
+            char *buf = NULL;
+            asprintf(&buf, "%.*s", (int)len, val);
+            if (strcasecmp(buf, "default") == 0)
+                json_node->layout = L_DEFAULT;
+            else if (strcasecmp(buf, "stacked") == 0)
+                json_node->layout = L_STACKED;
+            else if (strcasecmp(buf, "tabbed") == 0)
+                json_node->layout = L_TABBED;
+            else if (strcasecmp(buf, "dockarea") == 0)
+                json_node->layout = L_DOCKAREA;
+            else if (strcasecmp(buf, "output") == 0)
+                json_node->layout = L_OUTPUT;
+            else LOG("Unhandled \"layout\": %s\n", buf);
+            free(buf);
+        }
+    }
+    return 1;
+}
+
+#if YAJL_MAJOR >= 2
+static int json_int(void *ctx, long long val) {
+#else
+static int json_int(void *ctx, long val) {
+#endif
+    LOG("int %d for key %s\n", val, last_key);
+    // TODO: remove this after the next preview release
+    if (strcasecmp(last_key, "layout") == 0) {
+        json_node->layout = val;
+    }
+    if (strcasecmp(last_key, "type") == 0) {
+        json_node->type = val;
+    }
+    if (strcasecmp(last_key, "fullscreen_mode") == 0) {
+        json_node->fullscreen_mode = val;
+    }
+    if (strcasecmp(last_key, "focused") == 0 && val == 1) {
+        to_focus = json_node;
+    }
+
+    if (strcasecmp(last_key, "num") == 0)
+        json_node->num = val;
+
+    if (parsing_rect || parsing_window_rect || parsing_geometry) {
+        Rect *r;
+        if (parsing_rect)
+            r = &(json_node->rect);
+        else if (parsing_window_rect)
+            r = &(json_node->window_rect);
+        else r = &(json_node->geometry);
+        if (strcasecmp(last_key, "x") == 0)
+            r->x = val;
+        else if (strcasecmp(last_key, "y") == 0)
+            r->y = val;
+        else if (strcasecmp(last_key, "width") == 0)
+            r->width = val;
+        else if (strcasecmp(last_key, "height") == 0)
+            r->height = val;
+        else printf("WARNING: unknown key %s in rect\n", last_key);
+        printf("rect now: (%d, %d, %d, %d)\n",
+                r->x, r->y, r->width, r->height);
+    }
+    if (parsing_swallows) {
+        if (strcasecmp(last_key, "id") == 0) {
+            current_swallow->id = val;
+        }
+        if (strcasecmp(last_key, "dock") == 0) {
+            current_swallow->dock = val;
+        }
+        if (strcasecmp(last_key, "insert_where") == 0) {
+            current_swallow->insert_where = val;
+        }
+    }
+
+    return 1;
+}
+
+static int json_double(void *ctx, double val) {
+    LOG("double %f for key %s\n", val, last_key);
+    if (strcasecmp(last_key, "percent") == 0) {
+        json_node->percent = val;
+    }
+    return 1;
+}
+
+void tree_append_json(const char *filename) {
+    /* TODO: percent of other windows are not correctly fixed at the moment */
+    FILE *f;
+    if ((f = fopen(filename, "r")) == NULL) {
+        LOG("Cannot open file\n");
+        return;
+    }
+    char *buf = malloc(65535); /* TODO */
+    int n = fread(buf, 1, 65535, f);
+    LOG("read %d bytes\n", n);
+    yajl_gen g;
+    yajl_handle hand;
+    yajl_callbacks callbacks;
+    memset(&callbacks, '\0', sizeof(yajl_callbacks));
+    callbacks.yajl_start_map = json_start_map;
+    callbacks.yajl_end_map = json_end_map;
+    callbacks.yajl_end_array = json_end_array;
+    callbacks.yajl_string = json_string;
+    callbacks.yajl_map_key = json_key;
+    callbacks.yajl_integer = json_int;
+    callbacks.yajl_double = json_double;
+#if YAJL_MAJOR >= 2
+    g = yajl_gen_alloc(NULL);
+    hand = yajl_alloc(&callbacks, NULL, (void*)g);
+#else
+    g = yajl_gen_alloc(NULL, NULL);
+    hand = yajl_alloc(&callbacks, NULL, NULL, (void*)g);
+#endif
+    yajl_status stat;
+    json_node = focused;
+    to_focus = NULL;
+    parsing_rect = false;
+    parsing_window_rect = false;
+    parsing_geometry = false;
+    setlocale(LC_NUMERIC, "C");
+    stat = yajl_parse(hand, (const unsigned char*)buf, n);
+    if (stat != yajl_status_ok)
+    {
+        unsigned char * str = yajl_get_error(hand, 1, (const unsigned char*)buf, n);
+        fprintf(stderr, "%s\n", (const char *) str);
+        yajl_free_error(hand, str);
+    }
+
+    setlocale(LC_NUMERIC, "");
+#if YAJL_MAJOR >= 2
+    yajl_complete_parse(hand);
+#else
+    yajl_parse_complete(hand);
+#endif
+
+    fclose(f);
+    if (to_focus)
+        con_focus(to_focus);
+}
diff --git a/src/log.c b/src/log.c
new file mode 100644 (file)
index 0000000..22b7fff
--- /dev/null
+++ b/src/log.c
@@ -0,0 +1,152 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * src/log.c: handles the setting of loglevels, contains the logging functions.
+ *
+ */
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include "util.h"
+#include "log.h"
+
+/* loglevels.h is autogenerated at make time */
+#include "loglevels.h"
+
+static uint64_t loglevel = 0;
+static bool verbose = true;
+static FILE *errorfile;
+char *errorfilename;
+
+/*
+ * Initializes logging by creating an error logfile in /tmp (or
+ * XDG_RUNTIME_DIR, see get_process_filename()).
+ *
+ */
+void init_logging() {
+    errorfilename = get_process_filename("errorlog");
+    if (errorfilename == NULL) {
+        ELOG("Could not initialize errorlog\n");
+        return;
+    }
+
+    errorfile = fopen(errorfilename, "w");
+}
+
+/*
+ * Set verbosity of i3. If verbose is set to true, informative messages will
+ * be printed to stdout. If verbose is set to false, only errors will be
+ * printed.
+ *
+ */
+void set_verbosity(bool _verbose) {
+    verbose = _verbose;
+}
+
+/*
+ * Enables the given loglevel.
+ *
+ */
+void add_loglevel(const char *level) {
+    /* Handle the special loglevel "all" */
+    if (strcasecmp(level, "all") == 0) {
+        loglevel = UINT64_MAX;
+        return;
+    }
+
+    for (int i = 0; i < sizeof(loglevels) / sizeof(char*); i++) {
+        if (strcasecmp(loglevels[i], level) != 0)
+            continue;
+
+        /* The position in the array (plus one) is the amount of times
+         * which we need to shift 1 to the left to get our bitmask for
+         * the specific loglevel. */
+        loglevel |= (1 << (i+1));
+        break;
+    }
+}
+
+/*
+ * Logs the given message to stdout while prefixing the current time to it.
+ * This is to be called by *LOG() which includes filename/linenumber/function.
+ *
+ */
+void vlog(char *fmt, va_list args) {
+    char timebuf[64];
+
+    /* Get current time */
+    time_t t = time(NULL);
+    /* Convert time to local time (determined by the locale) */
+    struct tm *tmp = localtime(&t);
+    /* Generate time prefix */
+    strftime(timebuf, sizeof(timebuf), "%x %X - ", tmp);
+#ifdef DEBUG_TIMING
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+    printf("%s%d.%d - ", timebuf, tv.tv_sec, tv.tv_usec);
+#else
+    printf("%s", timebuf);
+#endif
+    vprintf(fmt, args);
+}
+
+/*
+ * Logs the given message to stdout while prefixing the current time to it,
+ * but only if verbose mode is activated.
+ *
+ */
+void verboselog(char *fmt, ...) {
+    va_list args;
+
+    if (!verbose)
+        return;
+
+    va_start(args, fmt);
+    vlog(fmt, args);
+    va_end(args);
+}
+
+/*
+ * Logs the given message to stdout while prefixing the current time to it.
+ *
+ */
+void errorlog(char *fmt, ...) {
+    va_list args;
+
+    va_start(args, fmt);
+    vlog(fmt, args);
+    va_end(args);
+
+    /* also log to the error logfile, if opened */
+    va_start(args, fmt);
+    vfprintf(errorfile, fmt, args);
+    fflush(errorfile);
+    va_end(args);
+}
+
+/*
+ * Logs the given message to stdout while prefixing the current time to it,
+ * but only if the corresponding debug loglevel was activated.
+ * This is to be called by DLOG() which includes filename/linenumber
+ *
+ */
+void debuglog(uint64_t lev, char *fmt, ...) {
+    va_list args;
+
+    if ((loglevel & lev) == 0)
+        return;
+
+    va_start(args, fmt);
+    vlog(fmt, args);
+    va_end(args);
+}
diff --git a/src/main.c b/src/main.c
new file mode 100644 (file)
index 0000000..d7a5aed
--- /dev/null
@@ -0,0 +1,499 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+#include <ev.h>
+#include <fcntl.h>
+#include <limits.h>
+#include "all.h"
+
+static int xkb_event_base;
+
+int xkb_current_group;
+
+extern Con *focused;
+
+char **start_argv;
+
+xcb_connection_t *conn;
+
+xcb_screen_t *root_screen;
+xcb_window_t root;
+uint8_t root_depth;
+
+struct ev_loop *main_loop;
+
+xcb_key_symbols_t *keysyms;
+
+/* Those are our connections to X11 for use with libXcursor and XKB */
+Display *xlibdpy, *xkbdpy;
+
+/* The list of key bindings */
+struct bindings_head *bindings;
+
+/* The list of exec-lines */
+struct autostarts_head autostarts = TAILQ_HEAD_INITIALIZER(autostarts);
+
+/* The list of exec_always lines */
+struct autostarts_always_head autostarts_always = TAILQ_HEAD_INITIALIZER(autostarts_always);
+
+/* The list of assignments */
+struct assignments_head assignments = TAILQ_HEAD_INITIALIZER(assignments);
+
+/* The list of workspace assignments (which workspace should end up on which
+ * output) */
+struct ws_assignments_head ws_assignments = TAILQ_HEAD_INITIALIZER(ws_assignments);
+
+/* We hope that those are supported and set them to true */
+bool xcursor_supported = true;
+bool xkb_supported = true;
+
+/*
+ * This callback is only a dummy, see xcb_prepare_cb and xcb_check_cb.
+ * See also man libev(3): "ev_prepare" and "ev_check" - customise your event loop
+ *
+ */
+static void xcb_got_event(EV_P_ struct ev_io *w, int revents) {
+    /* empty, because xcb_prepare_cb and xcb_check_cb are used */
+}
+
+/*
+ * Flush before blocking (and waiting for new events)
+ *
+ */
+static void xcb_prepare_cb(EV_P_ ev_prepare *w, int revents) {
+    xcb_flush(conn);
+}
+
+/*
+ * Instead of polling the X connection socket we leave this to
+ * xcb_poll_for_event() which knows better than we can ever know.
+ *
+ */
+static void xcb_check_cb(EV_P_ ev_check *w, int revents) {
+    xcb_generic_event_t *event;
+
+    while ((event = xcb_poll_for_event(conn)) != NULL) {
+        if (event->response_type == 0) {
+            if (event_is_ignored(event->sequence, 0))
+                DLOG("Expected X11 Error received for sequence %x\n", event->sequence);
+            else {
+                xcb_generic_error_t *error = (xcb_generic_error_t*)event;
+                ELOG("X11 Error received! sequence 0x%x, error_code = %d\n",
+                     error->sequence, error->error_code);
+            }
+            free(event);
+            continue;
+        }
+
+        /* Strip off the highest bit (set if the event is generated) */
+        int type = (event->response_type & 0x7F);
+
+        handle_event(type, event);
+
+        free(event);
+    }
+}
+
+
+/*
+ * When using xmodmap to change the keyboard mapping, this event
+ * is only sent via XKB. Therefore, we need this special handler.
+ *
+ */
+static void xkb_got_event(EV_P_ struct ev_io *w, int revents) {
+    DLOG("Handling XKB event\n");
+    XkbEvent ev;
+
+    /* When using xmodmap, every change (!) gets an own event.
+     * Therefore, we just read all events and only handle the
+     * mapping_notify once. */
+    bool mapping_changed = false;
+    while (XPending(xkbdpy)) {
+        XNextEvent(xkbdpy, (XEvent*)&ev);
+        /* While we should never receive a non-XKB event,
+         * better do sanity checking */
+        if (ev.type != xkb_event_base)
+            continue;
+
+        if (ev.any.xkb_type == XkbMapNotify) {
+            mapping_changed = true;
+            continue;
+        }
+
+        if (ev.any.xkb_type != XkbStateNotify) {
+            ELOG("Unknown XKB event received (type %d)\n", ev.any.xkb_type);
+            continue;
+        }
+
+        /* See The XKB Extension: Library Specification, section 14.1 */
+        /* We check if the current group (each group contains
+         * two levels) has been changed. Mode_switch activates
+         * group XkbGroup2Index */
+        if (xkb_current_group == ev.state.group)
+            continue;
+
+        xkb_current_group = ev.state.group;
+
+        if (ev.state.group == XkbGroup2Index) {
+            DLOG("Mode_switch enabled\n");
+            grab_all_keys(conn, true);
+        }
+
+        if (ev.state.group == XkbGroup1Index) {
+            DLOG("Mode_switch disabled\n");
+            ungrab_all_keys(conn);
+            grab_all_keys(conn, false);
+        }
+    }
+
+    if (!mapping_changed)
+        return;
+
+    DLOG("Keyboard mapping changed, updating keybindings\n");
+    xcb_key_symbols_free(keysyms);
+    keysyms = xcb_key_symbols_alloc(conn);
+
+    xcb_get_numlock_mask(conn);
+
+    ungrab_all_keys(conn);
+    DLOG("Re-grabbing...\n");
+    translate_keysyms();
+    grab_all_keys(conn, (xkb_current_group == XkbGroup2Index));
+    DLOG("Done\n");
+}
+
+int main(int argc, char *argv[]) {
+    //parse_cmd("[ foo ] attach, attach ; focus");
+    int screens;
+    char *override_configpath = NULL;
+    bool autostart = true;
+    char *layout_path = NULL;
+    bool delete_layout_path = false;
+    bool only_check_config = false;
+    bool force_xinerama = false;
+    bool disable_signalhandler = false;
+    static struct option long_options[] = {
+        {"no-autostart", no_argument, 0, 'a'},
+        {"config", required_argument, 0, 'c'},
+        {"version", no_argument, 0, 'v'},
+        {"help", no_argument, 0, 'h'},
+        {"layout", required_argument, 0, 'L'},
+        {"restart", required_argument, 0, 0},
+        {"force-xinerama", no_argument, 0, 0},
+        {"disable-signalhandler", no_argument, 0, 0},
+        {0, 0, 0, 0}
+    };
+    int option_index = 0, opt;
+
+    setlocale(LC_ALL, "");
+
+    /* Disable output buffering to make redirects in .xsession actually useful for debugging */
+    if (!isatty(fileno(stdout)))
+        setbuf(stdout, NULL);
+
+    init_logging();
+
+    start_argv = argv;
+
+    while ((opt = getopt_long(argc, argv, "c:CvaL:hld:V", long_options, &option_index)) != -1) {
+        switch (opt) {
+            case 'a':
+                LOG("Autostart disabled using -a\n");
+                autostart = false;
+                break;
+            case 'L':
+                FREE(layout_path);
+                layout_path = sstrdup(optarg);
+                delete_layout_path = false;
+                break;
+            case 'c':
+                FREE(override_configpath);
+                override_configpath = sstrdup(optarg);
+                break;
+            case 'C':
+                LOG("Checking configuration file only (-C)\n");
+                only_check_config = true;
+                break;
+            case 'v':
+                printf("i3 version " I3_VERSION " © 2009-2011 Michael Stapelberg and contributors\n");
+                exit(EXIT_SUCCESS);
+            case 'V':
+                set_verbosity(true);
+                break;
+            case 'd':
+                LOG("Enabling debug loglevel %s\n", optarg);
+                add_loglevel(optarg);
+                break;
+            case 'l':
+                /* DEPRECATED, ignored for the next 3 versions (3.e, 3.f, 3.g) */
+                break;
+            case 0:
+                if (strcmp(long_options[option_index].name, "force-xinerama") == 0) {
+                    force_xinerama = true;
+                    ELOG("Using Xinerama instead of RandR. This option should be "
+                         "avoided at all cost because it does not refresh the list "
+                         "of screens, so you cannot configure displays at runtime. "
+                         "Please check if your driver really does not support RandR "
+                         "and disable this option as soon as you can.\n");
+                    break;
+                } else if (strcmp(long_options[option_index].name, "disable-signalhandler") == 0) {
+                    disable_signalhandler = true;
+                    break;
+                } else if (strcmp(long_options[option_index].name, "restart") == 0) {
+                    FREE(layout_path);
+                    layout_path = sstrdup(optarg);
+                    delete_layout_path = true;
+                    break;
+                }
+                /* fall-through */
+            default:
+                fprintf(stderr, "Usage: %s [-c configfile] [-d loglevel] [-a] [-v] [-V] [-C]\n", argv[0]);
+                fprintf(stderr, "\n");
+                fprintf(stderr, "-a: disable autostart\n");
+                fprintf(stderr, "-L <layoutfile>: load the layout from <layoutfile>\n");
+                fprintf(stderr, "-v: display version and exit\n");
+                fprintf(stderr, "-V: enable verbose mode\n");
+                fprintf(stderr, "-d <loglevel>: enable debug loglevel <loglevel>\n");
+                fprintf(stderr, "-c <configfile>: use the provided configfile instead\n");
+                fprintf(stderr, "-C: check configuration file and exit\n");
+                fprintf(stderr, "--force-xinerama: Use Xinerama instead of RandR. This "
+                                "option should only be used if you are stuck with the "
+                                "nvidia closed source driver which does not support RandR.\n");
+                exit(EXIT_FAILURE);
+        }
+    }
+
+    LOG("i3 (tree) version " I3_VERSION " starting\n");
+
+    conn = xcb_connect(NULL, &screens);
+    if (xcb_connection_has_error(conn))
+        errx(EXIT_FAILURE, "Cannot open display\n");
+
+    /* Initialize the libev event loop. This needs to be done before loading
+     * the config file because the parser will install an ev_child watcher
+     * for the nagbar when config errors are found. */
+    main_loop = EV_DEFAULT;
+    if (main_loop == NULL)
+            die("Could not initialize libev. Bad LIBEV_FLAGS?\n");
+
+    root_screen = xcb_aux_get_screen(conn, screens);
+    root = root_screen->root;
+    root_depth = root_screen->root_depth;
+    xcb_get_geometry_cookie_t gcookie = xcb_get_geometry(conn, root);
+
+    load_configuration(conn, override_configpath, false);
+    if (only_check_config) {
+        LOG("Done checking configuration file. Exiting.\n");
+        exit(0);
+    }
+
+    if (config.ipc_socket_path == NULL) {
+        /* Fall back to a file name in /tmp/ based on the PID */
+        if ((config.ipc_socket_path = getenv("I3SOCK")) == NULL)
+            config.ipc_socket_path = get_process_filename("ipc-socket");
+        else
+            config.ipc_socket_path = sstrdup(config.ipc_socket_path);
+    }
+
+    uint32_t mask = XCB_CW_EVENT_MASK;
+    uint32_t values[] = { XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                          XCB_EVENT_MASK_STRUCTURE_NOTIFY |         /* when the user adds a screen (e.g. video
+                                                                           projector), the root window gets a
+                                                                           ConfigureNotify */
+                          XCB_EVENT_MASK_POINTER_MOTION |
+                          XCB_EVENT_MASK_PROPERTY_CHANGE |
+                          XCB_EVENT_MASK_ENTER_WINDOW };
+    xcb_void_cookie_t cookie;
+    cookie = xcb_change_window_attributes_checked(conn, root, mask, values);
+    check_error(conn, cookie, "Another window manager seems to be running");
+
+    xcb_get_geometry_reply_t *greply = xcb_get_geometry_reply(conn, gcookie, NULL);
+    if (greply == NULL) {
+        ELOG("Could not get geometry of the root window, exiting\n");
+        return 1;
+    }
+    DLOG("root geometry reply: (%d, %d) %d x %d\n", greply->x, greply->y, greply->width, greply->height);
+
+    /* Place requests for the atoms we need as soon as possible */
+    #define xmacro(atom) \
+        xcb_intern_atom_cookie_t atom ## _cookie = xcb_intern_atom(conn, 0, strlen(#atom), #atom);
+    #include "atoms.xmacro"
+    #undef xmacro
+
+    /* Initialize the Xlib connection */
+    xlibdpy = xkbdpy = XOpenDisplay(NULL);
+
+    /* Try to load the X cursors and initialize the XKB extension */
+    if (xlibdpy == NULL) {
+        ELOG("ERROR: XOpenDisplay() failed, disabling libXcursor/XKB support\n");
+        xcursor_supported = false;
+        xkb_supported = false;
+    } else if (fcntl(ConnectionNumber(xlibdpy), F_SETFD, FD_CLOEXEC) == -1) {
+        ELOG("Could not set FD_CLOEXEC on xkbdpy\n");
+        return 1;
+    } else {
+        xcursor_load_cursors();
+        /*init_xkb();*/
+    }
+
+    /* Set a cursor for the root window (otherwise the root window will show no
+       cursor until the first client is launched). */
+    if (xcursor_supported) {
+        xcursor_set_root_cursor();
+    } else {
+        xcb_cursor_t cursor_id = xcb_generate_id(conn);
+        i3Font cursor_font = load_font("cursor", false);
+        int xcb_cursor = xcursor_get_xcb_cursor(XCURSOR_CURSOR_POINTER);
+        xcb_create_glyph_cursor(conn, cursor_id, cursor_font.id, cursor_font.id,
+                xcb_cursor, xcb_cursor + 1, 0, 0, 0, 65535, 65535, 65535);
+        xcb_change_window_attributes(conn, root, XCB_CW_CURSOR, &cursor_id);
+        xcb_free_cursor(conn, cursor_id);
+    }
+
+    if (xkb_supported) {
+        int errBase,
+            major = XkbMajorVersion,
+            minor = XkbMinorVersion;
+
+        if (fcntl(ConnectionNumber(xkbdpy), F_SETFD, FD_CLOEXEC) == -1) {
+            fprintf(stderr, "Could not set FD_CLOEXEC on xkbdpy\n");
+            return 1;
+        }
+
+        int i1;
+        if (!XkbQueryExtension(xkbdpy,&i1,&xkb_event_base,&errBase,&major,&minor)) {
+            fprintf(stderr, "XKB not supported by X-server\n");
+            return 1;
+        }
+        /* end of ugliness */
+
+        if (!XkbSelectEvents(xkbdpy, XkbUseCoreKbd,
+                             XkbMapNotifyMask | XkbStateNotifyMask,
+                             XkbMapNotifyMask | XkbStateNotifyMask)) {
+            fprintf(stderr, "Could not set XKB event mask\n");
+            return 1;
+        }
+    }
+
+    /* Setup NetWM atoms */
+    #define xmacro(name) \
+        do { \
+            xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(conn, name ## _cookie, NULL); \
+            if (!reply) { \
+                ELOG("Could not get atom " #name "\n"); \
+                exit(-1); \
+            } \
+            A_ ## name = reply->atom; \
+            free(reply); \
+        } while (0);
+    #include "atoms.xmacro"
+    #undef xmacro
+
+    property_handlers_init();
+
+    /* Set up the atoms we support */
+    xcb_atom_t supported_atoms[] = {
+#define xmacro(atom) A_ ## atom,
+#include "atoms.xmacro"
+#undef xmacro
+    };
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A__NET_SUPPORTED, A_ATOM, 32, 15, supported_atoms);
+    /* Set up the window manager’s name */
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A__NET_SUPPORTING_WM_CHECK, A_WINDOW, 32, 1, &root);
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A__NET_WM_NAME, A_UTF8_STRING, 8, strlen("i3"), "i3");
+
+    keysyms = xcb_key_symbols_alloc(conn);
+
+    xcb_get_numlock_mask(conn);
+
+    translate_keysyms();
+    grab_all_keys(conn, false);
+
+    bool needs_tree_init = true;
+    if (layout_path) {
+        LOG("Trying to restore the layout from %s...", layout_path);
+        needs_tree_init = !tree_restore(layout_path, greply);
+        if (delete_layout_path)
+            unlink(layout_path);
+        free(layout_path);
+    }
+    if (needs_tree_init)
+        tree_init(greply);
+
+    free(greply);
+
+    if (force_xinerama) {
+        xinerama_init();
+    } else {
+        DLOG("Checking for XRandR...\n");
+        randr_init(&randr_base);
+    }
+
+    tree_render();
+
+    /* Create the UNIX domain socket for IPC */
+    int ipc_socket = ipc_create_socket(config.ipc_socket_path);
+    if (ipc_socket == -1) {
+        ELOG("Could not create the IPC socket, IPC disabled\n");
+    } else {
+        free(config.ipc_socket_path);
+        struct ev_io *ipc_io = scalloc(sizeof(struct ev_io));
+        ev_io_init(ipc_io, ipc_new_client, ipc_socket, EV_READ);
+        ev_io_start(main_loop, ipc_io);
+    }
+
+    /* Set up i3 specific atoms like I3_SOCKET_PATH and I3_CONFIG_PATH */
+    x_set_i3_atoms();
+
+    struct ev_io *xcb_watcher = scalloc(sizeof(struct ev_io));
+    struct ev_io *xkb = scalloc(sizeof(struct ev_io));
+    struct ev_check *xcb_check = scalloc(sizeof(struct ev_check));
+    struct ev_prepare *xcb_prepare = scalloc(sizeof(struct ev_prepare));
+
+    ev_io_init(xcb_watcher, xcb_got_event, xcb_get_file_descriptor(conn), EV_READ);
+    ev_io_start(main_loop, xcb_watcher);
+
+
+    if (xkb_supported) {
+        ev_io_init(xkb, xkb_got_event, ConnectionNumber(xkbdpy), EV_READ);
+        ev_io_start(main_loop, xkb);
+
+        /* Flush the buffer so that libev can properly get new events */
+        XFlush(xkbdpy);
+    }
+
+    ev_check_init(xcb_check, xcb_check_cb);
+    ev_check_start(main_loop, xcb_check);
+
+    ev_prepare_init(xcb_prepare, xcb_prepare_cb);
+    ev_prepare_start(main_loop, xcb_prepare);
+
+    xcb_flush(conn);
+
+    manage_existing_windows(root);
+
+    if (!disable_signalhandler)
+        setup_signal_handler();
+
+    /* Ignore SIGPIPE to survive errors when an IPC client disconnects
+     * while we are sending him a message */
+    signal(SIGPIPE, SIG_IGN);
+
+    /* Autostarting exec-lines */
+    if (autostart) {
+        struct Autostart *exec;
+        TAILQ_FOREACH(exec, &autostarts, autostarts) {
+            LOG("auto-starting %s\n", exec->command);
+            start_application(exec->command);
+        }
+    }
+
+    /* Autostarting exec_always-lines */
+    struct Autostart *exec_always;
+    TAILQ_FOREACH(exec_always, &autostarts_always, autostarts_always) {
+        LOG("auto-starting (always!) %s\n", exec_always->command);
+        start_application(exec_always->command);
+    }
+
+    ev_loop(main_loop, 0);
+}
diff --git a/src/manage.c b/src/manage.c
new file mode 100644 (file)
index 0000000..68c91e7
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * manage.c: Contains all functions for initially managing new windows
+ *           (or existing ones on restart).
+ *
+ */
+
+#include "all.h"
+
+/*
+ * Go through all existing windows (if the window manager is restarted) and manage them
+ *
+ */
+void manage_existing_windows(xcb_window_t root) {
+    xcb_query_tree_reply_t *reply;
+    int i, len;
+    xcb_window_t *children;
+    xcb_get_window_attributes_cookie_t *cookies;
+
+    /* Get the tree of windows whose parent is the root window (= all) */
+    if ((reply = xcb_query_tree_reply(conn, xcb_query_tree(conn, root), 0)) == NULL)
+        return;
+
+    len = xcb_query_tree_children_length(reply);
+    cookies = smalloc(len * sizeof(*cookies));
+
+    /* Request the window attributes for every window */
+    children = xcb_query_tree_children(reply);
+    for (i = 0; i < len; ++i)
+        cookies[i] = xcb_get_window_attributes(conn, children[i]);
+
+    /* Call manage_window with the attributes for every window */
+    for (i = 0; i < len; ++i)
+        manage_window(children[i], cookies[i], true);
+
+    free(reply);
+    free(cookies);
+}
+
+/*
+ * Restores the geometry of each window by reparenting it to the root window
+ * at the position of its frame.
+ *
+ * This is to be called *only* before exiting/restarting i3 because of evil
+ * side-effects which are to be expected when continuing to run i3.
+ *
+ */
+void restore_geometry() {
+    DLOG("Restoring geometry\n");
+
+    Con *con;
+    TAILQ_FOREACH(con, &all_cons, all_cons)
+        if (con->window) {
+            DLOG("Re-adding X11 border of %d px\n", con->border_width);
+            con->window_rect.width += (2 * con->border_width);
+            con->window_rect.height += (2 * con->border_width);
+            xcb_set_window_rect(conn, con->window->id, con->window_rect);
+            DLOG("placing window %08x at %d %d\n", con->window->id, con->rect.x, con->rect.y);
+            xcb_reparent_window(conn, con->window->id, root,
+                                con->rect.x, con->rect.y);
+        }
+
+    /* Make sure our changes reach the X server, we restart/exit now */
+    xcb_flush(conn);
+}
+
+/*
+ * Do some sanity checks and then reparent the window.
+ *
+ */
+void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cookie,
+                   bool needs_to_be_mapped) {
+    xcb_drawable_t d = { window };
+    xcb_get_geometry_cookie_t geomc;
+    xcb_get_geometry_reply_t *geom;
+    xcb_get_window_attributes_reply_t *attr = NULL;
+
+    DLOG("---> looking at window 0x%08x\n", window);
+
+    xcb_get_property_cookie_t wm_type_cookie, strut_cookie, state_cookie,
+                              utf8_title_cookie, title_cookie,
+                              class_cookie, leader_cookie, transient_cookie;
+
+
+    geomc = xcb_get_geometry(conn, d);
+#define FREE_GEOMETRY() do { \
+    if ((geom = xcb_get_geometry_reply(conn, geomc, 0)) != NULL) \
+        free(geom); \
+} while (0)
+
+    /* Check if the window is mapped (it could be not mapped when intializing and
+       calling manage_window() for every window) */
+    if ((attr = xcb_get_window_attributes_reply(conn, cookie, 0)) == NULL) {
+        DLOG("Could not get attributes\n");
+        FREE_GEOMETRY();
+        return;
+    }
+
+    if (needs_to_be_mapped && attr->map_state != XCB_MAP_STATE_VIEWABLE) {
+        DLOG("map_state unviewable\n");
+        FREE_GEOMETRY();
+        goto out;
+    }
+
+    /* Don’t manage clients with the override_redirect flag */
+    DLOG("override_redirect is %d\n", attr->override_redirect);
+    if (attr->override_redirect) {
+        FREE_GEOMETRY();
+        goto out;
+    }
+
+    /* Check if the window is already managed */
+    if (con_by_window_id(window) != NULL) {
+        DLOG("already managed (by con %p)\n", con_by_window_id(window));
+        FREE_GEOMETRY();
+        goto out;
+    }
+
+    /* Get the initial geometry (position, size, …) */
+    if ((geom = xcb_get_geometry_reply(conn, geomc, 0)) == NULL) {
+        DLOG("could not get geometry\n");
+        goto out;
+    }
+
+    uint32_t values[1];
+
+    /* Set a temporary event mask for the new window, consisting only of
+     * PropertyChange. We need to be notified of PropertyChanges because the
+     * client can change its properties *after* we requested them but *before*
+     * we actually reparented it and have set our final event mask. */
+    values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE;
+    xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK, values);
+
+#define GET_PROPERTY(atom, len) xcb_get_property(conn, false, window, atom, XCB_GET_PROPERTY_TYPE_ANY, 0, len)
+
+    wm_type_cookie = GET_PROPERTY(A__NET_WM_WINDOW_TYPE, UINT32_MAX);
+    strut_cookie = GET_PROPERTY(A__NET_WM_STRUT_PARTIAL, UINT32_MAX);
+    state_cookie = GET_PROPERTY(A__NET_WM_STATE, UINT32_MAX);
+    utf8_title_cookie = GET_PROPERTY(A__NET_WM_NAME, 128);
+    leader_cookie = GET_PROPERTY(A_WM_CLIENT_LEADER, UINT32_MAX);
+    transient_cookie = GET_PROPERTY(A_WM_TRANSIENT_FOR, UINT32_MAX);
+    title_cookie = GET_PROPERTY(A_WM_NAME, 128);
+    class_cookie = GET_PROPERTY(A_WM_CLASS, 128);
+    /* TODO: also get wm_normal_hints here. implement after we got rid of xcb-event */
+
+    DLOG("reparenting!\n");
+
+    i3Window *cwindow = scalloc(sizeof(i3Window));
+    cwindow->id = window;
+
+    /* We need to grab the mouse buttons for click to focus */
+    xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS,
+                    XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, root, XCB_NONE,
+                    1 /* left mouse button */,
+                    XCB_BUTTON_MASK_ANY /* don’t filter for any modifiers */);
+
+    xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS,
+                    XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC, root, XCB_NONE,
+                    3 /* right mouse button */,
+                    XCB_BUTTON_MASK_ANY /* don’t filter for any modifiers */);
+
+
+    /* update as much information as possible so far (some replies may be NULL) */
+    window_update_class(cwindow, xcb_get_property_reply(conn, class_cookie, NULL), true);
+    window_update_name_legacy(cwindow, xcb_get_property_reply(conn, title_cookie, NULL), true);
+    window_update_name(cwindow, xcb_get_property_reply(conn, utf8_title_cookie, NULL), true);
+    window_update_leader(cwindow, xcb_get_property_reply(conn, leader_cookie, NULL));
+    window_update_transient_for(cwindow, xcb_get_property_reply(conn, transient_cookie, NULL));
+    window_update_strut_partial(cwindow, xcb_get_property_reply(conn, strut_cookie, NULL));
+
+    /* check if the window needs WM_TAKE_FOCUS */
+    cwindow->needs_take_focus = window_supports_protocol(cwindow->id, A_WM_TAKE_FOCUS);
+
+    /* Where to start searching for a container that swallows the new one? */
+    Con *search_at = croot;
+
+    xcb_get_property_reply_t *reply = xcb_get_property_reply(conn, wm_type_cookie, NULL);
+    if (xcb_reply_contains_atom(reply, A__NET_WM_WINDOW_TYPE_DOCK)) {
+        LOG("This window is of type dock\n");
+        Output *output = get_output_containing(geom->x, geom->y);
+        if (output != NULL) {
+            DLOG("Starting search at output %s\n", output->name);
+            search_at = output->con;
+        }
+
+        /* find out the desired position of this dock window */
+        if (cwindow->reserved.top > 0 && cwindow->reserved.bottom == 0) {
+            DLOG("Top dock client\n");
+            cwindow->dock = W_DOCK_TOP;
+        } else if (cwindow->reserved.top == 0 && cwindow->reserved.bottom > 0) {
+            DLOG("Bottom dock client\n");
+            cwindow->dock = W_DOCK_BOTTOM;
+        } else {
+            DLOG("Ignoring invalid reserved edges (_NET_WM_STRUT_PARTIAL), using position as fallback:\n");
+            if (geom->y < (search_at->rect.height / 2)) {
+                DLOG("geom->y = %d < rect.height / 2 = %d, it is a top dock client\n",
+                     geom->y, (search_at->rect.height / 2));
+                cwindow->dock = W_DOCK_TOP;
+            } else {
+                DLOG("geom->y = %d >= rect.height / 2 = %d, it is a bottom dock client\n",
+                     geom->y, (search_at->rect.height / 2));
+                cwindow->dock = W_DOCK_BOTTOM;
+            }
+        }
+    }
+
+    DLOG("Initial geometry: (%d, %d, %d, %d)\n", geom->x, geom->y, geom->width, geom->height);
+
+    Con *nc = NULL;
+    Match *match;
+    Assignment *assignment;
+
+    /* TODO: two matches for one container */
+
+    /* See if any container swallows this new window */
+    nc = con_for_window(search_at, cwindow, &match);
+    if (nc == NULL) {
+        /* If not, check if it is assigned to a specific workspace / output */
+        if ((assignment = assignment_for(cwindow, A_TO_WORKSPACE | A_TO_OUTPUT))) {
+            DLOG("Assignment matches (%p)\n", match);
+            if (assignment->type == A_TO_WORKSPACE) {
+                nc = con_descend_focused(workspace_get(assignment->dest.workspace, NULL));
+                DLOG("focused on ws %s: %p / %s\n", assignment->dest.workspace, nc, nc->name);
+                if (nc->type == CT_WORKSPACE)
+                    nc = tree_open_con(nc, cwindow);
+                else nc = tree_open_con(nc->parent, cwindow);
+            }
+        /* TODO: handle assignments with type == A_TO_OUTPUT */
+        } else {
+            /* If not, insert it at the currently focused position */
+            if (focused->type == CT_CON && con_accepts_window(focused)) {
+                LOG("using current container, focused = %p, focused->name = %s\n",
+                                focused, focused->name);
+                nc = focused;
+            } else nc = tree_open_con(NULL, cwindow);
+        }
+    } else {
+        /* M_BELOW inserts the new window as a child of the one which was
+         * matched (e.g. dock areas) */
+        if (match != NULL && match->insert_where == M_BELOW) {
+            nc = tree_open_con(nc, cwindow);
+        }
+    }
+
+    DLOG("new container = %p\n", nc);
+    nc->window = cwindow;
+    x_reinit(nc);
+
+    nc->border_width = geom->border_width;
+
+    char *name;
+    asprintf(&name, "[i3 con] container around %p", cwindow);
+    x_set_name(nc, name);
+    free(name);
+
+    Con *ws = con_get_workspace(nc);
+    Con *fs = (ws ? con_get_fullscreen_con(ws, CF_OUTPUT) : NULL);
+    if (fs == NULL)
+        fs = con_get_fullscreen_con(croot, CF_GLOBAL);
+
+    if (fs == NULL) {
+        DLOG("Not in fullscreen mode, focusing\n");
+        if (!cwindow->dock)
+            con_focus(nc);
+        else DLOG("dock, not focusing\n");
+    } else {
+        DLOG("fs = %p, ws = %p, not focusing\n", fs, ws);
+        /* Insert the new container in focus stack *after* the currently
+         * focused (fullscreen) con. This way, the new container will be
+         * focused after we return from fullscreen mode */
+        Con *first = TAILQ_FIRST(&(nc->parent->focus_head));
+        if (first != nc) {
+            /* We only modify the focus stack if the container is not already
+             * the first one. This can happen when existing containers swallow
+             * new windows, for example when restarting. */
+            TAILQ_REMOVE(&(nc->parent->focus_head), nc, focused);
+            TAILQ_INSERT_AFTER(&(nc->parent->focus_head), first, nc, focused);
+        }
+    }
+
+    /* set floating if necessary */
+    bool want_floating = false;
+    if (xcb_reply_contains_atom(reply, A__NET_WM_WINDOW_TYPE_DIALOG) ||
+        xcb_reply_contains_atom(reply, A__NET_WM_WINDOW_TYPE_UTILITY) ||
+        xcb_reply_contains_atom(reply, A__NET_WM_WINDOW_TYPE_TOOLBAR) ||
+        xcb_reply_contains_atom(reply, A__NET_WM_WINDOW_TYPE_SPLASH)) {
+        LOG("This window is a dialog window, setting floating\n");
+        want_floating = true;
+    }
+
+    FREE(reply);
+
+    if (cwindow->transient_for != XCB_NONE ||
+        (cwindow->leader != XCB_NONE &&
+         cwindow->leader != cwindow->id &&
+         con_by_window_id(cwindow->leader) != NULL)) {
+        LOG("This window is transiert for another window, setting floating\n");
+        want_floating = true;
+
+        if (config.popup_during_fullscreen == PDF_LEAVE_FULLSCREEN &&
+            fs != NULL) {
+            LOG("There is a fullscreen window, leaving fullscreen mode\n");
+            con_toggle_fullscreen(fs, CF_OUTPUT);
+        }
+    }
+
+    /* dock clients cannot be floating, that makes no sense */
+    if (cwindow->dock)
+        want_floating = false;
+
+    /* Store the requested geometry. The width/height gets raised to at least
+     * 75x50 when entering floating mode, which is the minimum size for a
+     * window to be useful (smaller windows are usually overlays/toolbars/…
+     * which are not managed by the wm anyways). We store the original geometry
+     * here because it’s used for dock clients. */
+    nc->geometry = (Rect){ geom->x, geom->y, geom->width, geom->height };
+
+    if (want_floating) {
+        DLOG("geometry = %d x %d\n", nc->geometry.width, nc->geometry.height);
+        floating_enable(nc, false);
+    }
+
+    /* to avoid getting an UnmapNotify event due to reparenting, we temporarily
+     * declare no interest in any state change event of this window */
+    values[0] = XCB_NONE;
+    xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK, values);
+
+    xcb_void_cookie_t rcookie = xcb_reparent_window_checked(conn, window, nc->frame, 0, 0);
+    if (xcb_request_check(conn, rcookie) != NULL) {
+        LOG("Could not reparent the window, aborting\n");
+        goto geom_out;
+    }
+
+    values[0] = CHILD_EVENT_MASK & ~XCB_EVENT_MASK_ENTER_WINDOW;
+    xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK, values);
+    xcb_flush(conn);
+
+    reply = xcb_get_property_reply(conn, state_cookie, NULL);
+    if (xcb_reply_contains_atom(reply, A__NET_WM_STATE_FULLSCREEN))
+        con_toggle_fullscreen(nc, CF_OUTPUT);
+
+    FREE(reply);
+
+    /* Put the client inside the save set. Upon termination (whether killed or
+     * normal exit does not matter) of the window manager, these clients will
+     * be correctly reparented to their most closest living ancestor (=
+     * cleanup) */
+    xcb_change_save_set(conn, XCB_SET_MODE_INSERT, window);
+
+    /* Check if any assignments match */
+    run_assignments(cwindow);
+
+    tree_render();
+
+geom_out:
+    free(geom);
+out:
+    free(attr);
+    return;
+}
diff --git a/src/match.c b/src/match.c
new file mode 100644 (file)
index 0000000..3a34611
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * A "match" is a data structure which acts like a mask or expression to match
+ * certain windows or not. For example, when using commands, you can specify a
+ * command like this: [title="*Firefox*"] kill. The title member of the match
+ * data structure will then be filled and i3 will check each window using
+ * match_matches_window() to find the windows affected by this command.
+ *
+ */
+
+#include "all.h"
+
+/*
+ * Initializes the Match data structure. This function is necessary because the
+ * members representing boolean values (like dock) need to be initialized with
+ * -1 instead of 0.
+ *
+ */
+void match_init(Match *match) {
+    memset(match, 0, sizeof(Match));
+    match->dock = -1;
+}
+
+/*
+ * Check if a match is empty. This is necessary while parsing commands to see
+ * whether the user specified a match at all.
+ *
+ */
+bool match_is_empty(Match *match) {
+    /* we cannot simply use memcmp() because the structure is part of a
+     * TAILQ and I don’t want to start with things like assuming that the
+     * last member of a struct really is at the end in memory… */
+    return (match->title == NULL &&
+            match->mark == NULL &&
+            match->application == NULL &&
+            match->class == NULL &&
+            match->instance == NULL &&
+            match->id == XCB_NONE &&
+            match->con_id == NULL &&
+            match->dock == -1 &&
+            match->floating == M_ANY);
+}
+
+/*
+ * Copies the data of a match from src to dest.
+ *
+ */
+void match_copy(Match *dest, Match *src) {
+    memcpy(dest, src, sizeof(Match));
+
+#define STRDUP(field) do { \
+    if (src->field != NULL) \
+        dest->field = sstrdup(src->field); \
+} while (0)
+
+    STRDUP(title);
+    STRDUP(mark);
+    STRDUP(application);
+    STRDUP(class);
+    STRDUP(instance);
+}
+
+/*
+ * Check if a match data structure matches the given window.
+ *
+ */
+bool match_matches_window(Match *match, i3Window *window) {
+    LOG("checking window %d (%s)\n", window->id, window->class_class);
+
+    /* TODO: pcre, full matching, … */
+    if (match->class != NULL) {
+        if (window->class_class != NULL && strcasecmp(match->class, window->class_class) == 0) {
+            LOG("window class matches (%s)\n", window->class_class);
+        } else {
+            LOG("window class does not match\n");
+            return false;
+        }
+    }
+
+    if (match->instance != NULL) {
+        if (window->class_instance != NULL && strcasecmp(match->instance, window->class_instance) == 0) {
+            LOG("window instance matches (%s)\n", window->class_instance);
+        } else {
+            LOG("window instance does not match\n");
+            return false;
+        }
+    }
+
+    if (match->id != XCB_NONE) {
+        if (window->id == match->id) {
+            LOG("match made by window id (%d)\n", window->id);
+        } else {
+            LOG("window id does not match\n");
+            return false;
+        }
+    }
+
+    /* TODO: pcre match */
+    if (match->title != NULL) {
+        if (window->name_json != NULL && strcasecmp(match->title, window->name_json) == 0) {
+            LOG("title matches (%s)\n", window->name_json);
+        } else {
+            LOG("title does not match\n");
+            return false;
+        }
+    }
+
+    if (match->dock != -1) {
+        LOG("match->dock = %d, window->dock = %d\n", match->dock, window->dock);
+        if ((window->dock == W_DOCK_TOP && match->dock == M_DOCK_TOP) ||
+         (window->dock == W_DOCK_BOTTOM && match->dock == M_DOCK_BOTTOM) ||
+         ((window->dock == W_DOCK_TOP || window->dock == W_DOCK_BOTTOM) &&
+          match->dock == M_DOCK_ANY) ||
+         (window->dock == W_NODOCK && match->dock == M_NODOCK)) {
+            LOG("dock status matches\n");
+        } else {
+            LOG("dock status does not match\n");
+            return false;
+        }
+    }
+
+    /* We don’t check the mark because this function is not even called when
+     * the mark would have matched - it is checked in cmdparse.y itself */
+    if (match->mark != NULL) {
+        LOG("mark does not match\n");
+        return false;
+    }
+
+    return true;
+}
diff --git a/src/move.c b/src/move.c
new file mode 100644 (file)
index 0000000..37fc0d3
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#include "all.h"
+#include "cmdparse.tab.h"
+
+typedef enum { BEFORE, AFTER } position_t;
+
+/*
+ * This function detaches 'con' from its parent and inserts it either before or
+ * after 'target'.
+ *
+ */
+static void insert_con_into(Con *con, Con *target, position_t position) {
+    Con *parent = target->parent;
+    /* We need to preserve the old con->parent. While it might still be used to
+     * insert the entry before/after it, we call the on_remove_child callback
+     * afterwards which might then close the con if it is empty. */
+    Con *old_parent = con->parent;
+
+    con_detach(con);
+    con_fix_percent(con->parent);
+
+    /* When moving to a workspace, we respect the user’s configured
+     * workspace_layout */
+    if (parent->type == CT_WORKSPACE) {
+        Con *split = workspace_attach_to(parent);
+        if (split != parent) {
+            DLOG("Got a new split con, using that one instead\n");
+            con->parent = split;
+            con_attach(con, split, false);
+            DLOG("attached\n");
+            con->percent = 0.0;
+            con_fix_percent(split);
+            con = split;
+            DLOG("ok, continuing with con %p instead\n", con);
+            con_detach(con);
+        }
+    }
+
+    con->parent = parent;
+
+    if (position == BEFORE) {
+        TAILQ_INSERT_BEFORE(target, con, nodes);
+        TAILQ_INSERT_HEAD(&(parent->focus_head), con, focused);
+    } else if (position == AFTER) {
+        TAILQ_INSERT_AFTER(&(parent->nodes_head), target, con, nodes);
+        TAILQ_INSERT_HEAD(&(parent->focus_head), con, focused);
+    }
+
+    /* Pretend the con was just opened with regards to size percent values.
+     * Since the con is moved to a completely different con, the old value
+     * does not make sense anyways. */
+    con->percent = 0.0;
+    con_fix_percent(parent);
+
+    CALL(old_parent, on_remove_child);
+}
+
+/*
+ * This function detaches 'con' from its parent and inserts it at the given
+ * workspace.
+ *
+ */
+static void attach_to_workspace(Con *con, Con *ws) {
+    con_detach(con);
+    con_fix_percent(con->parent);
+
+    CALL(con->parent, on_remove_child);
+
+    con->parent = ws;
+
+    TAILQ_INSERT_TAIL(&(ws->nodes_head), con, nodes);
+    TAILQ_INSERT_TAIL(&(ws->focus_head), con, focused);
+
+    /* Pretend the con was just opened with regards to size percent values.
+     * Since the con is moved to a completely different con, the old value
+     * does not make sense anyways. */
+    con->percent = 0.0;
+    con_fix_percent(ws);
+}
+
+/*
+ * Moves the current container in the given direction (TOK_LEFT, TOK_RIGHT,
+ * TOK_UP, TOK_DOWN from cmdparse.l)
+ *
+ */
+void tree_move(int direction) {
+    DLOG("Moving in direction %d\n", direction);
+    /* 1: get the first parent with the same orientation */
+    Con *con = focused;
+
+    if (con->type == CT_WORKSPACE) {
+        DLOG("Not moving workspace\n");
+        return;
+    }
+
+    if (con->parent->type == CT_WORKSPACE && con_num_children(con->parent) == 1) {
+        DLOG("This is the only con on this workspace, not doing anything\n");
+        return;
+    }
+
+    orientation_t o = (direction == TOK_LEFT || direction == TOK_RIGHT ? HORIZ : VERT);
+
+    Con *same_orientation = con_parent_with_orientation(con, o);
+    /* The do {} while is used to 'restart' at this point with a different
+     * same_orientation, see the very last lines before the end of this block
+     * */
+    do {
+        /* There is no parent container with the same orientation */
+        if (!same_orientation) {
+            if (con_is_floating(con)) {
+                /* this is a floating con, we just disable floating */
+                floating_disable(con, true);
+                return;
+            }
+            if (con_inside_floating(con)) {
+                /* 'con' should be moved out of a floating container */
+                DLOG("Inside floating, moving to workspace\n");
+                attach_to_workspace(con, con_get_workspace(con));
+                goto end;
+            }
+            DLOG("Force-changing orientation\n");
+            ws_force_orientation(con_get_workspace(con), o);
+            same_orientation = con_parent_with_orientation(con, o);
+        }
+
+        /* easy case: the move is within this container */
+        if (same_orientation == con->parent) {
+            DLOG("We are in the same container\n");
+            Con *swap;
+            if ((swap = (direction == TOK_LEFT || direction == TOK_UP ?
+                          TAILQ_PREV(con, nodes_head, nodes) :
+                          TAILQ_NEXT(con, nodes)))) {
+                if (!con_is_leaf(swap)) {
+                    insert_con_into(con, con_descend_focused(swap), AFTER);
+                    goto end;
+                }
+                if (direction == TOK_LEFT || direction == TOK_UP)
+                    TAILQ_SWAP(swap, con, &(swap->parent->nodes_head), nodes);
+                else TAILQ_SWAP(con, swap, &(swap->parent->nodes_head), nodes);
+
+                TAILQ_REMOVE(&(con->parent->focus_head), con, focused);
+                TAILQ_INSERT_HEAD(&(swap->parent->focus_head), con, focused);
+
+                DLOG("Swapped.\n");
+                return;
+            }
+
+            /* If there was no con with which we could swap the current one, search
+             * again, but starting one level higher. If we are on the workspace
+             * level, don’t do that. The result would be a force change of
+             * workspace orientation, which is not necessary. */
+            if (con->parent == con_get_workspace(con))
+                return;
+            same_orientation = con_parent_with_orientation(con->parent, o);
+        }
+    } while (same_orientation == NULL);
+
+    /* this time, we have to move to another container */
+    /* This is the container *above* 'con' (an ancestor of con) which is inside
+     * 'same_orientation' */
+    Con *above = con;
+    while (above->parent != same_orientation)
+        above = above->parent;
+
+    DLOG("above = %p\n", above);
+    Con *next;
+    position_t position;
+    if (direction == TOK_UP || direction == TOK_LEFT) {
+        position = BEFORE;
+        next = TAILQ_PREV(above, nodes_head, nodes);
+    } else {
+        position = AFTER;
+        next = TAILQ_NEXT(above, nodes);
+    }
+
+    /* special case: there is a split container in the direction we are moving
+     * to, so descend and append */
+    if (next && !con_is_leaf(next))
+        insert_con_into(con, con_descend_focused(next), AFTER);
+    else
+        insert_con_into(con, above, position);
+
+end:
+    /* We need to call con_focus() to fix the focus stack "above" the container
+     * we just inserted the focused container into (otherwise, the parent
+     * container(s) would still point to the old container(s)). */
+    con_focus(con);
+
+    tree_flatten(croot);
+}
diff --git a/src/output.c b/src/output.c
new file mode 100644 (file)
index 0000000..6848792
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#include "all.h"
+
+/*
+ * Returns the output container below the given output container.
+ *
+ */
+Con *output_get_content(Con *output) {
+    Con *child;
+
+    TAILQ_FOREACH(child, &(output->nodes_head), nodes)
+        if (child->type == CT_CON)
+            return child;
+
+    ELOG("output_get_content() called on non-output %p\n", output);
+    assert(false);
+}
diff --git a/src/randr.c b/src/randr.c
new file mode 100644 (file)
index 0000000..e57549b
--- /dev/null
@@ -0,0 +1,785 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * For more information on RandR, please see the X.org RandR specification at
+ * http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt
+ * (take your time to read it completely, it answers all questions).
+ *
+ */
+#include <time.h>
+
+#include <xcb/randr.h>
+
+#include "all.h"
+
+/* While a clean namespace is usually a pretty good thing, we really need
+ * to use shorter names than the whole xcb_randr_* default names. */
+typedef xcb_randr_get_crtc_info_reply_t crtc_info;
+typedef xcb_randr_mode_info_t mode_info;
+typedef xcb_randr_get_screen_resources_current_reply_t resources_reply;
+
+/* Pointer to the result of the query for primary output */
+xcb_randr_get_output_primary_reply_t *primary;
+
+/* Stores all outputs available in your current session. */
+struct outputs_head outputs = TAILQ_HEAD_INITIALIZER(outputs);
+
+static bool randr_disabled = false;
+
+/*
+ * Get a specific output by its internal X11 id. Used by randr_query_outputs
+ * to check if the output is new (only in the first scan) or if we are
+ * re-scanning.
+ *
+ */
+static Output *get_output_by_id(xcb_randr_output_t id) {
+    Output *output;
+    TAILQ_FOREACH(output, &outputs, outputs)
+        if (output->id == id)
+            return output;
+
+    return NULL;
+}
+
+/*
+ * Returns the output with the given name if it is active (!) or NULL.
+ *
+ */
+Output *get_output_by_name(const char *name) {
+    Output *output;
+    TAILQ_FOREACH(output, &outputs, outputs)
+        if (output->active &&
+            strcasecmp(output->name, name) == 0)
+            return output;
+
+    return NULL;
+}
+
+/*
+ * Returns the first output which is active.
+ *
+ */
+Output *get_first_output() {
+    Output *output;
+
+    TAILQ_FOREACH(output, &outputs, outputs)
+        if (output->active)
+            return output;
+
+    return NULL;
+}
+
+/*
+ * Returns the active (!) output which contains the coordinates x, y or NULL
+ * if there is no output which contains these coordinates.
+ *
+ */
+Output *get_output_containing(int x, int y) {
+    Output *output;
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (!output->active)
+            continue;
+        DLOG("comparing x=%d y=%d with x=%d and y=%d width %d height %d\n",
+                        x, y, output->rect.x, output->rect.y, output->rect.width, output->rect.height);
+        if (x >= output->rect.x && x < (output->rect.x + output->rect.width) &&
+            y >= output->rect.y && y < (output->rect.y + output->rect.height))
+            return output;
+    }
+
+    return NULL;
+}
+
+/*
+ * Gets the output which is the last one in the given direction, for example
+ * the output on the most bottom when direction == D_DOWN, the output most
+ * right when direction == D_RIGHT and so on.
+ *
+ * This function always returns a output.
+ *
+ */
+Output *get_output_most(direction_t direction, Output *current) {
+    Output *output, *candidate = NULL;
+    int position = 0;
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (!output->active)
+            continue;
+
+        /* Repeated calls of WIN determine the winner of the comparison */
+        #define WIN(variable, condition) \
+            if (variable condition) { \
+                candidate = output; \
+                position = variable; \
+            } \
+            break;
+
+        if (((direction == D_UP) || (direction == D_DOWN)) &&
+            (current->rect.x != output->rect.x))
+            continue;
+
+        if (((direction == D_LEFT) || (direction == D_RIGHT)) &&
+            (current->rect.y != output->rect.y))
+            continue;
+
+        switch (direction) {
+            case D_UP:
+                WIN(output->rect.y, <= position);
+            case D_DOWN:
+                WIN(output->rect.y, >= position);
+            case D_LEFT:
+                WIN(output->rect.x, <= position);
+            case D_RIGHT:
+                WIN(output->rect.x, >= position);
+        }
+    }
+
+    assert(candidate != NULL);
+
+    return candidate;
+}
+
+/*
+ * Disables RandR support by creating exactly one output with the size of the
+ * X11 screen.
+ *
+ */
+void disable_randr(xcb_connection_t *conn) {
+    DLOG("RandR extension unusable, disabling.\n");
+
+    Output *s = scalloc(sizeof(Output));
+
+    s->active = true;
+    s->rect.x = 0;
+    s->rect.y = 0;
+    s->rect.width = root_screen->width_in_pixels;
+    s->rect.height = root_screen->height_in_pixels;
+    s->name = "xroot-0";
+    output_init_con(s);
+    init_ws_for_output(s, output_get_content(s->con));
+
+    TAILQ_INSERT_TAIL(&outputs, s, outputs);
+
+    randr_disabled = true;
+}
+
+/*
+ * Initializes a CT_OUTPUT Con (searches existing ones from inplace restart
+ * before) to use for the given Output.
+ *
+ */
+void output_init_con(Output *output) {
+    Con *con = NULL, *current;
+    bool reused = false;
+
+    DLOG("init_con for output %s\n", output->name);
+
+    /* Search for a Con with that name directly below the root node. There
+     * might be one from a restored layout. */
+    TAILQ_FOREACH(current, &(croot->nodes_head), nodes) {
+        if (strcmp(current->name, output->name) != 0)
+            continue;
+
+        con = current;
+        reused = true;
+        DLOG("Using existing con %p / %s\n", con, con->name);
+        break;
+    }
+
+    if (con == NULL) {
+        con = con_new(croot, NULL);
+        FREE(con->name);
+        con->name = sstrdup(output->name);
+        con->type = CT_OUTPUT;
+        con->layout = L_OUTPUT;
+        con_fix_percent(croot);
+    }
+    con->rect = output->rect;
+    output->con = con;
+
+    char *name;
+    asprintf(&name, "[i3 con] output %s", con->name);
+    x_set_name(con, name);
+    FREE(name);
+
+    if (reused) {
+        DLOG("Not adding workspace, this was a reused con\n");
+        return;
+    }
+
+    DLOG("Changing layout, adding top/bottom dockarea\n");
+    Con *topdock = con_new(NULL, NULL);
+    topdock->type = CT_DOCKAREA;
+    topdock->layout = L_DOCKAREA;
+    topdock->orientation = VERT;
+    /* this container swallows dock clients */
+    Match *match = scalloc(sizeof(Match));
+    match_init(match);
+    match->dock = M_DOCK_TOP;
+    match->insert_where = M_BELOW;
+    TAILQ_INSERT_TAIL(&(topdock->swallow_head), match, matches);
+
+    FREE(topdock->name);
+    topdock->name = sstrdup("topdock");
+
+    asprintf(&name, "[i3 con] top dockarea %s", con->name);
+    x_set_name(topdock, name);
+    FREE(name);
+    DLOG("attaching\n");
+    con_attach(topdock, con, false);
+
+    /* content container */
+
+    DLOG("adding main content container\n");
+    Con *content = con_new(NULL, NULL);
+    content->type = CT_CON;
+    FREE(content->name);
+    content->name = sstrdup("content");
+
+    asprintf(&name, "[i3 con] content %s", con->name);
+    x_set_name(content, name);
+    FREE(name);
+    con_attach(content, con, false);
+
+    /* bottom dock container */
+    Con *bottomdock = con_new(NULL, NULL);
+    bottomdock->type = CT_DOCKAREA;
+    bottomdock->layout = L_DOCKAREA;
+    bottomdock->orientation = VERT;
+    /* this container swallows dock clients */
+    match = scalloc(sizeof(Match));
+    match_init(match);
+    match->dock = M_DOCK_BOTTOM;
+    match->insert_where = M_BELOW;
+    TAILQ_INSERT_TAIL(&(bottomdock->swallow_head), match, matches);
+
+    FREE(bottomdock->name);
+    bottomdock->name = sstrdup("bottomdock");
+
+    asprintf(&name, "[i3 con] bottom dockarea %s", con->name);
+    x_set_name(bottomdock, name);
+    FREE(name);
+    DLOG("attaching\n");
+    con_attach(bottomdock, con, false);
+}
+
+/*
+ * Initializes at least one workspace for this output, trying the following
+ * steps until there is at least one workspace:
+ *
+ * • Move existing workspaces, which are assigned to be on the given output, to
+ *   the output.
+ * • Create the first assigned workspace for this output.
+ * • Create the first unused workspace.
+ *
+ */
+void init_ws_for_output(Output *output, Con *content) {
+    char *name;
+
+    /* go through all assignments and move the existing workspaces to this output */
+    struct Workspace_Assignment *assignment;
+    TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
+        if (strcmp(assignment->output, output->name) != 0)
+            continue;
+
+        /* check if this workspace actually exists */
+        Con *workspace = NULL, *out;
+        TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
+            GREP_FIRST(workspace, output_get_content(out),
+                       !strcasecmp(child->name, assignment->name));
+        if (workspace == NULL)
+            continue;
+
+        /* check that this workspace is not already attached (that means the
+         * user configured this assignment twice) */
+        Con *workspace_out = con_get_output(workspace);
+        if (workspace_out == output->con) {
+            LOG("Workspace \"%s\" assigned to output \"%s\", but it is already "
+                "there. Do you have two assignment directives for the same "
+                "workspace in your configuration file?\n",
+                workspace->name, output->name);
+            continue;
+        }
+
+        /* if so, move it over */
+        LOG("Moving workspace \"%s\" from output \"%s\" to \"%s\" due to assignment\n",
+            workspace->name, workspace_out->name, output->name);
+
+        /* if the workspace is currently visible on that output, we need to
+         * switch to a different workspace - otherwise the output would end up
+         * with no active workspace */
+        bool visible = workspace_is_visible(workspace);
+        Con *previous = NULL;
+        if (visible && (previous = TAILQ_NEXT(workspace, focused))) {
+            LOG("Switching to previously used workspace \"%s\" on output \"%s\"\n",
+                previous->name, workspace_out->name);
+            workspace_show(previous->name);
+        }
+
+        con_detach(workspace);
+        con_attach(workspace, content, false);
+
+        /* In case the workspace we just moved was visible but there was no
+         * other workspace to switch to, we need to initialize the source
+         * output aswell */
+        if (visible && previous == NULL) {
+            LOG("There is no workspace left on \"%s\", re-initializing\n",
+                workspace_out->name);
+            init_ws_for_output(get_output_by_name(workspace_out->name),
+                               output_get_content(workspace_out));
+            DLOG("Done re-initializing, continuing with \"%s\"\n", output->name);
+        }
+    }
+
+    /* if a workspace exists, we are done now */
+    if (!TAILQ_EMPTY(&(content->nodes_head))) {
+        /* ensure that one of the workspaces is actually visible (in fullscreen
+         * mode), if they were invisible before, this might not be the case. */
+        Con *visible = NULL;
+        GREP_FIRST(visible, content, child->fullscreen_mode == CF_OUTPUT);
+        if (!visible) {
+            visible = TAILQ_FIRST(&(content->nodes_head));
+            focused = content;
+            workspace_show(visible->name);
+        }
+        return;
+    }
+
+    /* otherwise, we create the first assigned ws for this output */
+    TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
+        if (strcmp(assignment->output, output->name) != 0)
+            continue;
+
+        LOG("Initializing first assigned workspace \"%s\" for output \"%s\"\n",
+            assignment->name, assignment->output);
+        focused = content;
+        workspace_show(assignment->name);
+        return;
+    }
+
+    /* if there is still no workspace, we create the first free workspace */
+    DLOG("Now adding a workspace\n");
+
+    /* add a workspace to this output */
+    Con *ws = con_new(NULL, NULL);
+    ws->type = CT_WORKSPACE;
+
+    /* get the next unused workspace number */
+    DLOG("Getting next unused workspace\n");
+    int c = 0;
+    bool exists = true;
+    while (exists) {
+        Con *out, *current, *child;
+
+        c++;
+
+        FREE(ws->name);
+        asprintf(&(ws->name), "%d", c);
+
+        exists = false;
+        TAILQ_FOREACH(out, &(croot->nodes_head), nodes) {
+            TAILQ_FOREACH(current, &(out->nodes_head), nodes) {
+                if (current->type != CT_CON)
+                    continue;
+
+                TAILQ_FOREACH(child, &(current->nodes_head), nodes) {
+                    if (strcasecmp(child->name, ws->name) != 0)
+                        continue;
+
+                    exists = true;
+                    break;
+                }
+            }
+        }
+
+        DLOG("result for ws %s / %d: exists = %d\n", ws->name, c, exists);
+    }
+    ws->num = c;
+    con_attach(ws, content, false);
+
+    asprintf(&name, "[i3 con] workspace %s", ws->name);
+    x_set_name(ws, name);
+    free(name);
+
+    ws->fullscreen_mode = CF_OUTPUT;
+
+    /* If default_orientation is set to NO_ORIENTATION we determine
+     * orientation depending on output resolution. */
+    if (config.default_orientation == NO_ORIENTATION) {
+        ws->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
+        DLOG("Auto orientation. Workspace size set to (%d,%d), setting orientation to %d.\n",
+             output->rect.width, output->rect.height, ws->orientation);
+    } else {
+        ws->orientation = config.default_orientation;
+    }
+
+
+    /* TODO: Set focus in main.c */
+    con_focus(ws);
+}
+
+/*
+ * This function needs to be called when changing the mode of an output when
+ * it already has some workspaces (or a bar window) assigned.
+ *
+ * It reconfigures the bar window for the new mode, copies the new rect into
+ * each workspace on this output and forces all windows on the affected
+ * workspaces to be reconfigured.
+ *
+ * It is necessary to call render_layout() afterwards.
+ *
+ */
+static void output_change_mode(xcb_connection_t *conn, Output *output) {
+    //i3Font *font = load_font(conn, config.font);
+
+    DLOG("Output mode changed, updating rect\n");
+    assert(output->con != NULL);
+    output->con->rect = output->rect;
+
+    Con *content, *workspace, *child;
+
+    /* Point content to the container of the workspaces */
+    content = output_get_content(output->con);
+
+    /* If default_orientation is NO_ORIENTATION, we change the orientation of
+     * the workspaces and their childs depending on output resolution. This is
+     * only done for workspaces with maximum one child. */
+    if (config.default_orientation == NO_ORIENTATION) {
+        TAILQ_FOREACH(workspace, &(content->nodes_head), nodes) {
+            /* Workspaces with more than one child are left untouched because
+             * we do not want to change an existing layout. */
+            if (con_num_children(workspace) > 1)
+                continue;
+
+            workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
+            DLOG("Setting workspace [%d,%s]'s orientation to %d.\n", workspace->num, workspace->name, workspace->orientation);
+            if ((child = TAILQ_FIRST(&(workspace->nodes_head)))) {
+                child->orientation = workspace->orientation;
+                DLOG("Setting child [%d,%s]'s orientation to %d.\n", child->num, child->name, child->orientation);
+            }
+        }
+    }
+}
+
+/*
+ * Gets called by randr_query_outputs() for each output. The function adds new
+ * outputs to the list of outputs, checks if the mode of existing outputs has
+ * been changed or if an existing output has been disabled. It will then change
+ * either the "changed" or the "to_be_deleted" flag of the output, if
+ * appropriate.
+ *
+ */
+static void handle_output(xcb_connection_t *conn, xcb_randr_output_t id,
+                          xcb_randr_get_output_info_reply_t *output,
+                          xcb_timestamp_t cts, resources_reply *res) {
+    /* each CRT controller has a position in which we are interested in */
+    crtc_info *crtc;
+
+    Output *new = get_output_by_id(id);
+    bool existing = (new != NULL);
+    if (!existing)
+        new = scalloc(sizeof(Output));
+    new->id = id;
+    new->primary = (primary && primary->output == id);
+    FREE(new->name);
+    asprintf(&new->name, "%.*s",
+            xcb_randr_get_output_info_name_length(output),
+            xcb_randr_get_output_info_name(output));
+
+    DLOG("found output with name %s\n", new->name);
+
+    /* Even if no CRTC is used at the moment, we store the output so that
+     * we do not need to change the list ever again (we only update the
+     * position/size) */
+    if (output->crtc == XCB_NONE) {
+        if (!existing) {
+            if (new->primary)
+                TAILQ_INSERT_HEAD(&outputs, new, outputs);
+            else TAILQ_INSERT_TAIL(&outputs, new, outputs);
+        } else if (new->active)
+            new->to_be_disabled = true;
+        return;
+    }
+
+    xcb_randr_get_crtc_info_cookie_t icookie;
+    icookie = xcb_randr_get_crtc_info(conn, output->crtc, cts);
+    if ((crtc = xcb_randr_get_crtc_info_reply(conn, icookie, NULL)) == NULL) {
+        DLOG("Skipping output %s: could not get CRTC (%p)\n",
+             new->name, crtc);
+        free(new);
+        return;
+    }
+
+    bool updated = update_if_necessary(&(new->rect.x), crtc->x) |
+                   update_if_necessary(&(new->rect.y), crtc->y) |
+                   update_if_necessary(&(new->rect.width), crtc->width) |
+                   update_if_necessary(&(new->rect.height), crtc->height);
+    free(crtc);
+    new->active = (new->rect.width != 0 && new->rect.height != 0);
+    if (!new->active) {
+        DLOG("width/height 0/0, disabling output\n");
+        return;
+    }
+
+    DLOG("mode: %dx%d+%d+%d\n", new->rect.width, new->rect.height,
+                                new->rect.x, new->rect.y);
+
+    /* If we don’t need to change an existing output or if the output
+     * does not exist in the first place, the case is simple: we either
+     * need to insert the new output or we are done. */
+    if (!updated || !existing) {
+        if (!existing) {
+            if (new->primary)
+                TAILQ_INSERT_HEAD(&outputs, new, outputs);
+            else TAILQ_INSERT_TAIL(&outputs, new, outputs);
+        }
+        return;
+    }
+
+    new->changed = true;
+}
+
+/*
+ * (Re-)queries the outputs via RandR and stores them in the list of outputs.
+ *
+ */
+void randr_query_outputs() {
+    Output *output, *other, *first;
+    xcb_randr_get_output_primary_cookie_t pcookie;
+    xcb_randr_get_screen_resources_current_cookie_t rcookie;
+    resources_reply *res;
+
+    /* timestamp of the configuration so that we get consistent replies to all
+     * requests (if the configuration changes between our different calls) */
+    xcb_timestamp_t cts;
+
+    /* an output is VGA-1, LVDS-1, etc. (usually physical video outputs) */
+    xcb_randr_output_t *randr_outputs;
+
+    if (randr_disabled)
+        return;
+
+    /* Get screen resources (primary output, crtcs, outputs, modes) */
+    rcookie = xcb_randr_get_screen_resources_current(conn, root);
+    pcookie = xcb_randr_get_output_primary(conn, root);
+
+    if ((primary = xcb_randr_get_output_primary_reply(conn, pcookie, NULL)) == NULL)
+        ELOG("Could not get RandR primary output\n");
+    else DLOG("primary output is %08x\n", primary->output);
+    if ((res = xcb_randr_get_screen_resources_current_reply(conn, rcookie, NULL)) == NULL) {
+        disable_randr(conn);
+        return;
+    }
+    cts = res->config_timestamp;
+
+    int len = xcb_randr_get_screen_resources_current_outputs_length(res);
+    randr_outputs = xcb_randr_get_screen_resources_current_outputs(res);
+
+    /* Request information for each output */
+    xcb_randr_get_output_info_cookie_t ocookie[len];
+    for (int i = 0; i < len; i++)
+        ocookie[i] = xcb_randr_get_output_info(conn, randr_outputs[i], cts);
+
+    /* Loop through all outputs available for this X11 screen */
+    for (int i = 0; i < len; i++) {
+        xcb_randr_get_output_info_reply_t *output;
+
+        if ((output = xcb_randr_get_output_info_reply(conn, ocookie[i], NULL)) == NULL)
+            continue;
+
+        handle_output(conn, randr_outputs[i], output, cts, res);
+        free(output);
+    }
+
+    /* Check for clones, disable the clones and reduce the mode to the
+     * lowest common mode */
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (!output->active || output->to_be_disabled)
+            continue;
+        DLOG("output %p / %s, position (%d, %d), checking for clones\n",
+                output, output->name, output->rect.x, output->rect.y);
+
+        for (other = output;
+             other != TAILQ_END(&outputs);
+             other = TAILQ_NEXT(other, outputs)) {
+            if (other == output || !other->active || other->to_be_disabled)
+                continue;
+
+            if (other->rect.x != output->rect.x ||
+                other->rect.y != output->rect.y)
+                continue;
+
+            DLOG("output %p has the same position, his mode = %d x %d\n",
+                            other, other->rect.width, other->rect.height);
+            uint32_t width = min(other->rect.width, output->rect.width);
+            uint32_t height = min(other->rect.height, output->rect.height);
+
+            if (update_if_necessary(&(output->rect.width), width) |
+                update_if_necessary(&(output->rect.height), height))
+                output->changed = true;
+
+            update_if_necessary(&(other->rect.width), width);
+            update_if_necessary(&(other->rect.height), height);
+
+            DLOG("disabling output %p (%s)\n", other, other->name);
+            other->to_be_disabled = true;
+
+            DLOG("new output mode %d x %d, other mode %d x %d\n",
+                            output->rect.width, output->rect.height,
+                            other->rect.width, other->rect.height);
+        }
+    }
+
+    /* Ensure that all outputs which are active also have a con. This is
+     * necessary because in the next step, a clone might get disabled. Example:
+     * LVDS1 active, VGA1 gets activated as a clone of LVDS1 (has no con).
+     * LVDS1 gets disabled. */
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (output->active && output->con == NULL) {
+            DLOG("Need to initialize a Con for output %s\n", output->name);
+            output_init_con(output);
+            output->changed = false;
+        }
+    }
+
+    /* Handle outputs which have a new mode or are disabled now (either
+     * because the user disabled them or because they are clones) */
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (output->to_be_disabled) {
+            output->active = false;
+            DLOG("Output %s disabled, re-assigning workspaces/docks\n", output->name);
+
+            if ((first = get_first_output()) == NULL)
+                die("No usable outputs available\n");
+
+            /* TODO: refactor the following code into a nice function. maybe
+             * use an on_destroy callback which is implement differently for
+             * different container types (CT_CONTENT vs. CT_DOCKAREA)? */
+            Con *first_content = output_get_content(first->con);
+
+            if (output->con != NULL) {
+                /* We need to move the workspaces from the disappearing output to the first output */
+                /* 1: Get the con to focus next, if the disappearing ws is focused */
+                Con *next = NULL;
+                if (TAILQ_FIRST(&(croot->focus_head)) == output->con) {
+                    DLOG("This output (%p) was focused! Getting next\n", output->con);
+                    next = con_next_focused(output->con);
+                    DLOG("next = %p\n", next);
+                }
+
+                /* 2: iterate through workspaces and re-assign them */
+                Con *current;
+                Con *old_content = output_get_content(output->con);
+                while (!TAILQ_EMPTY(&(old_content->nodes_head))) {
+                    current = TAILQ_FIRST(&(old_content->nodes_head));
+                    DLOG("Detaching current = %p / %s\n", current, current->name);
+                    con_detach(current);
+                    DLOG("Re-attaching current = %p / %s\n", current, current->name);
+                    con_attach(current, first_content, false);
+                    DLOG("Done, next\n");
+                }
+                DLOG("re-attached all workspaces\n");
+
+                if (next) {
+                    DLOG("now focusing next = %p\n", next);
+                    con_focus(next);
+                }
+
+                /* 3: move the dock clients to the first output */
+                Con *child;
+                TAILQ_FOREACH(child, &(output->con->nodes_head), nodes) {
+                    if (child->type != CT_DOCKAREA)
+                        continue;
+                    DLOG("Handling dock con %p\n", child);
+                    Con *dock;
+                    while (!TAILQ_EMPTY(&(child->nodes_head))) {
+                        dock = TAILQ_FIRST(&(child->nodes_head));
+                        Con *nc;
+                        Match *match;
+                        nc = con_for_window(first->con, dock->window, &match);
+                        DLOG("Moving dock client %p to nc %p\n", dock, nc);
+                        con_detach(dock);
+                        DLOG("Re-attaching\n");
+                        con_attach(dock, nc, false);
+                        DLOG("Done\n");
+                    }
+                }
+
+                DLOG("destroying disappearing con %p\n", output->con);
+                tree_close(output->con, DONT_KILL_WINDOW, true);
+                DLOG("Done. Should be fine now\n");
+                output->con = NULL;
+            }
+
+            output->to_be_disabled = false;
+            output->changed = false;
+        }
+
+        if (output->changed) {
+            output_change_mode(conn, output);
+            output->changed = false;
+        }
+    }
+
+    if (TAILQ_EMPTY(&outputs)) {
+        ELOG("No outputs found via RandR, disabling\n");
+        disable_randr(conn);
+    }
+
+    ewmh_update_workarea();
+
+    /* Just go through each active output and assign one workspace */
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (!output->active)
+            continue;
+        Con *content = output_get_content(output->con);
+        if (!TAILQ_EMPTY(&(content->nodes_head)))
+            continue;
+        DLOG("Should add ws for output %s\n", output->name);
+        init_ws_for_output(output, content);
+    }
+
+    /* Focus the primary screen, if possible */
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        if (!output->primary || !output->con)
+            continue;
+
+        DLOG("Focusing primary output %s\n", output->name);
+        con_focus(con_descend_focused(output->con));
+    }
+
+    /* render_layout flushes */
+    tree_render();
+
+    FREE(res);
+    FREE(primary);
+}
+
+/*
+ * We have just established a connection to the X server and need the initial
+ * XRandR information to setup workspaces for each screen.
+ *
+ */
+void randr_init(int *event_base) {
+    const xcb_query_extension_reply_t *extreply;
+
+    extreply = xcb_get_extension_data(conn, &xcb_randr_id);
+    if (!extreply->present)
+        disable_randr(conn);
+    else randr_query_outputs();
+
+    if (event_base != NULL)
+        *event_base = extreply->first_event;
+
+    xcb_randr_select_input(conn, root,
+            XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE |
+            XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE |
+            XCB_RANDR_NOTIFY_MASK_CRTC_CHANGE |
+            XCB_RANDR_NOTIFY_MASK_OUTPUT_PROPERTY);
+
+    xcb_flush(conn);
+}
diff --git a/src/render.c b/src/render.c
new file mode 100644 (file)
index 0000000..a7a9be5
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#include "all.h"
+
+/* change this to 'true' if you want to have additional borders around every
+ * container (for debugging purposes) */
+static bool show_debug_borders = false;
+
+/*
+ * Renders a container with layout L_OUTPUT. In this layout, all CT_DOCKAREAs
+ * get the height of their content and the remaining CT_CON gets the rest.
+ *
+ */
+static void render_l_output(Con *con) {
+    Con *child, *dockchild;
+
+    int x = con->rect.x;
+    int y = con->rect.y;
+    int height = con->rect.height;
+    DLOG("Available height: %d\n", height);
+
+    /* Find the content container and ensure that there is exactly one. Also
+     * check for any non-CT_DOCKAREA clients. */
+    Con *content = NULL;
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        if (child->type == CT_CON) {
+            if (content != NULL) {
+                DLOG("More than one CT_CON on output container\n");
+                assert(false);
+            }
+            content = child;
+        } else if (child->type != CT_DOCKAREA) {
+            DLOG("Child %p of type %d is inside the OUTPUT con\n", child, child->type);
+            assert(false);
+        }
+    }
+
+    assert(content != NULL);
+
+    /* We need to find out if there is a fullscreen con on the current workspace
+     * and take the short-cut to render it directly (the user does not want to
+     * see the dockareas in that case) */
+    Con *ws = con_get_fullscreen_con(content, CF_OUTPUT);
+    Con *fullscreen = con_get_fullscreen_con(ws, CF_OUTPUT);
+    if (fullscreen) {
+        DLOG("got fs node: %p\n", fullscreen);
+        fullscreen->rect = con->rect;
+        x_raise_con(fullscreen);
+        render_con(fullscreen, true);
+        return;
+    }
+
+    /* First pass: determine the height of all CT_DOCKAREAs (the sum of their
+     * children) and figure out how many pixels we have left for the rest */
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        if (child->type != CT_DOCKAREA)
+            continue;
+
+        child->rect.height = 0;
+        TAILQ_FOREACH(dockchild, &(child->nodes_head), nodes)
+            child->rect.height += dockchild->geometry.height;
+        DLOG("This dockarea's height: %d\n", child->rect.height);
+
+        height -= child->rect.height;
+    }
+
+    DLOG("Remaining: %d\n", height);
+
+    /* Second pass: Set the widths/heights */
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        if (child->type == CT_CON) {
+            child->rect.x = x;
+            child->rect.y = y;
+            child->rect.width = con->rect.width;
+            child->rect.height = height;
+        }
+
+        child->rect.x = x;
+        child->rect.y = y;
+        child->rect.width = con->rect.width;
+
+        child->deco_rect.x = 0;
+        child->deco_rect.y = 0;
+        child->deco_rect.width = 0;
+        child->deco_rect.height = 0;
+
+        y += child->rect.height;
+
+        DLOG("child at (%d, %d) with (%d x %d)\n",
+                child->rect.x, child->rect.y, child->rect.width, child->rect.height);
+        DLOG("x now %d, y now %d\n", x, y);
+        x_raise_con(child);
+        render_con(child, false);
+    }
+}
+
+/*
+ * "Renders" the given container (and its children), meaning that all rects are
+ * updated correctly. Note that this function does not call any xcb_*
+ * functions, so the changes are completely done in memory only (and
+ * side-effect free). As soon as you call x_push_changes(), the changes will be
+ * updated in X11.
+ *
+ */
+void render_con(Con *con, bool render_fullscreen) {
+    DLOG("currently rendering node %p / %s / layout %d\n",
+            con, con->name, con->layout);
+    int children = con_num_children(con);
+    DLOG("children: %d, orientation = %d\n", children, con->orientation);
+
+    /* Copy container rect, subtract container border */
+    /* This is the actually usable space inside this container for clients */
+    Rect rect = con->rect;
+
+    /* Display a border if this is a leaf node. For container nodes, we don’t
+     * draw borders (except when in debug mode) */
+    if (show_debug_borders) {
+        rect.x += 2;
+        rect.y += 2;
+        rect.width -= 2 * 2;
+        rect.height -= 2 * 2;
+    }
+
+    int x = rect.x;
+    int y = rect.y;
+
+    int i = 0;
+
+    con->mapped = true;
+
+    /* if this container contains a window, set the coordinates */
+    if (con->window) {
+        /* depending on the border style, the rect of the child window
+         * needs to be smaller */
+        Rect *inset = &(con->window_rect);
+        *inset = (Rect){0, 0, con->rect.width, con->rect.height};
+        if (!render_fullscreen)
+            *inset = rect_add(*inset, con_border_style_rect(con));
+
+        DLOG("Starting with inset = (%d, %d) %d x %d\n", inset->x, inset->y, inset->width, inset->height);
+        /* Obey x11 border */
+        DLOG("X11 border: %d\n", con->border_width);
+        inset->width -= (2 * con->border_width);
+        inset->height -= (2 * con->border_width);
+
+        /* Obey the aspect ratio, if any */
+        if (con->proportional_height != 0 &&
+            con->proportional_width != 0) {
+            DLOG("proportional height = %d, width = %d\n", con->proportional_height, con->proportional_width);
+            double new_height = inset->height + 1;
+            int new_width = inset->width;
+
+            while (new_height > inset->height) {
+                new_height = ((double)con->proportional_height / con->proportional_width) * new_width;
+
+                if (new_height > inset->height)
+                    new_width--;
+            }
+            /* Center the window */
+            inset->y += ceil(inset->height / 2) - floor(new_height / 2);
+            inset->x += ceil(inset->width / 2) - floor(new_width / 2);
+
+            inset->height = new_height;
+            inset->width = new_width;
+            DLOG("new_height = %f, new_width = %d\n", new_height, new_width);
+        }
+
+        if (con->height_increment > 1) {
+            int old_height = inset->height;
+            inset->height -= (inset->height - con->base_height) % con->height_increment;
+            DLOG("Lost %d pixel due to client's height_increment (%d px, base_height = %d)\n",
+                old_height - inset->height, con->height_increment, con->base_height);
+        }
+
+        if (con->width_increment > 1) {
+            int old_width = inset->width;
+            inset->width -= (inset->width - con->base_width) % con->width_increment;
+            DLOG("Lost %d pixel due to client's width_increment (%d px, base_width = %d)\n",
+                old_width - inset->width, con->width_increment, con->base_width);
+        }
+
+        DLOG("child will be at %dx%d with size %dx%d\n", inset->x, inset->y, inset->width, inset->height);
+    }
+
+    /* Check for fullscreen nodes */
+    Con *fullscreen = NULL;
+    if (con->type != CT_OUTPUT) {
+        fullscreen = con_get_fullscreen_con(con, (con->type == CT_ROOT ? CF_GLOBAL : CF_OUTPUT));
+    }
+    if (fullscreen) {
+        DLOG("got fs node: %p\n", fullscreen);
+        fullscreen->rect = rect;
+        x_raise_con(fullscreen);
+        render_con(fullscreen, true);
+        return;
+    }
+
+    /* find the height for the decorations */
+    int deco_height = config.font.height + 5;
+
+    /* precalculate the sizes to be able to correct rounding errors */
+    int sizes[children];
+    if (con->layout == L_DEFAULT && children > 0) {
+        assert(!TAILQ_EMPTY(&con->nodes_head));
+        Con *child;
+        int i = 0, assigned = 0;
+        int total = con->orientation == HORIZ ? rect.width : rect.height;
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+            double percentage = child->percent > 0.0 ? child->percent : 1.0 / children;
+            assigned += sizes[i++] = percentage * total;
+        }
+        assert(assigned == total ||
+                (assigned > total && assigned - total <= children * 2) ||
+                (assigned < total && total - assigned <= children * 2));
+        int signal = assigned < total ? 1 : -1;
+        while (assigned != total) {
+            for (i = 0; i < children && assigned != total; ++i) {
+                sizes[i] += signal;
+                assigned += signal;
+            }
+        }
+    }
+
+    if (con->layout == L_OUTPUT) {
+        render_l_output(con);
+    } else if (con->type == CT_ROOT) {
+        DLOG("Root node, rendering outputs\n");
+        Con *child;
+        TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+            render_con(child, false);
+        }
+    } else {
+
+        /* FIXME: refactor this into separate functions: */
+    Con *child;
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
+        assert(children > 0);
+
+        /* default layout */
+        if (con->layout == L_DEFAULT) {
+            if (con->orientation == HORIZ) {
+                child->rect.x = x;
+                child->rect.y = y;
+                child->rect.width = sizes[i];
+                child->rect.height = rect.height;
+                x += child->rect.width;
+            } else {
+                child->rect.x = x;
+                child->rect.y = y;
+                child->rect.width = rect.width;
+                child->rect.height = sizes[i];
+                y += child->rect.height;
+            }
+
+            /* first we have the decoration, if this is a leaf node */
+            if (con_is_leaf(child) && child->border_style == BS_NORMAL) {
+                DLOG("that child is a leaf node, subtracting deco\n");
+                /* TODO: make a function for relative coords? */
+                child->deco_rect.x = child->rect.x - con->rect.x;
+                child->deco_rect.y = child->rect.y - con->rect.y;
+
+                child->rect.y += deco_height;
+                child->rect.height -= deco_height;
+
+                child->deco_rect.width = child->rect.width;
+                child->deco_rect.height = deco_height;
+            }
+        }
+
+        /* stacked layout */
+        else if (con->layout == L_STACKED) {
+            DLOG("stacked con\n");
+            child->rect.x = x;
+            child->rect.y = y;
+            child->rect.width = rect.width;
+            child->rect.height = rect.height;
+
+            child->deco_rect.x = x - con->rect.x;
+            child->deco_rect.y = y - con->rect.y + (i * deco_height);
+            child->deco_rect.width = child->rect.width;
+            child->deco_rect.height = deco_height;
+
+            if (children > 1 || (child->border_style != BS_1PIXEL && child->border_style != BS_NONE)) {
+                child->rect.y += (deco_height * children);
+                child->rect.height -= (deco_height * children);
+            }
+        }
+
+        /* tabbed layout */
+        else if (con->layout == L_TABBED) {
+            DLOG("tabbed con\n");
+            child->rect.x = x;
+            child->rect.y = y;
+            child->rect.width = rect.width;
+            child->rect.height = rect.height;
+
+            child->deco_rect.width = child->rect.width / children;
+            child->deco_rect.height = deco_height;
+            child->deco_rect.x = x - con->rect.x + i * child->deco_rect.width;
+            child->deco_rect.y = y - con->rect.y;
+
+            if (children > 1 || (child->border_style != BS_1PIXEL && child->border_style != BS_NONE)) {
+                child->rect.y += deco_height;
+                child->rect.height -= deco_height;
+            }
+        }
+
+        /* dockarea layout */
+        else if (con->layout == L_DOCKAREA) {
+            DLOG("dockarea con\n");
+            child->rect.x = x;
+            child->rect.y = y;
+            child->rect.width = rect.width;
+            child->rect.height = child->geometry.height;
+
+            child->deco_rect.x = 0;
+            child->deco_rect.y = 0;
+            child->deco_rect.width = 0;
+            child->deco_rect.height = 0;
+            y += child->rect.height;
+        }
+
+        DLOG("child at (%d, %d) with (%d x %d)\n",
+                child->rect.x, child->rect.y, child->rect.width, child->rect.height);
+        DLOG("x now %d, y now %d\n", x, y);
+        x_raise_con(child);
+        render_con(child, false);
+        i++;
+    }
+
+    /* in a stacking or tabbed container, we ensure the focused client is raised */
+    if (con->layout == L_STACKED || con->layout == L_TABBED) {
+        DLOG("stacked/tabbed, raising focused reverse\n");
+        TAILQ_FOREACH_REVERSE(child, &(con->focus_head), focus_head, focused)
+            x_raise_con(child);
+        DLOG("done\n");
+        if ((child = TAILQ_FIRST(&(con->focus_head)))) {
+            DLOG("con %p is stacking, raising %p\n", con, child);
+            /* By rendering the stacked container again, we handle the case
+             * that we have a non-leaf-container inside the stack. In that
+             * case, the children of the non-leaf-container need to be raised
+             * aswell. */
+            render_con(child, false);
+        }
+
+        if (children != 1)
+            /* Raise the stack con itself. This will put the stack decoration on
+             * top of every stack window. That way, when a new window is opened in
+             * the stack, the old window will not obscure part of the decoration
+             * (it’s unmapped afterwards). */
+            x_raise_con(con);
+    }
+    }
+
+    Con *child;
+    TAILQ_FOREACH(child, &(con->floating_head), floating_windows) {
+        DLOG("render floating:\n");
+        DLOG("floating child at (%d,%d) with %d x %d\n", child->rect.x, child->rect.y, child->rect.width, child->rect.height);
+        x_raise_con(child);
+        render_con(child, false);
+    }
+
+    DLOG("-- level up\n");
+}
diff --git a/src/resize.c b/src/resize.c
new file mode 100644 (file)
index 0000000..9c465e1
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+#include "all.h"
+
+extern xcb_connection_t *conn;
+
+/*
+ * This is an ugly data structure which we need because there is no standard
+ * way of having nested functions (only available as a gcc extension at the
+ * moment, clang doesn’t support it) or blocks (only available as a clang
+ * extension and only on Mac OS X systems at the moment).
+ *
+ */
+struct callback_params {
+    orientation_t orientation;
+    Con *output;
+    xcb_window_t helpwin;
+    uint32_t *new_position;
+};
+
+DRAGGING_CB(resize_callback) {
+    struct callback_params *params = extra;
+    Con *output = params->output;
+    DLOG("new x = %d, y = %d\n", new_x, new_y);
+    if (params->orientation == HORIZ) {
+        /* Check if the new coordinates are within screen boundaries */
+        if (new_x > (output->rect.x + output->rect.width - 25) ||
+            new_x < (output->rect.x + 25))
+            return;
+
+        *(params->new_position) = new_x;
+        xcb_configure_window(conn, params->helpwin, XCB_CONFIG_WINDOW_X, params->new_position);
+    } else {
+        if (new_y > (output->rect.y + output->rect.height - 25) ||
+            new_y < (output->rect.y + 25))
+            return;
+
+        *(params->new_position) = new_y;
+        xcb_configure_window(conn, params->helpwin, XCB_CONFIG_WINDOW_Y, params->new_position);
+    }
+
+    xcb_flush(conn);
+}
+
+int resize_graphical_handler(Con *first, Con *second, orientation_t orientation, xcb_button_press_event_t *event) {
+    DLOG("resize handler\n");
+
+    uint32_t new_position;
+
+    /* TODO: previously, we were getting a rect containing all screens. why? */
+    Con *output = con_get_output(first);
+    DLOG("x = %d, width = %d\n", output->rect.x, output->rect.width);
+
+    uint32_t mask = 0;
+    uint32_t values[2];
+
+    mask = XCB_CW_OVERRIDE_REDIRECT;
+    values[0] = 1;
+
+    /* Open a new window, the resizebar. Grab the pointer and move the window around
+       as the user moves the pointer. */
+    xcb_window_t grabwin = create_window(conn, output->rect, XCB_WINDOW_CLASS_INPUT_ONLY, XCURSOR_CURSOR_POINTER, true, mask, values);
+
+    Rect helprect;
+    if (orientation == HORIZ) {
+        helprect.x = event->root_x;
+        helprect.y = output->rect.y;
+        helprect.width = 2;
+        helprect.height = output->rect.height;
+        new_position = event->root_x;
+    } else {
+        helprect.x = output->rect.x;
+        helprect.y = event->root_y;
+        helprect.width = output->rect.width;
+        helprect.height = 2;
+        new_position = event->root_y;
+    }
+
+    mask = XCB_CW_BACK_PIXEL;
+    values[0] = config.client.focused.border;
+
+    mask |= XCB_CW_OVERRIDE_REDIRECT;
+    values[1] = 1;
+
+    xcb_window_t helpwin = create_window(conn, helprect, XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                                         (orientation == HORIZ ?
+                                          XCURSOR_CURSOR_RESIZE_HORIZONTAL :
+                                          XCURSOR_CURSOR_RESIZE_VERTICAL), true, mask, values);
+
+    xcb_circulate_window(conn, XCB_CIRCULATE_RAISE_LOWEST, helpwin);
+
+    xcb_flush(conn);
+
+    struct callback_params params = { orientation, output, helpwin, &new_position };
+
+    drag_pointer(NULL, event, grabwin, BORDER_TOP, resize_callback, &params);
+
+    xcb_destroy_window(conn, helpwin);
+    xcb_destroy_window(conn, grabwin);
+    xcb_flush(conn);
+
+    int pixels;
+    if (orientation == HORIZ)
+        pixels = (new_position - event->root_x);
+    else pixels = (new_position - event->root_y);
+
+    DLOG("Done, pixels = %d\n", pixels);
+
+    // if we got thus far, the containers must have
+    // percentages associated with them
+    assert(first->percent > 0.0);
+    assert(second->percent > 0.0);
+
+    // calculate the new percentage for the first container
+    double new_percent, difference;
+    double percent = first->percent;
+    DLOG("percent = %f\n", percent);
+    int original = (orientation == HORIZ ? first->rect.width : first->rect.height);
+    DLOG("original = %d\n", original);
+    new_percent = (original + pixels) * (percent / original);
+    difference = percent - new_percent;
+    DLOG("difference = %f\n", difference);
+    DLOG("new percent = %f\n", new_percent);
+    first->percent = new_percent;
+
+    // calculate the new percentage for the second container
+    double s_percent = second->percent;
+    second->percent = s_percent + difference;
+    DLOG("second->percent = %f\n", second->percent);
+
+    // now we must make sure that the sum of the percentages remain 1.0
+    con_fix_percent(first->parent);
+
+    return 0;
+}
diff --git a/src/sighandler.c b/src/sighandler.c
new file mode 100644 (file)
index 0000000..1d3e4ab
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ * © 2009-2010 Jan-Erik Rediger
+ *
+ * See file LICENSE for license information.
+ *
+ * sighandler.c: contains all functions for signal handling
+ *
+ */
+#include <ev.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <iconv.h>
+#include <signal.h>
+
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_event.h>
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/keysym.h>
+
+#include "all.h"
+
+static xcb_gcontext_t pixmap_gc;
+static xcb_pixmap_t pixmap;
+static int raised_signal;
+
+static char *crash_text[] = {
+    "i3 just crashed.",
+    "To debug this problem, either attach gdb now",
+    "or press",
+    "- 'e' to exit and get a core-dump,",
+    "- 'r' to restart i3 in-place or",
+    "- 'f' to forget the current layout and restart"
+};
+static int crash_text_longest = 5;
+
+/*
+ * Draw the window containing the info text
+ *
+ */
+static int sig_draw_window(xcb_window_t win, int width, int height, int font_height) {
+    /* re-draw the background */
+    xcb_rectangle_t border = { 0, 0, width, height},
+                    inner = { 2, 2, width - 4, height - 4};
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel("#FF0000"));
+    xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &border);
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel("#000000"));
+    xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &inner);
+
+    /* restore font color */
+    xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FOREGROUND, get_colorpixel("#FFFFFF"));
+
+    for (int i = 0; i < sizeof(crash_text) / sizeof(char*); i++) {
+        int text_len = strlen(crash_text[i]);
+        char *full_text = convert_utf8_to_ucs2(crash_text[i], &text_len);
+        xcb_image_text_16(conn, text_len, pixmap, pixmap_gc, 8 /* X */,
+                          3 + (i + 1) * font_height /* Y = baseline of font */,
+                          (xcb_char2b_t*)full_text);
+        free(full_text);
+    }
+
+    /* Copy the contents of the pixmap to the real window */
+    xcb_copy_area(conn, pixmap, win, pixmap_gc, 0, 0, 0, 0, width, height);
+    xcb_flush(conn);
+
+    return 1;
+}
+
+/*
+ * Handles keypresses of 'e' or 'r' to exit or restart i3
+ *
+ */
+static int sig_handle_key_press(void *ignored, xcb_connection_t *conn, xcb_key_press_event_t *event) {
+    uint16_t state = event->state;
+
+    /* Apparantly, after activating numlock once, the numlock modifier
+     * stays turned on (use xev(1) to verify). So, to resolve useful
+     * keysyms, we remove the numlock flag from the event state */
+    state &= ~xcb_numlock_mask;
+
+    xcb_keysym_t sym = xcb_key_press_lookup_keysym(keysyms, event, state);
+
+    if (sym == 'e') {
+        DLOG("User issued exit-command, raising error again.\n");
+        raise(raised_signal);
+        exit(1);
+    }
+
+    if (sym == 'r')
+        i3_restart(false);
+
+    if (sym == 'f')
+        i3_restart(true);
+
+    return 1;
+}
+
+/*
+ * Opens the window we use for input/output and maps it
+ *
+ */
+static xcb_window_t open_input_window(xcb_connection_t *conn, Rect screen_rect, uint32_t width, uint32_t height) {
+    xcb_window_t win = xcb_generate_id(conn);
+
+    uint32_t mask = 0;
+    uint32_t values[2];
+
+    mask |= XCB_CW_BACK_PIXEL;
+    values[0] = 0;
+
+    mask |= XCB_CW_OVERRIDE_REDIRECT;
+    values[1] = 1;
+
+    /* center each popup on the specified screen */
+    uint32_t x = screen_rect.x + ((screen_rect.width / 2) - (width / 2)),
+             y = screen_rect.y + ((screen_rect.height / 2) - (height / 2));
+
+    xcb_create_window(conn,
+                      XCB_COPY_FROM_PARENT,
+                      win, /* the window id */
+                      root, /* parent == root */
+                      x, y, width, height, /* dimensions */
+                      0, /* border = 0, we draw our own */
+                      XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                      XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
+                      mask,
+                      values);
+
+    /* Map the window (= make it visible) */
+    xcb_map_window(conn, win);
+
+    return win;
+}
+
+/*
+ * Handle signals
+ * It creates a window asking the user to restart in-place
+ * or exit to generate a core dump
+ *
+ */
+void handle_signal(int sig, siginfo_t *info, void *data) {
+    DLOG("i3 crashed. SIG: %d\n", sig);
+
+    struct sigaction action;
+    action.sa_handler = SIG_DFL;
+    sigaction(sig, &action, NULL);
+    raised_signal = sig;
+
+    /* width and height of the popup window, so that the text fits in */
+    int crash_text_num = sizeof(crash_text) / sizeof(char*);
+    int height = 13 + (crash_text_num * config.font.height);
+
+    /* calculate width for longest text */
+    int text_len = strlen(crash_text[crash_text_longest]);
+    char *longest_text = convert_utf8_to_ucs2(crash_text[crash_text_longest], &text_len);
+    int font_width = predict_text_width(longest_text, text_len);
+    int width = font_width + 20;
+
+    /* Open a popup window on each virtual screen */
+    Output *screen;
+    xcb_window_t win;
+    TAILQ_FOREACH(screen, &outputs, outputs) {
+        if (!screen->active)
+            continue;
+        win = open_input_window(conn, screen->rect, width, height);
+
+        /* Create pixmap */
+        pixmap = xcb_generate_id(conn);
+        pixmap_gc = xcb_generate_id(conn);
+        xcb_create_pixmap(conn, root_depth, pixmap, win, width, height);
+        xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
+
+        /* Create graphics context */
+        xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, config.font.id);
+
+        /* Grab the keyboard to get all input */
+        xcb_grab_keyboard(conn, false, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+
+        /* Grab the cursor inside the popup */
+        xcb_grab_pointer(conn, false, win, XCB_NONE, XCB_GRAB_MODE_ASYNC,
+                         XCB_GRAB_MODE_ASYNC, win, XCB_NONE, XCB_CURRENT_TIME);
+
+        sig_draw_window(win, width, height, config.font.height);
+        xcb_flush(conn);
+    }
+
+    xcb_generic_event_t *event;
+    /* Yay, more own eventhandlers… */
+    while ((event = xcb_wait_for_event(conn))) {
+        /* Strip off the highest bit (set if the event is generated) */
+        int type = (event->response_type & 0x7F);
+        if (type == XCB_KEY_PRESS) {
+            sig_handle_key_press(NULL, conn, (xcb_key_press_event_t*)event);
+        }
+        free(event);
+    }
+}
+
+/*
+ * Setup signal handlers to safely handle SIGSEGV and SIGFPE
+ *
+ */
+void setup_signal_handler() {
+    struct sigaction action;
+
+    action.sa_sigaction = handle_signal;
+    action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
+    sigemptyset(&action.sa_mask);
+
+    if (sigaction(SIGSEGV, &action, NULL) == -1 ||
+        sigaction(SIGABRT, &action, NULL) == -1 ||
+        sigaction(SIGFPE, &action, NULL) == -1)
+        ELOG("Could not setup signal handler");
+}
diff --git a/src/tree.c b/src/tree.c
new file mode 100644 (file)
index 0000000..272276f
--- /dev/null
@@ -0,0 +1,535 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#include "all.h"
+
+struct Con *croot;
+struct Con *focused;
+
+struct all_cons_head all_cons = TAILQ_HEAD_INITIALIZER(all_cons);
+
+/*
+ * Loads tree from ~/.i3/_restart.json (used for in-place restarts).
+ *
+ */
+bool tree_restore(const char *path, xcb_get_geometry_reply_t *geometry) {
+    char *globbed = resolve_tilde(path);
+
+    if (!path_exists(globbed)) {
+        LOG("%s does not exist, not restoring tree\n", globbed);
+        free(globbed);
+        return false;
+    }
+
+    /* TODO: refactor the following */
+    croot = con_new(NULL, NULL);
+    croot->rect = (Rect){
+        geometry->x,
+        geometry->y,
+        geometry->width,
+        geometry->height
+    };
+    focused = croot;
+
+    tree_append_json(globbed);
+
+    printf("appended tree, using new root\n");
+    croot = TAILQ_FIRST(&(croot->nodes_head));
+    printf("new root = %p\n", croot);
+    Con *out = TAILQ_FIRST(&(croot->nodes_head));
+    printf("out = %p\n", out);
+    Con *ws = TAILQ_FIRST(&(out->nodes_head));
+    printf("ws = %p\n", ws);
+
+    return true;
+}
+
+/*
+ * Initializes the tree by creating the root node. The CT_OUTPUT Cons below the
+ * root node are created in randr.c for each Output.
+ *
+ */
+void tree_init(xcb_get_geometry_reply_t *geometry) {
+    croot = con_new(NULL, NULL);
+    FREE(croot->name);
+    croot->name = "root";
+    croot->type = CT_ROOT;
+    croot->rect = (Rect){
+        geometry->x,
+        geometry->y,
+        geometry->width,
+        geometry->height
+    };
+}
+
+/*
+ * Opens an empty container in the current container
+ *
+ */
+Con *tree_open_con(Con *con, i3Window *window) {
+    if (con == NULL) {
+        /* every focusable Con has a parent (outputs have parent root) */
+        con = focused->parent;
+        /* If the parent is an output, we are on a workspace. In this case,
+         * the new container needs to be opened as a leaf of the workspace. */
+        if (con->parent->type == CT_OUTPUT && con->type != CT_DOCKAREA) {
+            con = focused;
+        }
+
+        /* If the currently focused container is a floating container, we
+         * attach the new container to the currently focused spot in its
+         * workspace. */
+        if (con->type == CT_FLOATING_CON) {
+            con = con_descend_tiling_focused(con->parent);
+            if (con->type != CT_WORKSPACE)
+                con = con->parent;
+        }
+        DLOG("con = %p\n", con);
+    }
+
+    assert(con != NULL);
+
+    /* 3. create the container and attach it to its parent */
+    Con *new = con_new(con, window);
+
+    /* 4: re-calculate child->percent for each child */
+    con_fix_percent(con);
+
+    return new;
+}
+
+static bool _is_con_mapped(Con *con) {
+    Con *child;
+
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+        if (_is_con_mapped(child))
+            return true;
+
+    return con->mapped;
+}
+
+/*
+ * Closes the given container including all children.
+ * Returns true if the container was killed or false if just WM_DELETE was sent
+ * and the window is expected to kill itself.
+ *
+ */
+bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent) {
+    bool was_mapped = con->mapped;
+    Con *parent = con->parent;
+
+    if (!was_mapped) {
+        /* Even if the container itself is not mapped, its children may be
+         * mapped (for example split containers don't have a mapped window on
+         * their own but usually contain mapped children). */
+        was_mapped = _is_con_mapped(con);
+    }
+
+    /* Get the container which is next focused */
+    Con *next = con_next_focused(con);
+    DLOG("next = %p, focused = %p\n", next, focused);
+
+    DLOG("closing %p, kill_window = %d\n", con, kill_window);
+    Con *child, *nextchild;
+    bool abort_kill = false;
+    /* We cannot use TAILQ_FOREACH because the children get deleted
+     * in their parent’s nodes_head */
+    for (child = TAILQ_FIRST(&(con->nodes_head)); child; ) {
+        nextchild = TAILQ_NEXT(child, nodes);
+        DLOG("killing child=%p\n", child);
+        if (!tree_close(child, kill_window, true))
+            abort_kill = true;
+        child = nextchild;
+    }
+
+    if (abort_kill) {
+        DLOG("One of the children could not be killed immediately (WM_DELETE sent), aborting.\n");
+        return false;
+    }
+
+    if (con->window != NULL) {
+        if (kill_window != DONT_KILL_WINDOW) {
+            x_window_kill(con->window->id, kill_window);
+            return false;
+        } else {
+            xcb_void_cookie_t cookie;
+            /* un-parent the window */
+            cookie = xcb_reparent_window(conn, con->window->id, root, 0, 0);
+
+            /* Ignore X11 errors for the ReparentWindow request.
+             * X11 Errors are returned when the window was already destroyed */
+            add_ignore_event(cookie.sequence, 0);
+
+            /* We are no longer handling this window, thus set WM_STATE to
+             * WM_STATE_WITHDRAWN (see ICCCM 4.1.3.1) */
+            long data[] = { XCB_ICCCM_WM_STATE_WITHDRAWN, XCB_NONE };
+            cookie = xcb_change_property(conn, XCB_PROP_MODE_REPLACE,
+                        con->window->id, A_WM_STATE, A_WM_STATE, 32, 2, data);
+
+            /* Ignore X11 errors for the ReparentWindow request.
+             * X11 Errors are returned when the window was already destroyed */
+            add_ignore_event(cookie.sequence, 0);
+        }
+        FREE(con->window->class_class);
+        FREE(con->window->class_instance);
+        FREE(con->window->name_x);
+        FREE(con->window->name_json);
+        free(con->window);
+    }
+
+    /* kill the X11 part of this container */
+    x_con_kill(con);
+
+    con_detach(con);
+    if (con->type != CT_FLOATING_CON) {
+        /* If the container is *not* floating, we might need to re-distribute
+         * percentage values for the resized containers. */
+        con_fix_percent(parent);
+    }
+
+    if (con_is_floating(con)) {
+        Con *ws = con_get_workspace(con);
+        DLOG("Container was floating, killing floating container\n");
+        tree_close(parent, DONT_KILL_WINDOW, false);
+        DLOG("parent container killed\n");
+        if (con == focused) {
+            DLOG("This is the focused container, i need to find another one to focus. I start looking at ws = %p\n", ws);
+            /* go down the focus stack as far as possible */
+            next = con_descend_focused(ws);
+
+            dont_kill_parent = true;
+            DLOG("Alright, focusing %p\n", next);
+        } else {
+            next = NULL;
+        }
+    }
+
+    free(con->name);
+    FREE(con->deco_render_params);
+    TAILQ_REMOVE(&all_cons, con, all_cons);
+    free(con);
+
+    /* in the case of floating windows, we already focused another container
+     * when closing the parent, so we can exit now. */
+    if (!next) {
+        DLOG("No next container, i will just exit now\n");
+        return true;
+    }
+
+    if (was_mapped || con == focused) {
+        if ((kill_window != DONT_KILL_WINDOW) || !dont_kill_parent || con == focused) {
+            DLOG("focusing %p / %s\n", next, next->name);
+            /* TODO: check if the container (or one of its children) was focused */
+            if (next->type == CT_DOCKAREA) {
+                /* Instead of focusing the dockarea, we need to restore focus to the workspace */
+                con_focus(con_descend_focused(output_get_content(next->parent)));
+            } else {
+                con_focus(next);
+            }
+        }
+        else {
+            DLOG("not focusing because we're not killing anybody");
+        }
+    } else {
+        DLOG("not focusing, was not mapped\n");
+    }
+
+    /* check if the parent container is empty now and close it */
+    if (!dont_kill_parent)
+        CALL(parent, on_remove_child);
+
+    return true;
+}
+
+/*
+ * Closes the current container using tree_close().
+ *
+ */
+void tree_close_con(kill_window_t kill_window) {
+    assert(focused != NULL);
+    if (focused->type == CT_WORKSPACE) {
+        LOG("Cannot close workspace\n");
+        return;
+    }
+
+    /* There *should* be no possibility to focus outputs / root container */
+    assert(focused->type != CT_OUTPUT);
+    assert(focused->type != CT_ROOT);
+
+    /* Kill con */
+    tree_close(focused, kill_window, false);
+}
+
+/*
+ * Splits (horizontally or vertically) the given container by creating a new
+ * container which contains the old one and the future ones.
+ *
+ */
+void tree_split(Con *con, orientation_t orientation) {
+    /* for a workspace, we just need to change orientation */
+    if (con->type == CT_WORKSPACE) {
+        DLOG("Workspace, simply changing orientation to %d\n", orientation);
+        con->orientation = orientation;
+        return;
+    }
+
+    Con *parent = con->parent;
+    /* if we are in a container whose parent contains only one
+     * child (its split functionality is unused so far), we just change the
+     * orientation (more intuitive than splitting again) */
+    if (con_num_children(parent) == 1) {
+        parent->orientation = orientation;
+        DLOG("Just changing orientation of existing container\n");
+        return;
+    }
+
+    DLOG("Splitting in orientation %d\n", orientation);
+
+    /* 2: replace it with a new Con */
+    Con *new = con_new(NULL, NULL);
+    TAILQ_REPLACE(&(parent->nodes_head), con, new, nodes);
+    TAILQ_REPLACE(&(parent->focus_head), con, new, focused);
+    new->parent = parent;
+    new->orientation = orientation;
+
+    /* 3: swap 'percent' (resize factor) */
+    new->percent = con->percent;
+    con->percent = 0.0;
+
+    /* 4: add it as a child to the new Con */
+    con_attach(con, new, false);
+}
+
+/*
+ * Moves focus one level up.
+ *
+ */
+void level_up() {
+    /* We cannot go up when we are in fullscreen mode at the moment, that would
+     * be totally not intuitive */
+    if (focused->fullscreen_mode != CF_NONE) {
+        LOG("Currently in fullscreen, not going up\n");
+        return;
+    }
+    /* We can focus up to the workspace, but not any higher in the tree */
+    if ((focused->parent->type != CT_CON &&
+        focused->parent->type != CT_WORKSPACE) ||
+        focused->type == CT_WORKSPACE) {
+        LOG("Cannot go up any further\n");
+        return;
+    }
+    con_focus(focused->parent);
+}
+
+/*
+ * Moves focus one level down.
+ *
+ */
+void level_down() {
+    /* Go down the focus stack of the current node */
+    Con *next = TAILQ_FIRST(&(focused->focus_head));
+    if (next == TAILQ_END(&(focused->focus_head))) {
+        printf("cannot go down\n");
+        return;
+    }
+    con_focus(next);
+}
+
+static void mark_unmapped(Con *con) {
+    Con *current;
+
+    con->mapped = false;
+    TAILQ_FOREACH(current, &(con->nodes_head), nodes)
+        mark_unmapped(current);
+    if (con->type == CT_WORKSPACE) {
+        /* We need to call mark_unmapped on floating nodes aswell since we can
+         * make containers floating. */
+        TAILQ_FOREACH(current, &(con->floating_head), floating_windows)
+            mark_unmapped(current);
+    }
+}
+
+/*
+ * Renders the tree, that is rendering all outputs using render_con() and
+ * pushing the changes to X11 using x_push_changes().
+ *
+ */
+void tree_render() {
+    if (croot == NULL)
+        return;
+
+    DLOG("-- BEGIN RENDERING --\n");
+    /* Reset map state for all nodes in tree */
+    /* TODO: a nicer method to walk all nodes would be good, maybe? */
+    mark_unmapped(croot);
+    croot->mapped = true;
+
+    render_con(croot, false);
+
+    x_push_changes(croot);
+    DLOG("-- END RENDERING --\n");
+}
+
+/*
+ * Recursive function to walk the tree until a con can be found to focus.
+ *
+ */
+static bool _tree_next(Con *con, char way, orientation_t orientation, bool wrap) {
+    /* Stop recursing at workspaces */
+    if (con->type == CT_WORKSPACE)
+        return false;
+
+    if (con->type == CT_FLOATING_CON) {
+        /* TODO: implement focus for floating windows */
+        return false;
+    }
+
+    Con *parent = con->parent;
+
+    /* If the orientation does not match or there is no other con to focus, we
+     * need to go higher in the hierarchy */
+    if (con_orientation(parent) != orientation ||
+        con_num_children(parent) == 1)
+        return _tree_next(parent, way, orientation, wrap);
+
+    Con *current = TAILQ_FIRST(&(parent->focus_head));
+    /* TODO: when can the following happen (except for floating windows, which
+     * are handled above)? */
+    if (TAILQ_EMPTY(&(parent->nodes_head))) {
+        DLOG("nothing to focus\n");
+        return false;
+    }
+
+    Con *next;
+    if (way == 'n')
+        next = TAILQ_NEXT(current, nodes);
+    else next = TAILQ_PREV(current, nodes_head, nodes);
+
+    if (!next) {
+        if (!config.force_focus_wrapping) {
+            /* If there is no next/previous container, we check if we can focus one
+             * when going higher (without wrapping, though). If so, we are done, if
+             * not, we wrap */
+            if (_tree_next(parent, way, orientation, false))
+                return true;
+
+            if (!wrap)
+                return false;
+        }
+
+        if (way == 'n')
+            next = TAILQ_FIRST(&(parent->nodes_head));
+        else next = TAILQ_LAST(&(parent->nodes_head), nodes_head);
+    }
+
+    /* 3: focus choice comes in here. at the moment we will go down
+     * until we find a window */
+    /* TODO: check for window, atm we only go down as far as possible */
+    con_focus(con_descend_focused(next));
+    return true;
+}
+
+/*
+ * Changes focus in the given way (next/previous) and given orientation
+ * (horizontal/vertical).
+ *
+ */
+void tree_next(char way, orientation_t orientation) {
+    _tree_next(focused, way, orientation, true);
+}
+
+/*
+ * tree_flatten() removes pairs of redundant split containers, e.g.:
+ *       [workspace, horizontal]
+ *   [v-split]           [child3]
+ *   [h-split]
+ * [child1] [child2]
+ * In this example, the v-split and h-split container are redundant.
+ * Such a situation can be created by moving containers in a direction which is
+ * not the orientation of their parent container. i3 needs to create a new
+ * split container then and if you move containers this way multiple times,
+ * redundant chains of split-containers can be the result.
+ *
+ */
+void tree_flatten(Con *con) {
+    Con *current, *child, *parent = con->parent;
+    DLOG("Checking if I can flatten con = %p / %s\n", con, con->name);
+
+    /* We only consider normal containers without windows */
+    if (con->type != CT_CON || con->window != NULL)
+        goto recurse;
+
+    /* Ensure it got only one child */
+    child = TAILQ_FIRST(&(con->nodes_head));
+    if (child == NULL || TAILQ_NEXT(child, nodes) != NULL)
+        goto recurse;
+
+    /* The child must have a different orientation than the con but the same as
+     * the con’s parent to be redundant */
+    if (con->orientation == NO_ORIENTATION ||
+        child->orientation == NO_ORIENTATION ||
+        con->orientation == child->orientation ||
+        child->orientation != parent->orientation)
+        goto recurse;
+
+    DLOG("Alright, I have to flatten this situation now. Stay calm.\n");
+    /* 1: save focus */
+    Con *focus_next = TAILQ_FIRST(&(child->focus_head));
+
+    DLOG("detaching...\n");
+    /* 2: re-attach the children to the parent before con */
+    while (!TAILQ_EMPTY(&(child->nodes_head))) {
+        current = TAILQ_FIRST(&(child->nodes_head));
+        DLOG("detaching current=%p / %s\n", current, current->name);
+        con_detach(current);
+        DLOG("re-attaching\n");
+        /* We don’t use con_attach() here because for a CT_CON, the special
+         * case handling of con_attach() does not trigger. So all it would do
+         * is calling TAILQ_INSERT_AFTER, but with the wrong container. So we
+         * directly use the TAILQ macros. */
+        current->parent = parent;
+        TAILQ_INSERT_BEFORE(con, current, nodes);
+        DLOG("attaching to focus list\n");
+        TAILQ_INSERT_TAIL(&(parent->focus_head), current, focused);
+        current->percent = con->percent;
+    }
+    DLOG("re-attached all\n");
+
+    /* 3: restore focus, if con was focused */
+    if (focus_next != NULL &&
+        TAILQ_FIRST(&(parent->focus_head)) == con) {
+        DLOG("restoring focus to focus_next=%p\n", focus_next);
+        TAILQ_REMOVE(&(parent->focus_head), focus_next, focused);
+        TAILQ_INSERT_HEAD(&(parent->focus_head), focus_next, focused);
+        DLOG("restored focus.\n");
+    }
+
+    /* 4: close the redundant cons */
+    DLOG("closing redundant cons\n");
+    tree_close(con, DONT_KILL_WINDOW, true);
+
+    /* Well, we got to abort the recursion here because we destroyed the
+     * container. However, if tree_flatten() is called sufficiently often,
+     * there can’t be the situation of having two pairs of redundant containers
+     * at once. Therefore, we can safely abort the recursion on this level
+     * after flattening. */
+    return;
+
+recurse:
+    /* We cannot use normal foreach here because tree_flatten might close the
+     * current container. */
+    current = TAILQ_FIRST(&(con->nodes_head));
+    while (current != NULL) {
+        Con *next = TAILQ_NEXT(current, nodes);
+        tree_flatten(current);
+        current = next;
+    }
+
+    current = TAILQ_FIRST(&(con->floating_head));
+    while (current != NULL) {
+        Con *next = TAILQ_NEXT(current, floating_windows);
+        tree_flatten(current);
+        current = next;
+    }
+}
diff --git a/src/util.c b/src/util.c
new file mode 100644 (file)
index 0000000..1ad43d3
--- /dev/null
@@ -0,0 +1,509 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * util.c: Utility functions, which can be useful everywhere.
+ *
+ */
+#include <sys/wait.h>
+#include <stdarg.h>
+#include <iconv.h>
+#if defined(__OpenBSD__)
+#include <sys/cdefs.h>
+#endif
+#include <fcntl.h>
+#include <pwd.h>
+#include <yajl/yajl_version.h>
+#include <libgen.h>
+
+#include "all.h"
+
+static iconv_t conversion_descriptor = 0;
+
+int min(int a, int b) {
+    return (a < b ? a : b);
+}
+
+int max(int a, int b) {
+    return (a > b ? a : b);
+}
+
+bool rect_contains(Rect rect, uint32_t x, uint32_t y) {
+    return (x >= rect.x &&
+            x <= (rect.x + rect.width) &&
+            y >= rect.y &&
+            y <= (rect.y + rect.height));
+}
+
+Rect rect_add(Rect a, Rect b) {
+    return (Rect){a.x + b.x,
+                  a.y + b.y,
+                  a.width + b.width,
+                  a.height + b.height};
+}
+
+/*
+ * Updates *destination with new_value and returns true if it was changed or false
+ * if it was the same
+ *
+ */
+bool update_if_necessary(uint32_t *destination, const uint32_t new_value) {
+    uint32_t old_value = *destination;
+
+    return ((*destination = new_value) != old_value);
+}
+
+/*
+ * The s* functions (safe) are wrappers around malloc, strdup, …, which exits if one of
+ * the called functions returns NULL, meaning that there is no more memory available
+ *
+ */
+void *smalloc(size_t size) {
+    void *result = malloc(size);
+    exit_if_null(result, "Error: out of memory (malloc(%zd))\n", size);
+    return result;
+}
+
+void *scalloc(size_t size) {
+    void *result = calloc(size, 1);
+    exit_if_null(result, "Error: out of memory (calloc(%zd))\n", size);
+    return result;
+}
+
+void *srealloc(void *ptr, size_t size) {
+    void *result = realloc(ptr, size);
+    exit_if_null(result, "Error: out memory (realloc(%zd))\n", size);
+    return result;
+}
+
+char *sstrdup(const char *str) {
+    char *result = strdup(str);
+    exit_if_null(result, "Error: out of memory (strdup())\n");
+    return result;
+}
+
+/*
+ * Starts the given application by passing it through a shell. We use double fork
+ * to avoid zombie processes. As the started application’s parent exits (immediately),
+ * the application is reparented to init (process-id 1), which correctly handles
+ * childs, so we don’t have to do it :-).
+ *
+ * The shell is determined by looking for the SHELL environment variable. If it
+ * does not exist, /bin/sh is used.
+ *
+ */
+void start_application(const char *command) {
+    LOG("executing: %s\n", command);
+    if (fork() == 0) {
+        /* Child process */
+        setsid();
+        if (fork() == 0) {
+            /* Stores the path of the shell */
+            static const char *shell = NULL;
+
+            if (shell == NULL)
+                if ((shell = getenv("SHELL")) == NULL)
+                    shell = "/bin/sh";
+
+            /* This is the child */
+            execl(shell, shell, "-c", command, (void*)NULL);
+            /* not reached */
+        }
+        exit(0);
+    }
+    wait(0);
+}
+
+/*
+ * exec()s an i3 utility, for example the config file migration script or
+ * i3-nagbar. This function first searches $PATH for the given utility named,
+ * then falls back to the dirname() of the i3 executable path and then falls
+ * back to the dirname() of the target of /proc/self/exe (on linux).
+ *
+ * This function should be called after fork()ing.
+ *
+ * The first argument of the given argv vector will be overwritten with the
+ * executable name, so pass NULL.
+ *
+ * If the utility cannot be found in any of these locations, it exits with
+ * return code 2.
+ *
+ */
+void exec_i3_utility(char *name, char *argv[]) {
+    /* start the migration script, search PATH first */
+    char *migratepath = name;
+    argv[0] = migratepath;
+    execvp(migratepath, argv);
+
+    /* if the script is not in path, maybe the user installed to a strange
+     * location and runs the i3 binary with an absolute path. We use
+     * argv[0]’s dirname */
+    char *pathbuf = strdup(start_argv[0]);
+    char *dir = dirname(pathbuf);
+    asprintf(&migratepath, "%s/%s", dir, name);
+    argv[0] = migratepath;
+    execvp(migratepath, argv);
+
+#if defined(__linux__)
+    /* on linux, we have one more fall-back: dirname(/proc/self/exe) */
+    char buffer[BUFSIZ];
+    if (readlink("/proc/self/exe", buffer, BUFSIZ) == -1) {
+        warn("could not read /proc/self/exe");
+        exit(1);
+    }
+    dir = dirname(buffer);
+    asprintf(&migratepath, "%s/%s", dir, name);
+    argv[0] = migratepath;
+    execvp(migratepath, argv);
+#endif
+
+    warn("Could not start %s", name);
+    exit(2);
+}
+
+/*
+ * Checks a generic cookie for errors and quits with the given message if there
+ * was an error.
+ *
+ */
+void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie, char *err_message) {
+    xcb_generic_error_t *error = xcb_request_check(conn, cookie);
+    if (error != NULL) {
+        fprintf(stderr, "ERROR: %s (X error %d)\n", err_message , error->error_code);
+        xcb_disconnect(conn);
+        exit(-1);
+    }
+}
+
+/*
+ * Converts the given string to UCS-2 big endian for use with
+ * xcb_image_text_16(). The amount of real glyphs is stored in real_strlen,
+ * a buffer containing the UCS-2 encoded string (16 bit per glyph) is
+ * returned. It has to be freed when done.
+ *
+ */
+char *convert_utf8_to_ucs2(char *input, int *real_strlen) {
+    size_t input_size = strlen(input) + 1;
+    /* UCS-2 consumes exactly two bytes for each glyph */
+    int buffer_size = input_size * 2;
+
+    char *buffer = smalloc(buffer_size);
+    size_t output_size = buffer_size;
+    /* We need to use an additional pointer, because iconv() modifies it */
+    char *output = buffer;
+
+    /* We convert the input into UCS-2 big endian */
+    if (conversion_descriptor == 0) {
+        conversion_descriptor = iconv_open("UCS-2BE", "UTF-8");
+        if (conversion_descriptor == 0) {
+            fprintf(stderr, "error opening the conversion context\n");
+            exit(1);
+        }
+    }
+
+    /* Get the conversion descriptor back to original state */
+    iconv(conversion_descriptor, NULL, NULL, NULL, NULL);
+
+    /* Convert our text */
+    int rc = iconv(conversion_descriptor, (void*)&input, &input_size, &output, &output_size);
+    if (rc == (size_t)-1) {
+        perror("Converting to UCS-2 failed");
+        if (real_strlen != NULL)
+            *real_strlen = 0;
+        return NULL;
+    }
+
+    if (real_strlen != NULL)
+        *real_strlen = ((buffer_size - output_size) / 2) - 1;
+
+    return buffer;
+}
+
+/*
+ * This function resolves ~ in pathnames.
+ * It may resolve wildcards in the first part of the path, but if no match
+ * or multiple matches are found, it just returns a copy of path as given.
+ *
+ */
+char *resolve_tilde(const char *path) {
+        static glob_t globbuf;
+        char *head, *tail, *result;
+
+        tail = strchr(path, '/');
+        head = strndup(path, tail ? tail - path : strlen(path));
+
+        int res = glob(head, GLOB_TILDE, NULL, &globbuf);
+        free(head);
+        /* no match, or many wildcard matches are bad */
+        if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1)
+                result = sstrdup(path);
+        else if (res != 0) {
+                die("glob() failed");
+        } else {
+                head = globbuf.gl_pathv[0];
+                result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1);
+                strncpy(result, head, strlen(head));
+                if (tail)
+                    strncat(result, tail, strlen(tail));
+        }
+        globfree(&globbuf);
+
+        return result;
+}
+
+/*
+ * Checks if the given path exists by calling stat().
+ *
+ */
+bool path_exists(const char *path) {
+        struct stat buf;
+        return (stat(path, &buf) == 0);
+}
+
+/*
+ * Goes through the list of arguments (for exec()) and checks if the given argument
+ * is present. If not, it copies the arguments (because we cannot realloc it) and
+ * appends the given argument.
+ *
+ */
+static char **append_argument(char **original, char *argument) {
+    int num_args;
+    for (num_args = 0; original[num_args] != NULL; num_args++) {
+        DLOG("original argument: \"%s\"\n", original[num_args]);
+        /* If the argument is already present we return the original pointer */
+        if (strcmp(original[num_args], argument) == 0)
+            return original;
+    }
+    /* Copy the original array */
+    char **result = smalloc((num_args+2) * sizeof(char*));
+    memcpy(result, original, num_args * sizeof(char*));
+    result[num_args] = argument;
+    result[num_args+1] = NULL;
+
+    return result;
+}
+
+/*
+ * Returns the name of a temporary file with the specified prefix.
+ *
+ */
+char *get_process_filename(const char *prefix) {
+    char *dir = getenv("XDG_RUNTIME_DIR");
+    if (dir == NULL) {
+        struct passwd *pw = getpwuid(getuid());
+        const char *username = pw ? pw->pw_name : "unknown";
+        if (asprintf(&dir, "/tmp/i3-%s", username) == -1) {
+            perror("asprintf()");
+            return NULL;
+        }
+    } else {
+        char *tmp;
+        if (asprintf(&tmp, "%s/i3", dir) == -1) {
+            perror("asprintf()");
+            return NULL;
+        }
+        dir = tmp;
+    }
+    if (!path_exists(dir)) {
+        if (mkdir(dir, 0700) == -1) {
+            perror("mkdir()");
+            return NULL;
+        }
+    }
+    char *filename;
+    if (asprintf(&filename, "%s/%s.%d", dir, prefix, getpid()) == -1) {
+        perror("asprintf()");
+        filename = NULL;
+    }
+
+    free(dir);
+    return filename;
+}
+
+#define y(x, ...) yajl_gen_ ## x (gen, ##__VA_ARGS__)
+#define ystr(str) yajl_gen_string(gen, (unsigned char*)str, strlen(str))
+
+char *store_restart_layout() {
+    setlocale(LC_NUMERIC, "C");
+#if YAJL_MAJOR >= 2
+    yajl_gen gen = yajl_gen_alloc(NULL);
+#else
+    yajl_gen gen = yajl_gen_alloc(NULL, NULL);
+#endif
+
+    dump_node(gen, croot, true);
+
+    setlocale(LC_NUMERIC, "");
+
+    const unsigned char *payload;
+#if YAJL_MAJOR >= 2
+    size_t length;
+#else
+    unsigned int length;
+#endif
+    y(get_buf, &payload, &length);
+
+    /* create a temporary file if one hasn't been specified, or just
+     * resolve the tildes in the specified path */
+    char *filename;
+    if (config.restart_state_path == NULL) {
+        filename = get_process_filename("restart-state");
+        if (!filename)
+            return NULL;
+    } else {
+        filename = resolve_tilde(config.restart_state_path);
+    }
+
+    int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+    if (fd == -1) {
+        perror("open()");
+        free(filename);
+        return NULL;
+    }
+
+    int written = 0;
+    while (written < length) {
+        int n = write(fd, payload + written, length - written);
+        /* TODO: correct error-handling */
+        if (n == -1) {
+            perror("write()");
+            free(filename);
+            return NULL;
+        }
+        if (n == 0) {
+            printf("write == 0?\n");
+            free(filename);
+            return NULL;
+        }
+        written += n;
+#if YAJL_MAJOR >= 2
+        printf("written: %d of %zd\n", written, length);
+#else
+        printf("written: %d of %d\n", written, length);
+#endif
+    }
+    close(fd);
+
+    if (length > 0) {
+        printf("layout: %.*s\n", (int)length, payload);
+    }
+
+    y(free);
+
+    return filename;
+}
+
+/*
+ * Restart i3 in-place
+ * appends -a to argument list to disable autostart
+ *
+ */
+void i3_restart(bool forget_layout) {
+    char *restart_filename = forget_layout ? NULL : store_restart_layout();
+
+    kill_configerror_nagbar(true);
+
+    restore_geometry();
+
+    ipc_shutdown();
+
+    LOG("restarting \"%s\"...\n", start_argv[0]);
+    /* make sure -a is in the argument list or append it */
+    start_argv = append_argument(start_argv, "-a");
+
+    /* replace -r <file> so that the layout is restored */
+    if (restart_filename != NULL) {
+        /* create the new argv */
+        int num_args;
+        for (num_args = 0; start_argv[num_args] != NULL; num_args++);
+        char **new_argv = scalloc((num_args + 3) * sizeof(char*));
+
+        /* copy the arguments, but skip the ones we'll replace */
+        int write_index = 0;
+        bool skip_next = false;
+        for (int i = 0; i < num_args; ++i) {
+            if (skip_next)
+                skip_next = false;
+            else if (!strcmp(start_argv[i], "-r") ||
+                     !strcmp(start_argv[i], "--restart"))
+                skip_next = true;
+            else
+                new_argv[write_index++] = start_argv[i];
+        }
+
+        /* add the arguments we'll replace */
+        new_argv[write_index++] = "--restart";
+        new_argv[write_index] = restart_filename;
+
+        /* swap the argvs */
+        start_argv = new_argv;
+    }
+
+    execvp(start_argv[0], start_argv);
+    /* not reached */
+}
+
+#if defined(__OpenBSD__) || defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Find the first occurrence of the byte string s in byte string l.
+ *
+ */
+void *memmem(const void *l, size_t l_len, const void *s, size_t s_len) {
+    register char *cur, *last;
+    const char *cl = (const char *)l;
+    const char *cs = (const char *)s;
+
+    /* we need something to compare */
+    if (l_len == 0 || s_len == 0)
+        return NULL;
+
+    /* "s" must be smaller or equal to "l" */
+    if (l_len < s_len)
+        return NULL;
+
+    /* special case where s_len == 1 */
+    if (s_len == 1)
+        return memchr(l, (int)*cs, l_len);
+
+    /* the last position where its possible to find "s" in "l" */
+    last = (char *)cl + l_len - s_len;
+
+    for (cur = (char *)cl; cur <= last; cur++)
+        if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
+            return cur;
+
+    return NULL;
+}
+
+#endif
+
+#if defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Returns a pointer to a new string which is a duplicate of the
+ * string, but only copies at most n characters.
+ *
+ */
+char *strndup(const char *str, size_t n) {
+    size_t len;
+    char *copy;
+
+    for (len = 0; len < n && str[len]; len++)
+        continue;
+
+    if ((copy = malloc(len + 1)) == NULL)
+        return (NULL);
+    memcpy(copy, str, len);
+    copy[len] = '\0';
+    return (copy);
+}
+
+#endif
diff --git a/src/window.c b/src/window.c
new file mode 100644 (file)
index 0000000..3dd6645
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ */
+#include "all.h"
+
+/*
+ * Updates the WM_CLASS (consisting of the class and instance) for the
+ * given window.
+ *
+ */
+void window_update_class(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
+        DLOG("empty property, not updating\n");
+        FREE(prop);
+        return;
+    }
+
+    /* We cannot use asprintf here since this property contains two
+     * null-terminated strings (for compatibility reasons). Instead, we
+     * use strdup() on both strings */
+    char *new_class = xcb_get_property_value(prop);
+
+    FREE(win->class_instance);
+    FREE(win->class_class);
+
+    win->class_instance = sstrdup(new_class);
+    if ((strlen(new_class) + 1) < xcb_get_property_value_length(prop))
+        win->class_class = sstrdup(new_class + strlen(new_class) + 1);
+    else win->class_class = NULL;
+    LOG("WM_CLASS changed to %s (instance), %s (class)\n",
+        win->class_instance, win->class_class);
+
+    if (before_mgmt) {
+        free(prop);
+        return;
+    }
+
+    run_assignments(win);
+
+    free(prop);
+}
+
+/*
+ * Updates the name by using _NET_WM_NAME (encoded in UTF-8) for the given
+ * window. Further updates using window_update_name_legacy will be ignored.
+ *
+ */
+void window_update_name(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
+        DLOG("_NET_WM_NAME not specified, not changing\n");
+        FREE(prop);
+        return;
+    }
+
+    /* Save the old pointer to make the update atomic */
+    char *new_name;
+    if (asprintf(&new_name, "%.*s", xcb_get_property_value_length(prop),
+                 (char*)xcb_get_property_value(prop)) == -1) {
+        perror("asprintf()");
+        DLOG("Could not get window name\n");
+        free(prop);
+        return;
+    }
+    /* Convert it to UCS-2 here for not having to convert it later every time we want to pass it to X */
+    int len;
+    char *ucs2_name = convert_utf8_to_ucs2(new_name, &len);
+    if (ucs2_name == NULL) {
+        LOG("Could not convert _NET_WM_NAME to UCS-2, ignoring new hint\n");
+        FREE(new_name);
+        free(prop);
+        return;
+    }
+    FREE(win->name_x);
+    FREE(win->name_json);
+    win->name_json = new_name;
+    win->name_x = ucs2_name;
+    win->name_len = len;
+    win->name_x_changed = true;
+    LOG("_NET_WM_NAME changed to \"%s\"\n", win->name_json);
+
+    win->uses_net_wm_name = true;
+
+    if (before_mgmt) {
+        free(prop);
+        return;
+    }
+
+    run_assignments(win);
+
+    free(prop);
+}
+
+/*
+ * Updates the name by using WM_NAME (encoded in COMPOUND_TEXT). We do not
+ * touch what the client sends us but pass it to xcb_image_text_8. To get
+ * proper unicode rendering, the application has to use _NET_WM_NAME (see
+ * window_update_name()).
+ *
+ */
+void window_update_name_legacy(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
+        DLOG("prop == NULL\n");
+        FREE(prop);
+        return;
+    }
+
+    /* ignore update when the window is known to already have a UTF-8 name */
+    if (win->uses_net_wm_name) {
+        free(prop);
+        return;
+    }
+
+    char *new_name;
+    if (asprintf(&new_name, "%.*s", xcb_get_property_value_length(prop),
+                 (char*)xcb_get_property_value(prop)) == -1) {
+        perror("asprintf()");
+        DLOG("Could not get legacy window name\n");
+        free(prop);
+        return;
+    }
+
+    LOG("Using legacy window title. Note that in order to get Unicode window "
+        "titles in i3, the application has to set _NET_WM_NAME (UTF-8)\n");
+
+    FREE(win->name_x);
+    FREE(win->name_json);
+    win->name_x = new_name;
+    win->name_json = sstrdup(new_name);
+    win->name_len = strlen(new_name);
+    win->name_x_changed = true;
+
+    if (before_mgmt) {
+        free(prop);
+        return;
+    }
+
+    run_assignments(win);
+
+    free(prop);
+}
+
+/*
+ * Updates the CLIENT_LEADER (logical parent window).
+ *
+ */
+void window_update_leader(i3Window *win, xcb_get_property_reply_t *prop) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
+        DLOG("prop == NULL\n");
+        FREE(prop);
+        return;
+    }
+
+    xcb_window_t *leader = xcb_get_property_value(prop);
+    if (leader == NULL) {
+        free(prop);
+        return;
+    }
+
+    DLOG("Client leader changed to %08x\n", *leader);
+
+    win->leader = *leader;
+
+    free(prop);
+}
+
+/*
+ * Updates the TRANSIENT_FOR (logical parent window).
+ *
+ */
+void window_update_transient_for(i3Window *win, xcb_get_property_reply_t *prop) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
+        DLOG("prop == NULL\n");
+        FREE(prop);
+        return;
+    }
+
+    xcb_window_t transient_for;
+    if (!xcb_icccm_get_wm_transient_for_from_reply(&transient_for, prop)) {
+        free(prop);
+        return;
+    }
+
+    DLOG("Transient for changed to %08x\n", transient_for);
+
+    win->transient_for = transient_for;
+
+    free(prop);
+}
+
+/*
+ * Updates the _NET_WM_STRUT_PARTIAL (reserved pixels at the screen edges)
+ *
+ */
+void window_update_strut_partial(i3Window *win, xcb_get_property_reply_t *prop) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0) {
+        DLOG("prop == NULL\n");
+        FREE(prop);
+        return;
+    }
+
+    uint32_t *strut;
+    if (!(strut = xcb_get_property_value(prop))) {
+        free(prop);
+        return;
+    }
+
+    DLOG("Reserved pixels changed to: left = %d, right = %d, top = %d, bottom = %d\n",
+         strut[0], strut[1], strut[2], strut[3]);
+
+    win->reserved = (struct reservedpx){ strut[0], strut[1], strut[2], strut[3] };
+
+    free(prop);
+}
diff --git a/src/workspace.c b/src/workspace.c
new file mode 100644 (file)
index 0000000..4021dd1
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ * workspace.c: Functions for modifying workspaces
+ *
+ */
+#include <limits.h>
+
+#include "all.h"
+
+/*
+ * Returns a pointer to the workspace with the given number (starting at 0),
+ * creating the workspace if necessary (by allocating the necessary amount of
+ * memory and initializing the data structures correctly).
+ *
+ */
+Con *workspace_get(const char *num, bool *created) {
+    Con *output, *workspace = NULL;
+
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
+        GREP_FIRST(workspace, output_get_content(output), !strcasecmp(child->name, num));
+
+    if (workspace == NULL) {
+        LOG("Creating new workspace \"%s\"\n", num);
+        /* unless an assignment is found, we will create this workspace on the current output */
+        output = con_get_output(focused);
+        /* look for assignments */
+        struct Workspace_Assignment *assignment;
+        TAILQ_FOREACH(assignment, &ws_assignments, ws_assignments) {
+            if (strcmp(assignment->name, num) != 0)
+                continue;
+
+            LOG("Found workspace assignment to output \"%s\"\n", assignment->output);
+            GREP_FIRST(output, croot, !strcmp(child->name, assignment->output));
+            break;
+        }
+        Con *content = output_get_content(output);
+        LOG("got output %p with content %p\n", output, content);
+        /* We need to attach this container after setting its type. con_attach
+         * will handle CT_WORKSPACEs differently */
+        workspace = con_new(NULL, NULL);
+        char *name;
+        asprintf(&name, "[i3 con] workspace %s", num);
+        x_set_name(workspace, name);
+        free(name);
+        workspace->type = CT_WORKSPACE;
+        FREE(workspace->name);
+        workspace->name = sstrdup(num);
+        /* We set ->num to the number if this workspace’s name consists only of
+         * a positive number. Otherwise it’s a named ws and num will be -1. */
+        char *end;
+        long parsed_num = strtol(num, &end, 10);
+        if (parsed_num == LONG_MIN ||
+            parsed_num == LONG_MAX ||
+            parsed_num < 0 ||
+            (end && *end != '\0'))
+            workspace->num = -1;
+        else workspace->num = parsed_num;
+        LOG("num = %d\n", workspace->num);
+
+        /* If default_orientation is set to NO_ORIENTATION we
+         * determine workspace orientation from workspace size.
+         * Otherwise we just set the orientation to default_orientation. */
+        if (config.default_orientation == NO_ORIENTATION) {
+            workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
+            DLOG("Auto orientation. Output resolution set to (%d,%d), setting orientation to %d.\n",
+                 workspace->rect.width, workspace->rect.height, workspace->orientation);
+        } else {
+            workspace->orientation = config.default_orientation;
+        }
+
+        con_attach(workspace, content, false);
+
+        ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}");
+        if (created != NULL)
+            *created = true;
+    }
+    else if (created != NULL) {
+        *created = false;
+    }
+
+    return workspace;
+}
+
+/*
+ * Returns true if the workspace is currently visible. Especially important for
+ * multi-monitor environments, as they can have multiple currenlty active
+ * workspaces.
+ *
+ */
+bool workspace_is_visible(Con *ws) {
+    Con *output = con_get_output(ws);
+    if (output == NULL)
+        return false;
+    Con *fs = con_get_fullscreen_con(output, CF_OUTPUT);
+    LOG("workspace visible? fs = %p, ws = %p\n", fs, ws);
+    return (fs == ws);
+}
+
+/*
+ * XXX: we need to clean up all this recursive walking code.
+ *
+ */
+Con *_get_sticky(Con *con, const char *sticky_group, Con *exclude) {
+    Con *current;
+
+    TAILQ_FOREACH(current, &(con->nodes_head), nodes) {
+        if (current != exclude &&
+            current->sticky_group != NULL &&
+            current->window != NULL &&
+            strcmp(current->sticky_group, sticky_group) == 0)
+            return current;
+
+        Con *recurse = _get_sticky(current, sticky_group, exclude);
+        if (recurse != NULL)
+            return recurse;
+    }
+
+    TAILQ_FOREACH(current, &(con->floating_head), floating_windows) {
+        if (current != exclude &&
+            current->sticky_group != NULL &&
+            current->window != NULL &&
+            strcmp(current->sticky_group, sticky_group) == 0)
+            return current;
+
+        Con *recurse = _get_sticky(current, sticky_group, exclude);
+        if (recurse != NULL)
+            return recurse;
+    }
+
+    return NULL;
+}
+
+/*
+ * Reassigns all child windows in sticky containers. Called when the user
+ * changes workspaces.
+ *
+ * XXX: what about sticky containers which contain containers?
+ *
+ */
+static void workspace_reassign_sticky(Con *con) {
+    Con *current;
+    /* 1: go through all containers */
+
+    /* handle all children and floating windows of this node */
+    TAILQ_FOREACH(current, &(con->nodes_head), nodes) {
+        if (current->sticky_group == NULL) {
+            workspace_reassign_sticky(current);
+            continue;
+        }
+
+        LOG("Ah, this one is sticky: %s / %p\n", current->name, current);
+        /* 2: find a window which we can re-assign */
+        Con *output = con_get_output(current);
+        Con *src = _get_sticky(output, current->sticky_group, current);
+
+        if (src == NULL) {
+            LOG("No window found for this sticky group\n");
+            workspace_reassign_sticky(current);
+            continue;
+        }
+
+        x_move_win(src, current);
+        current->window = src->window;
+        current->mapped = true;
+        src->window = NULL;
+        src->mapped = false;
+
+        x_reparent_child(current, src);
+
+        LOG("re-assigned window from src %p to dest %p\n", src, current);
+    }
+
+    TAILQ_FOREACH(current, &(con->floating_head), floating_windows)
+        workspace_reassign_sticky(current);
+}
+
+/*
+ * Switches to the given workspace
+ *
+ */
+void workspace_show(const char *num) {
+    Con *workspace, *current, *old = NULL;
+
+    bool changed_num_workspaces;
+    workspace = workspace_get(num, &changed_num_workspaces);
+
+    /* disable fullscreen for the other workspaces and get the workspace we are
+     * currently on. */
+    TAILQ_FOREACH(current, &(workspace->parent->nodes_head), nodes) {
+        if (current->fullscreen_mode == CF_OUTPUT)
+            old = current;
+        current->fullscreen_mode = CF_NONE;
+    }
+
+    /* enable fullscreen for the target workspace. If it happens to be the
+     * same one we are currently on anyways, we can stop here. */
+    workspace->fullscreen_mode = CF_OUTPUT;
+    if (workspace == con_get_workspace(focused)) {
+        DLOG("Not switching, already there.\n");
+        return;
+    }
+
+    workspace_reassign_sticky(workspace);
+
+    LOG("switching to %p\n", workspace);
+    Con *next = con_descend_focused(workspace);
+
+    if (old && TAILQ_EMPTY(&(old->nodes_head)) && TAILQ_EMPTY(&(old->floating_head))) {
+        /* check if this workspace is currently visible */
+        if (!workspace_is_visible(old)) {
+            LOG("Closing old workspace (%p / %s), it is empty\n", old, old->name);
+            tree_close(old, DONT_KILL_WINDOW, false);
+            ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"empty\"}");
+            changed_num_workspaces = true;
+        }
+    }
+
+    con_focus(next);
+    workspace->fullscreen_mode = CF_OUTPUT;
+    LOG("focused now = %p / %s\n", focused, focused->name);
+
+    /* Update the EWMH hints */
+    if (changed_num_workspaces)
+        ewmh_update_workarea();
+    ewmh_update_current_desktop();
+
+    ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"focus\"}");
+}
+
+/*
+ * Focuses the next workspace.
+ *
+ */
+void workspace_next() {
+    Con *ws = con_get_workspace(focused);
+    Con *next = TAILQ_NEXT(ws, nodes);
+    if (!next)
+        next = TAILQ_FIRST(&(ws->parent->nodes_head));
+
+    workspace_show(next->name);
+}
+
+/*
+ * Focuses the previous workspace.
+ *
+ */
+void workspace_prev() {
+    Con *ws = con_get_workspace(focused);
+    Con *prev = TAILQ_PREV(ws, nodes_head, nodes);
+    if (!prev)
+        prev = TAILQ_LAST(&(ws->parent->nodes_head), nodes_head);
+
+    workspace_show(prev->name);
+}
+
+static bool get_urgency_flag(Con *con) {
+    Con *child;
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+        if (child->urgent || get_urgency_flag(child))
+            return true;
+
+    TAILQ_FOREACH(child, &(con->floating_head), floating_windows)
+        if (child->urgent || get_urgency_flag(child))
+            return true;
+
+    return false;
+}
+
+/*
+ * Goes through all clients on the given workspace and updates the workspace’s
+ * urgent flag accordingly.
+ *
+ */
+void workspace_update_urgent_flag(Con *ws) {
+    bool old_flag = ws->urgent;
+    ws->urgent = get_urgency_flag(ws);
+    DLOG("Workspace urgency flag changed from %d to %d\n", old_flag, ws->urgent);
+
+    if (old_flag != ws->urgent)
+        ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"urgent\"}");
+}
+
+/*
+ * 'Forces' workspace orientation by moving all cons into a new split-con with
+ * the same orientation as the workspace and then changing the workspace
+ * orientation.
+ *
+ */
+void ws_force_orientation(Con *ws, orientation_t orientation) {
+    /* 1: create a new split container */
+    Con *split = con_new(NULL, NULL);
+    split->parent = ws;
+
+    /* 2: copy layout and orientation from workspace */
+    split->layout = ws->layout;
+    split->orientation = ws->orientation;
+
+    Con *old_focused = TAILQ_FIRST(&(ws->focus_head));
+
+    /* 3: move the existing cons of this workspace below the new con */
+    DLOG("Moving cons\n");
+    while (!TAILQ_EMPTY(&(ws->nodes_head))) {
+        Con *child = TAILQ_FIRST(&(ws->nodes_head));
+        con_detach(child);
+        con_attach(child, split, true);
+    }
+
+    /* 4: switch workspace orientation */
+    ws->orientation = orientation;
+
+    /* 5: attach the new split container to the workspace */
+    DLOG("Attaching new split to ws\n");
+    con_attach(split, ws, false);
+
+    /* 6: fix the percentages */
+    con_fix_percent(ws);
+
+    if (old_focused)
+        con_focus(old_focused);
+}
+
+/*
+ * Called when a new con (with a window, not an empty or split con) should be
+ * attached to the workspace (for example when managing a new window or when
+ * moving an existing window to the workspace level).
+ *
+ * Depending on the workspace_layout setting, this function either returns the
+ * workspace itself (default layout) or creates a new stacked/tabbed con and
+ * returns that.
+ *
+ */
+Con *workspace_attach_to(Con *ws) {
+    DLOG("Attaching a window to workspace %p / %s\n", ws, ws->name);
+
+    if (config.default_layout == L_DEFAULT) {
+        DLOG("Default layout, just attaching it to the workspace itself.\n");
+        return ws;
+    }
+
+    DLOG("Non-default layout, creating a new split container\n");
+    /* 1: create a new split container */
+    Con *new = con_new(NULL, NULL);
+    new->parent = ws;
+
+    /* 2: set the requested layout on the split con */
+    new->layout = config.default_layout;
+
+    /* 3: While the layout is irrelevant in stacked/tabbed mode, it needs
+     * to be set. Otherwise, this con will not be interpreted as a split
+     * container. */
+    if (config.default_orientation == NO_ORIENTATION) {
+        new->orientation = (ws->rect.height > ws->rect.width) ? VERT : HORIZ;
+    } else {
+        new->orientation = config.default_orientation;
+    }
+
+    /* 4: attach the new split container to the workspace */
+    DLOG("Attaching new split %p to workspace %p\n", new, ws);
+    con_attach(new, ws, false);
+
+    return new;
+}
diff --git a/src/x.c b/src/x.c
new file mode 100644 (file)
index 0000000..e93e90e
--- /dev/null
+++ b/src/x.c
@@ -0,0 +1,901 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+
+#include "all.h"
+
+/* Stores the X11 window ID of the currently focused window */
+xcb_window_t focused_id = XCB_NONE;
+
+/*
+ * Describes the X11 state we may modify (map state, position, window stack).
+ * There is one entry per container. The state represents the current situation
+ * as X11 sees it (with the exception of the order in the state_head CIRCLEQ,
+ * which represents the order that will be pushed to X11, while old_state_head
+ * represents the current order). It will be updated in x_push_changes().
+ *
+ */
+typedef struct con_state {
+    xcb_window_t id;
+    bool mapped;
+    bool unmap_now;
+    bool child_mapped;
+
+    /* For reparenting, we have a flag (need_reparent) and the X ID of the old
+     * frame this window was in. The latter is necessary because we need to
+     * ignore UnmapNotify events (by changing the window event mask). */
+    bool need_reparent;
+    xcb_window_t old_frame;
+
+    Rect rect;
+    Rect window_rect;
+
+    bool initial;
+
+    char *name;
+
+    CIRCLEQ_ENTRY(con_state) state;
+    CIRCLEQ_ENTRY(con_state) old_state;
+} con_state;
+
+CIRCLEQ_HEAD(state_head, con_state) state_head =
+    CIRCLEQ_HEAD_INITIALIZER(state_head);
+
+CIRCLEQ_HEAD(old_state_head, con_state) old_state_head =
+    CIRCLEQ_HEAD_INITIALIZER(old_state_head);
+
+/*
+ * Returns the container state for the given frame. This function always
+ * returns a container state (otherwise, there is a bug in the code and the
+ * container state of a container for which x_con_init() was not called was
+ * requested).
+ *
+ */
+static con_state *state_for_frame(xcb_window_t window) {
+    con_state *state;
+    CIRCLEQ_FOREACH(state, &state_head, state)
+        if (state->id == window)
+            return state;
+
+    /* TODO: better error handling? */
+    ELOG("No state found\n");
+    assert(false);
+    return NULL;
+}
+
+/*
+ * Initializes the X11 part for the given container. Called exactly once for
+ * every container from con_new().
+ *
+ */
+void x_con_init(Con *con) {
+    /* TODO: maybe create the window when rendering first? we could then even
+     * get the initial geometry right */
+
+    uint32_t mask = 0;
+    uint32_t values[2];
+
+    /* our own frames should not be managed */
+    mask |= XCB_CW_OVERRIDE_REDIRECT;
+    values[0] = 1;
+
+    /* see include/xcb.h for the FRAME_EVENT_MASK */
+    mask |= XCB_CW_EVENT_MASK;
+    values[1] = FRAME_EVENT_MASK & ~XCB_EVENT_MASK_ENTER_WINDOW;
+
+    Rect dims = { -15, -15, 10, 10 };
+    con->frame = create_window(conn, dims, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCURSOR_CURSOR_POINTER, false, mask, values);
+
+    struct con_state *state = scalloc(sizeof(struct con_state));
+    state->id = con->frame;
+    state->mapped = false;
+    state->initial = true;
+    CIRCLEQ_INSERT_HEAD(&state_head, state, state);
+    CIRCLEQ_INSERT_HEAD(&old_state_head, state, old_state);
+    DLOG("adding new state for window id 0x%08x\n", state->id);
+}
+
+/*
+ * Re-initializes the associated X window state for this container. You have
+ * to call this when you assign a client to an empty container to ensure that
+ * its state gets updated correctly.
+ *
+ */
+void x_reinit(Con *con) {
+    struct con_state *state;
+
+    if ((state = state_for_frame(con->frame)) == NULL) {
+        ELOG("window state not found\n");
+        return;
+    }
+
+    DLOG("resetting state %p to initial\n", state);
+    state->initial = true;
+    state->child_mapped = false;
+    memset(&(state->window_rect), 0, sizeof(Rect));
+}
+
+/*
+ * Reparents the child window of the given container (necessary for sticky
+ * containers). The reparenting happens in the next call of x_push_changes().
+ *
+ */
+void x_reparent_child(Con *con, Con *old) {
+    struct con_state *state;
+    if ((state = state_for_frame(con->frame)) == NULL) {
+        ELOG("window state for con not found\n");
+        return;
+    }
+
+    state->need_reparent = true;
+    state->old_frame = old->frame;
+}
+
+/*
+ * Moves a child window from Container src to Container dest.
+ *
+ */
+void x_move_win(Con *src, Con *dest) {
+    struct con_state *state_src, *state_dest;
+
+    if ((state_src = state_for_frame(src->frame)) == NULL) {
+        ELOG("window state for src not found\n");
+        return;
+    }
+
+    if ((state_dest = state_for_frame(dest->frame)) == NULL) {
+        ELOG("window state for dest not found\n");
+        return;
+    }
+
+    Rect zero = { 0, 0, 0, 0 };
+    if (memcmp(&(state_dest->window_rect), &(zero), sizeof(Rect)) == 0) {
+        memcpy(&(state_dest->window_rect), &(state_src->window_rect), sizeof(Rect));
+        DLOG("COPYING RECT\n");
+    }
+}
+
+/*
+ * Kills the window decoration associated with the given container.
+ *
+ */
+void x_con_kill(Con *con) {
+    con_state *state;
+
+    xcb_destroy_window(conn, con->frame);
+    xcb_free_pixmap(conn, con->pixmap);
+    xcb_free_gc(conn, con->pm_gc);
+    state = state_for_frame(con->frame);
+    CIRCLEQ_REMOVE(&state_head, state, state);
+    CIRCLEQ_REMOVE(&old_state_head, state, old_state);
+    FREE(state->name);
+    free(state);
+
+    /* Invalidate focused_id to correctly focus new windows with the same ID */
+    focused_id = XCB_NONE;
+}
+
+/*
+ * Returns true if the client supports the given protocol atom (like WM_DELETE_WINDOW)
+ *
+ */
+bool window_supports_protocol(xcb_window_t window, xcb_atom_t atom) {
+    xcb_get_property_cookie_t cookie;
+    xcb_icccm_get_wm_protocols_reply_t protocols;
+    bool result = false;
+
+    cookie = xcb_icccm_get_wm_protocols(conn, window, A_WM_PROTOCOLS);
+    if (xcb_icccm_get_wm_protocols_reply(conn, cookie, &protocols, NULL) != 1)
+        return false;
+
+    /* Check if the client’s protocols have the requested atom set */
+    for (uint32_t i = 0; i < protocols.atoms_len; i++)
+        if (protocols.atoms[i] == atom)
+            result = true;
+
+    xcb_icccm_get_wm_protocols_reply_wipe(&protocols);
+
+    return result;
+}
+
+/*
+ * Kills the given X11 window using WM_DELETE_WINDOW (if supported).
+ *
+ */
+void x_window_kill(xcb_window_t window, kill_window_t kill_window) {
+    /* if this window does not support WM_DELETE_WINDOW, we kill it the hard way */
+    if (!window_supports_protocol(window, A_WM_DELETE_WINDOW)) {
+        if (kill_window == KILL_WINDOW) {
+            LOG("Killing specific window 0x%08x\n", window);
+            xcb_destroy_window(conn, window);
+        } else {
+            LOG("Killing the X11 client which owns window 0x%08x\n", window);
+            xcb_kill_client(conn, window);
+        }
+        return;
+    }
+
+    /* Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes.
+     * In order to properly initialize these bytes, we allocate 32 bytes even
+     * though we only need less for an xcb_configure_notify_event_t */
+    void *event = scalloc(32);
+    xcb_client_message_event_t *ev = event;
+
+    ev->response_type = XCB_CLIENT_MESSAGE;
+    ev->window = window;
+    ev->type = A_WM_PROTOCOLS;
+    ev->format = 32;
+    ev->data.data32[0] = A_WM_DELETE_WINDOW;
+    ev->data.data32[1] = XCB_CURRENT_TIME;
+
+    LOG("Sending WM_DELETE to the client\n");
+    xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char*)ev);
+    xcb_flush(conn);
+    free(event);
+}
+
+/*
+ * Draws the decoration of the given container onto its parent.
+ *
+ */
+void x_draw_decoration(Con *con) {
+    Con *parent = con->parent;
+    /* This code needs to run for:
+     *  • leaf containers
+     *  • non-leaf containers which are in a stacked/tabbed container
+     *
+     * It does not need to run for:
+     *  • floating containers (they don’t have a decoration)
+     */
+    if ((!con_is_leaf(con) &&
+         parent->layout != L_STACKED &&
+         parent->layout != L_TABBED) ||
+        con->type == CT_FLOATING_CON)
+        return;
+    DLOG("decoration should be rendered for con %p\n", con);
+
+    /* Skip containers whose height is 0 (for example empty dockareas) */
+    if (con->rect.height == 0) {
+        DLOG("height == 0, not rendering\n");
+        return;
+    }
+
+    /* Skip containers whose pixmap has not yet been created (can happen when
+     * decoration rendering happens recursively for a window for which
+     * x_push_node() was not yet called) */
+    if (con->pixmap == XCB_NONE) {
+        DLOG("pixmap not yet created, not rendering\n");
+        return;
+    }
+
+    /* 1: build deco_params and compare with cache */
+    struct deco_render_params *p = scalloc(sizeof(struct deco_render_params));
+
+    /* find out which colors to use */
+    if (con->urgent)
+        p->color = &config.client.urgent;
+    else if (con == focused)
+        p->color = &config.client.focused;
+    else if (con == TAILQ_FIRST(&(parent->focus_head)))
+        p->color = &config.client.focused_inactive;
+    else
+        p->color = &config.client.unfocused;
+
+    p->border_style = con_border_style(con);
+
+    Rect *r = &(con->rect);
+    Rect *w = &(con->window_rect);
+    p->con_rect = (struct width_height){ r->width, r->height };
+    p->con_window_rect = (struct width_height){ w->width, w->height };
+    p->con_deco_rect = con->deco_rect;
+    p->background = config.client.background;
+    p->con_is_leaf = con_is_leaf(con);
+    p->font = config.font.id;
+
+    if (con->deco_render_params != NULL &&
+        (con->window == NULL || !con->window->name_x_changed) &&
+        !parent->pixmap_recreated &&
+        !con->pixmap_recreated &&
+        memcmp(p, con->deco_render_params, sizeof(struct deco_render_params)) == 0) {
+        DLOG("CACHE HIT, copying existing pixmaps\n");
+        free(p);
+        goto copy_pixmaps;
+    }
+
+    DLOG("CACHE MISS\n");
+    Con *next = con;
+    while ((next = TAILQ_NEXT(next, nodes))) {
+        DLOG("Also invalidating cache of %p\n", next);
+        FREE(next->deco_render_params);
+    }
+
+    FREE(con->deco_render_params);
+    con->deco_render_params = p;
+
+    if (con->window != NULL && con->window->name_x_changed)
+        con->window->name_x_changed = false;
+
+    parent->pixmap_recreated = false;
+    con->pixmap_recreated = false;
+
+    /* 2: draw the client.background, but only for the parts around the client_rect */
+    if (con->window != NULL) {
+        xcb_rectangle_t background[] = {
+            /* top area */
+            { 0, 0, r->width, w->y },
+            /* bottom area */
+            { 0, (w->y + w->height), r->width, r->height - (w->y + w->height) },
+            /* left area */
+            { 0, 0, w->x, r->height },
+            /* right area */
+            { w->x + w->width, 0, r->width - (w->x + w->width), r->height }
+        };
+#if 0
+        for (int i = 0; i < 4; i++)
+            DLOG("rect is (%d, %d) with %d x %d\n",
+                    background[i].x,
+                    background[i].y,
+                    background[i].width,
+                    background[i].height
+                );
+#endif
+
+        xcb_change_gc_single(conn, con->pm_gc, XCB_GC_FOREGROUND, config.client.background);
+        xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, sizeof(background) / sizeof(xcb_rectangle_t), background);
+    }
+
+    /* 3: draw a rectangle in border color around the client */
+    if (p->border_style != BS_NONE && p->con_is_leaf) {
+        Rect br = con_border_style_rect(con);
+#if 0
+        DLOG("con->rect spans %d x %d\n", con->rect.width, con->rect.height);
+        DLOG("border_rect spans (%d, %d) with %d x %d\n", br.x, br.y, br.width, br.height);
+        DLOG("window_rect spans (%d, %d) with %d x %d\n", con->window_rect.x, con->window_rect.y, con->window_rect.width, con->window_rect.height);
+#endif
+
+        /* These rectangles represents the border around the child window
+         * (left, bottom and right part). We don’t just fill the whole
+         * rectangle because some childs are not freely resizable and we want
+         * their background color to "shine through". */
+        xcb_change_gc_single(conn, con->pm_gc, XCB_GC_FOREGROUND, p->color->background);
+        xcb_rectangle_t borders[] = {
+            { 0, 0, br.x, r->height },
+            { 0, r->height + br.height + br.y, r->width, r->height },
+            { r->width + br.width + br.x, 0, r->width, r->height }
+        };
+        xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 3, borders);
+        /* 1pixel border needs an additional line at the top */
+        if (p->border_style == BS_1PIXEL) {
+            xcb_rectangle_t topline = { br.x, 0, con->rect.width + br.width + br.x, br.y };
+            xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, &topline);
+        }
+    }
+
+    /* if this is a borderless/1pixel window, we don’t * need to render the
+     * decoration. */
+    if (p->border_style != BS_NORMAL) {
+        DLOG("border style not BS_NORMAL, aborting rendering of decoration\n");
+        goto copy_pixmaps;
+    }
+
+    /* 4: paint the bar */
+    xcb_change_gc_single(conn, parent->pm_gc, XCB_GC_FOREGROUND, p->color->background);
+    xcb_rectangle_t drect = { con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height };
+    xcb_poly_fill_rectangle(conn, parent->pixmap, parent->pm_gc, 1, &drect);
+
+    /* 5: draw two unconnected lines in border color */
+    xcb_change_gc_single(conn, parent->pm_gc, XCB_GC_FOREGROUND, p->color->border);
+    Rect *dr = &(con->deco_rect);
+    xcb_segment_t segments[] = {
+        { dr->x,             dr->y,
+          dr->x + dr->width, dr->y },
+
+        { dr->x,             dr->y + dr->height - 1,
+          dr->x + dr->width, dr->y + dr->height - 1 }
+    };
+    xcb_poly_segment(conn, parent->pixmap, parent->pm_gc, 2, segments);
+
+    /* 6: draw the title */
+    uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
+    uint32_t values[] = { p->color->text, p->color->background, config.font.id };
+    xcb_change_gc(conn, parent->pm_gc, mask, values);
+    int text_offset_y = config.font.height + (con->deco_rect.height - config.font.height) / 2 - 1;
+
+    struct Window *win = con->window;
+    if (win == NULL || win->name_x == NULL) {
+        /* this is a non-leaf container, we need to make up a good description */
+        // TODO: use a good description instead of just "another container"
+        xcb_image_text_8(
+            conn,
+            strlen("another container"),
+            parent->pixmap,
+            parent->pm_gc,
+            con->deco_rect.x + 2,
+            con->deco_rect.y + text_offset_y,
+            "another container"
+        );
+
+        goto copy_pixmaps;
+    }
+
+    int indent_level = 0,
+        indent_mult = 0;
+    Con *il_parent = parent;
+    if (il_parent->layout != L_STACKED) {
+        while (1) {
+            DLOG("il_parent = %p, layout = %d\n", il_parent, il_parent->layout);
+            if (il_parent->layout == L_STACKED)
+                indent_level++;
+            if (il_parent->type == CT_WORKSPACE || il_parent->type == CT_DOCKAREA || il_parent->type == CT_OUTPUT)
+                break;
+            il_parent = il_parent->parent;
+            indent_mult++;
+        }
+    }
+    DLOG("indent_level = %d, indent_mult = %d\n", indent_level, indent_mult);
+    int indent_px = (indent_level * 5) * indent_mult;
+
+    if (win->uses_net_wm_name)
+        xcb_image_text_16(
+            conn,
+            win->name_len,
+            parent->pixmap,
+            parent->pm_gc,
+            con->deco_rect.x + 2 + indent_px,
+            con->deco_rect.y + text_offset_y,
+            (xcb_char2b_t*)win->name_x
+        );
+    else
+        xcb_image_text_8(
+            conn,
+            win->name_len,
+            parent->pixmap,
+            parent->pm_gc,
+            con->deco_rect.x + 2 + indent_px,
+            con->deco_rect.y + text_offset_y,
+            win->name_x
+        );
+
+copy_pixmaps:
+    xcb_copy_area(conn, con->pixmap, con->frame, con->pm_gc, 0, 0, 0, 0, con->rect.width, con->rect.height);
+}
+
+/*
+ * Recursively calls x_draw_decoration. This cannot be done in x_push_node
+ * because x_push_node uses focus order to recurse (see the comment above)
+ * while drawing the decoration needs to happen in the actual order.
+ *
+ */
+void x_deco_recurse(Con *con) {
+    Con *current;
+    bool leaf = TAILQ_EMPTY(&(con->nodes_head)) &&
+                TAILQ_EMPTY(&(con->floating_head));
+    con_state *state = state_for_frame(con->frame);
+
+    if (!leaf) {
+        TAILQ_FOREACH(current, &(con->nodes_head), nodes)
+            x_deco_recurse(current);
+
+        TAILQ_FOREACH(current, &(con->floating_head), floating_windows)
+            x_deco_recurse(current);
+
+        if (state->mapped)
+            xcb_copy_area(conn, con->pixmap, con->frame, con->pm_gc, 0, 0, 0, 0, con->rect.width, con->rect.height);
+    }
+
+    if ((con->type != CT_ROOT && con->type != CT_OUTPUT) &&
+        con->mapped)
+        x_draw_decoration(con);
+}
+
+/*
+ * This function pushes the properties of each node of the layout tree to
+ * X11 if they have changed (like the map state, position of the window, …).
+ * It recursively traverses all children of the given node.
+ *
+ */
+void x_push_node(Con *con) {
+    Con *current;
+    con_state *state;
+    Rect rect = con->rect;
+
+    //DLOG("Pushing changes for node %p / %s\n", con, con->name);
+    state = state_for_frame(con->frame);
+
+    if (state->name != NULL) {
+        DLOG("pushing name %s for con %p\n", state->name, con);
+
+        xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->frame,
+                            A_WM_NAME, A_STRING, 8, strlen(state->name), state->name);
+        FREE(state->name);
+    }
+
+    if (con->window == NULL) {
+        /* Calculate the height of all window decorations which will be drawn on to
+         * this frame. */
+        uint32_t max_y = 0, max_height = 0;
+        TAILQ_FOREACH(current, &(con->nodes_head), nodes) {
+            Rect *dr = &(current->deco_rect);
+            if (dr->y >= max_y && dr->height >= max_height) {
+                max_y = dr->y;
+                max_height = dr->height;
+            }
+        }
+        rect.height = max_y + max_height;
+        if (rect.height == 0) {
+            DLOG("Unmapping container %p because it does not contain anything.\n", con);
+            con->mapped = false;
+        }
+    }
+
+    /* reparent the child window (when the window was moved due to a sticky
+     * container) */
+    if (state->need_reparent && con->window != NULL) {
+        DLOG("Reparenting child window\n");
+
+        /* Temporarily set the event masks to XCB_NONE so that we won’t get
+         * UnmapNotify events (otherwise the handler would close the container).
+         * These events are generated automatically when reparenting. */
+        uint32_t values[] = { XCB_NONE };
+        xcb_change_window_attributes(conn, state->old_frame, XCB_CW_EVENT_MASK, values);
+        xcb_change_window_attributes(conn, con->window->id, XCB_CW_EVENT_MASK, values);
+
+        xcb_reparent_window(conn, con->window->id, con->frame, 0, 0);
+
+        values[0] = FRAME_EVENT_MASK;
+        xcb_change_window_attributes(conn, state->old_frame, XCB_CW_EVENT_MASK, values);
+        values[0] = CHILD_EVENT_MASK;
+        xcb_change_window_attributes(conn, con->window->id, XCB_CW_EVENT_MASK, values);
+
+        state->old_frame = XCB_NONE;
+        state->need_reparent = false;
+
+        con->ignore_unmap++;
+        DLOG("ignore_unmap for reparenting of con %p (win 0x%08x) is now %d\n",
+                con, con->window->id, con->ignore_unmap);
+    }
+
+    bool fake_notify = false;
+    /* Set new position if rect changed (and if height > 0) */
+    if (memcmp(&(state->rect), &rect, sizeof(Rect)) != 0 &&
+        rect.height > 0) {
+        /* We first create the new pixmap, then render to it, set it as the
+         * background and only afterwards change the window size. This reduces
+         * flickering. */
+
+        /* As the pixmap only depends on the size and not on the position, it
+         * is enough to check if width/height have changed. Also, we don’t
+         * create a pixmap at all when the window is actually not visible
+         * (height == 0). */
+        if ((state->rect.width != rect.width ||
+            state->rect.height != rect.height)) {
+            DLOG("CACHE: creating new pixmap for con %p (old: %d x %d, new: %d x %d)\n",
+                    con, state->rect.width, state->rect.height,
+                    rect.width, rect.height);
+            if (con->pixmap == 0) {
+                con->pixmap = xcb_generate_id(conn);
+                con->pm_gc = xcb_generate_id(conn);
+            } else {
+                xcb_free_pixmap(conn, con->pixmap);
+                xcb_free_gc(conn, con->pm_gc);
+            }
+            xcb_create_pixmap(conn, root_depth, con->pixmap, con->frame, rect.width, rect.height);
+            /* For the graphics context, we disable GraphicsExposure events.
+             * Those will be sent when a CopyArea request cannot be fulfilled
+             * properly due to parts of the source being unmapped or otherwise
+             * unavailable. Since we always copy from pixmaps to windows, this
+             * is not a concern for us. */
+            uint32_t values[] = { 0 };
+            xcb_create_gc(conn, con->pm_gc, con->pixmap, XCB_GC_GRAPHICS_EXPOSURES, values);
+
+            con->pixmap_recreated = true;
+
+            /* Don’t render the decoration for windows inside a stack which are
+             * not visible right now */
+            if (!con->parent ||
+                con->parent->layout != L_STACKED ||
+                TAILQ_FIRST(&(con->parent->focus_head)) == con)
+                /* Render the decoration now to make the correct decoration visible
+                 * from the very first moment. Later calls will be cached, so this
+                 * doesn’t hurt performance. */
+                x_deco_recurse(con);
+        }
+
+        DLOG("setting rect (%d, %d, %d, %d)\n", rect.x, rect.y, rect.width, rect.height);
+        /* flush to ensure that the following commands are sent in a single
+         * buffer and will be processed directly afterwards (the contents of a
+         * window get lost when resizing it, therefore we want to provide it as
+         * fast as possible) */
+        xcb_flush(conn);
+        xcb_set_window_rect(conn, con->frame, rect);
+        if (con->pixmap != XCB_NONE)
+            xcb_copy_area(conn, con->pixmap, con->frame, con->pm_gc, 0, 0, 0, 0, con->rect.width, con->rect.height);
+        xcb_flush(conn);
+
+        memcpy(&(state->rect), &rect, sizeof(Rect));
+        fake_notify = true;
+    }
+
+    /* dito, but for child windows */
+    if (con->window != NULL &&
+        memcmp(&(state->window_rect), &(con->window_rect), sizeof(Rect)) != 0) {
+        DLOG("setting window rect (%d, %d, %d, %d)\n",
+            con->window_rect.x, con->window_rect.y, con->window_rect.width, con->window_rect.height);
+        xcb_set_window_rect(conn, con->window->id, con->window_rect);
+        memcpy(&(state->window_rect), &(con->window_rect), sizeof(Rect));
+        fake_notify = true;
+    }
+
+    /* Map if map state changed, also ensure that the child window
+     * is changed if we are mapped *and* in initial state (meaning the
+     * container was empty before, but now got a child). Unmaps are handled in
+     * x_push_node_unmaps(). */
+    if ((state->mapped != con->mapped || (con->mapped && state->initial)) &&
+        con->mapped) {
+        xcb_void_cookie_t cookie;
+
+        if (con->window != NULL) {
+            /* Set WM_STATE_NORMAL because GTK applications don’t want to
+             * drag & drop if we don’t. Also, xprop(1) needs it. */
+            long data[] = { XCB_ICCCM_WM_STATE_NORMAL, XCB_NONE };
+            xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->window->id,
+                                A_WM_STATE, A_WM_STATE, 32, 2, data);
+        }
+
+        uint32_t values[1];
+        if (!state->child_mapped && con->window != NULL) {
+            cookie = xcb_map_window(conn, con->window->id);
+
+            /* We are interested in EnterNotifys as soon as the window is
+             * mapped */
+            values[0] = CHILD_EVENT_MASK;
+            xcb_change_window_attributes(conn, con->window->id, XCB_CW_EVENT_MASK, values);
+            DLOG("mapping child window (serial %d)\n", cookie.sequence);
+            state->child_mapped = true;
+        }
+
+        cookie = xcb_map_window(conn, con->frame);
+
+        values[0] = FRAME_EVENT_MASK;
+        xcb_change_window_attributes(conn, con->frame, XCB_CW_EVENT_MASK, values);
+
+        /* copy the pixmap contents to the frame window immediately after mapping */
+        if (con->pixmap != XCB_NONE)
+            xcb_copy_area(conn, con->pixmap, con->frame, con->pm_gc, 0, 0, 0, 0, con->rect.width, con->rect.height);
+        xcb_flush(conn);
+
+        DLOG("mapping container %08x (serial %d)\n", con->frame, cookie.sequence);
+        state->mapped = con->mapped;
+    }
+
+    state->unmap_now = (state->mapped != con->mapped) && !con->mapped;
+
+    if (fake_notify) {
+        DLOG("Sending fake configure notify\n");
+        fake_absolute_configure_notify(con);
+    }
+
+    /* Handle all children and floating windows of this node. We recurse
+     * in focus order to display the focused client in a stack first when
+     * switching workspaces (reduces flickering). */
+    TAILQ_FOREACH(current, &(con->focus_head), focused)
+        x_push_node(current);
+}
+
+/*
+ * Same idea as in x_push_node(), but this function only unmaps windows. It is
+ * necessary to split this up to handle new fullscreen clients properly: The
+ * new window needs to be mapped and focus needs to be set *before* the
+ * underlying windows are unmapped. Otherwise, focus will revert to the
+ * PointerRoot and will then be set to the new window, generating unnecessary
+ * FocusIn/FocusOut events.
+ *
+ */
+static void x_push_node_unmaps(Con *con) {
+    Con *current;
+    con_state *state;
+
+    //DLOG("Pushing changes (with unmaps) for node %p / %s\n", con, con->name);
+    state = state_for_frame(con->frame);
+
+    /* map/unmap if map state changed, also ensure that the child window
+     * is changed if we are mapped *and* in initial state (meaning the
+     * container was empty before, but now got a child) */
+    if (state->unmap_now) {
+        xcb_void_cookie_t cookie;
+        if (con->window != NULL) {
+            /* Set WM_STATE_WITHDRAWN, it seems like Java apps need it */
+            long data[] = { XCB_ICCCM_WM_STATE_WITHDRAWN, XCB_NONE };
+            xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->window->id,
+                                A_WM_STATE, A_WM_STATE, 32, 2, data);
+        }
+
+        cookie = xcb_unmap_window(conn, con->frame);
+        DLOG("unmapping container (serial %d)\n", cookie.sequence);
+        /* we need to increase ignore_unmap for this container (if it
+         * contains a window) and for every window "under" this one which
+         * contains a window */
+        if (con->window != NULL) {
+            con->ignore_unmap++;
+            DLOG("ignore_unmap for con %p (frame 0x%08x) now %d\n", con, con->frame, con->ignore_unmap);
+        }
+        state->mapped = con->mapped;
+    }
+
+    /* handle all children and floating windows of this node */
+    TAILQ_FOREACH(current, &(con->nodes_head), nodes)
+        x_push_node_unmaps(current);
+
+    TAILQ_FOREACH(current, &(con->floating_head), floating_windows)
+        x_push_node_unmaps(current);
+}
+
+/*
+ * Pushes all changes (state of each node, see x_push_node() and the window
+ * stack) to X11.
+ *
+ * NOTE: We need to push the stack first so that the windows have the correct
+ * stacking order. This is relevant for workspace switching where we map the
+ * windows because mapping may generate EnterNotify events. When they are
+ * generated in the wrong order, this will cause focus problems when switching
+ * workspaces.
+ *
+ */
+void x_push_changes(Con *con) {
+    con_state *state;
+
+    DLOG("-- PUSHING WINDOW STACK --\n");
+    //DLOG("Disabling EnterNotify\n");
+    uint32_t values[1] = { XCB_NONE };
+    CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {
+        if (state->mapped)
+            xcb_change_window_attributes(conn, state->id, XCB_CW_EVENT_MASK, values);
+    }
+    //DLOG("Done, EnterNotify disabled\n");
+    bool order_changed = false;
+    /* X11 correctly represents the stack if we push it from bottom to top */
+    CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {
+        //DLOG("stack: 0x%08x\n", state->id);
+        con_state *prev = CIRCLEQ_PREV(state, state);
+        con_state *old_prev = CIRCLEQ_PREV(state, old_state);
+        if (prev != old_prev)
+            order_changed = true;
+        if ((state->initial || order_changed) && prev != CIRCLEQ_END(&state_head)) {
+            DLOG("Stacking 0x%08x above 0x%08x\n", prev->id, state->id);
+            uint32_t mask = 0;
+            mask |= XCB_CONFIG_WINDOW_SIBLING;
+            mask |= XCB_CONFIG_WINDOW_STACK_MODE;
+            uint32_t values[] = {state->id, XCB_STACK_MODE_ABOVE};
+
+            xcb_configure_window(conn, prev->id, mask, values);
+        }
+        state->initial = false;
+    }
+    //DLOG("Re-enabling EnterNotify\n");
+    values[0] = FRAME_EVENT_MASK;
+    CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {
+        if (state->mapped)
+            xcb_change_window_attributes(conn, state->id, XCB_CW_EVENT_MASK, values);
+    }
+    //DLOG("Done, EnterNotify re-enabled\n");
+
+    DLOG("\n\n PUSHING CHANGES\n\n");
+    x_push_node(con);
+    x_deco_recurse(con);
+
+    xcb_window_t to_focus = focused->frame;
+    if (focused->window != NULL)
+        to_focus = focused->window->id;
+
+    DLOG("focused_id = 0x%08x, to_focus = 0x%08x\n", focused_id, to_focus);
+    if (focused_id != to_focus) {
+        if (!focused->mapped) {
+            DLOG("Not updating focus (to %p / %s), focused window is not mapped.\n", focused, focused->name);
+            /* Invalidate focused_id to correctly focus new windows with the same ID */
+            focused_id = XCB_NONE;
+        } else {
+            DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name);
+            /* We remove XCB_EVENT_MASK_FOCUS_CHANGE from the event mask to get
+             * no focus change events for our own focus changes. We only want
+             * these generated by the clients. */
+            if (focused->window != NULL) {
+                values[0] = CHILD_EVENT_MASK & ~(XCB_EVENT_MASK_FOCUS_CHANGE);
+                xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values);
+            }
+            xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME);
+            if (focused->window != NULL) {
+                values[0] = CHILD_EVENT_MASK;
+                xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values);
+            }
+
+            if (focused->window != NULL &&
+                focused->window->needs_take_focus) {
+                send_take_focus(to_focus);
+            }
+
+            ewmh_update_active_window(to_focus);
+            focused_id = to_focus;
+        }
+    }
+
+    if (focused_id == XCB_NONE) {
+        DLOG("Still no window focused, better set focus to the root window\n");
+        xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, root, XCB_CURRENT_TIME);
+        focused_id = root;
+    }
+
+    xcb_flush(conn);
+    DLOG("\n\n ENDING CHANGES\n\n");
+
+    /* Disable EnterWindow events for windows which will be unmapped in
+     * x_push_node_unmaps() now. Unmapping windows happens when switching
+     * workspaces. We want to avoid getting EnterNotifies during that phase
+     * because they would screw up our focus. One of these cases is having a
+     * stack with two windows. If the first window is focused and gets
+     * unmapped, the second one appears under the cursor and therefore gets an
+     * EnterNotify event. */
+    values[0] = FRAME_EVENT_MASK & ~XCB_EVENT_MASK_ENTER_WINDOW;
+    CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {
+        if (!state->unmap_now)
+            continue;
+        xcb_change_window_attributes(conn, state->id, XCB_CW_EVENT_MASK, values);
+    }
+
+    /* Push all pending unmaps */
+    x_push_node_unmaps(con);
+
+    /* save the current stack as old stack */
+    CIRCLEQ_FOREACH(state, &state_head, state) {
+        CIRCLEQ_REMOVE(&old_state_head, state, old_state);
+        CIRCLEQ_INSERT_TAIL(&old_state_head, state, old_state);
+    }
+    //CIRCLEQ_FOREACH(state, &old_state_head, old_state) {
+    //    DLOG("old stack: 0x%08x\n", state->id);
+    //}
+
+    xcb_flush(conn);
+}
+
+/*
+ * Raises the specified container in the internal stack of X windows. The
+ * next call to x_push_changes() will make the change visible in X11.
+ *
+ */
+void x_raise_con(Con *con) {
+    con_state *state;
+    state = state_for_frame(con->frame);
+    //DLOG("raising in new stack: %p / %s / %s / xid %08x\n", con, con->name, con->window ? con->window->name_json : "", state->id);
+
+    CIRCLEQ_REMOVE(&state_head, state, state);
+    CIRCLEQ_INSERT_HEAD(&state_head, state, state);
+}
+
+/*
+ * Sets the WM_NAME property (so, no UTF8, but used only for debugging anyways)
+ * of the given name. Used for properly tagging the windows for easily spotting
+ * i3 windows in xwininfo -root -all.
+ *
+ */
+void x_set_name(Con *con, const char *name) {
+    struct con_state *state;
+
+    if ((state = state_for_frame(con->frame)) == NULL) {
+        ELOG("window state not found\n");
+        return;
+    }
+
+    FREE(state->name);
+    state->name = sstrdup(name);
+}
+
+/*
+ * Sets up i3 specific atoms (I3_SOCKET_PATH and I3_CONFIG_PATH)
+ *
+ */
+void x_set_i3_atoms() {
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A_I3_SOCKET_PATH, A_UTF8_STRING, 8,
+                        (current_socketpath == NULL ? 0 : strlen(current_socketpath)),
+                        current_socketpath);
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A_I3_CONFIG_PATH, A_UTF8_STRING, 8,
+                        strlen(current_configpath), current_configpath);
+}
diff --git a/src/xcb.c b/src/xcb.c
new file mode 100644 (file)
index 0000000..2c19401
--- /dev/null
+++ b/src/xcb.c
@@ -0,0 +1,363 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2010 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * xcb.c: Helper functions for easier usage of XCB
+ *
+ */
+
+#include "all.h"
+
+TAILQ_HEAD(cached_fonts_head, Font) cached_fonts = TAILQ_HEAD_INITIALIZER(cached_fonts);
+unsigned int xcb_numlock_mask;
+
+/*
+ * Loads a font for usage, also getting its height. If fallback is true,
+ * i3 loads 'fixed' or '-misc-*' if the font cannot be found instead of
+ * exiting.
+ *
+ */
+i3Font load_font(const char *pattern, bool fallback) {
+    i3Font new;
+    xcb_void_cookie_t font_cookie;
+    xcb_list_fonts_with_info_cookie_t info_cookie;
+
+    /* Send all our requests first */
+    new.id = xcb_generate_id(conn);
+    font_cookie = xcb_open_font_checked(conn, new.id, strlen(pattern), pattern);
+    info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
+
+    /* Check for errors. If errors, fall back to default font. */
+    xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
+
+    /* If we fail to open font, fall back to 'fixed'. If opening 'fixed' fails fall back to '-misc-*' */
+    if (error != NULL) {
+        ELOG("Could not open font %s (X error %d). Reverting to backup font.\n", pattern, error->error_code);
+        pattern = "fixed";
+        font_cookie = xcb_open_font_checked(conn, new.id, strlen(pattern), pattern);
+        info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
+
+        /* Check if we managed to open 'fixed' */
+        xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
+
+        /* Fall back to '-misc-*' if opening 'fixed' fails. */
+        if (error != NULL) {
+            ELOG("Could not open fallback font '%s', trying with '-misc-*'\n",pattern);
+            pattern = "-misc-*";
+            font_cookie = xcb_open_font_checked(conn, new.id, strlen(pattern), pattern);
+            info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
+
+            check_error(conn, font_cookie, "Could open neither requested font nor fallback (fixed or -misc-*");
+        }
+    }
+
+    /* Get information (height/name) for this font */
+    xcb_list_fonts_with_info_reply_t *reply = xcb_list_fonts_with_info_reply(conn, info_cookie, NULL);
+    exit_if_null(reply, "Could not load font \"%s\"\n", pattern);
+
+    new.height = reply->font_ascent + reply->font_descent;
+
+    free(reply);
+
+    return new;
+}
+
+/*
+ * Returns the colorpixel to use for the given hex color (think of HTML).
+ *
+ * The hex_color has to start with #, for example #FF00FF.
+ *
+ * NOTE that get_colorpixel() does _NOT_ check the given color code for validity.
+ * This has to be done by the caller.
+ *
+ */
+uint32_t get_colorpixel(char *hex) {
+    char strgroups[3][3] = {{hex[1], hex[2], '\0'},
+                            {hex[3], hex[4], '\0'},
+                            {hex[5], hex[6], '\0'}};
+    uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)),
+                         (strtol(strgroups[1], NULL, 16)),
+                         (strtol(strgroups[2], NULL, 16))};
+
+    return (rgb16[0] << 16) + (rgb16[1] << 8) + rgb16[2];
+}
+
+/*
+ * Convenience wrapper around xcb_create_window which takes care of depth, generating an ID and checking
+ * for errors.
+ *
+ */
+xcb_window_t create_window(xcb_connection_t *conn, Rect dims, uint16_t window_class,
+        enum xcursor_cursor_t cursor, bool map, uint32_t mask, uint32_t *values) {
+    xcb_window_t result = xcb_generate_id(conn);
+
+    /* If the window class is XCB_WINDOW_CLASS_INPUT_ONLY, depth has to be 0 */
+    uint16_t depth = (window_class == XCB_WINDOW_CLASS_INPUT_ONLY ? 0 : XCB_COPY_FROM_PARENT);
+
+    xcb_create_window(conn,
+            depth,
+            result, /* the window id */
+            root, /* parent == root */
+            dims.x, dims.y, dims.width, dims.height, /* dimensions */
+            0, /* border = 0, we draw our own */
+            window_class,
+            XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
+            mask,
+            values);
+
+    /* Set the cursor */
+    if (xcursor_supported) {
+        mask = XCB_CW_CURSOR;
+        values[0] = xcursor_get_cursor(cursor);
+        xcb_change_window_attributes(conn, result, mask, values);
+    } else {
+        xcb_cursor_t cursor_id = xcb_generate_id(conn);
+        i3Font cursor_font = load_font("cursor", false);
+        int xcb_cursor = xcursor_get_xcb_cursor(cursor);
+        xcb_create_glyph_cursor(conn, cursor_id, cursor_font.id, cursor_font.id,
+                xcb_cursor, xcb_cursor + 1, 0, 0, 0, 65535, 65535, 65535);
+        xcb_change_window_attributes(conn, result, XCB_CW_CURSOR, &cursor_id);
+        xcb_free_cursor(conn, cursor_id);
+    }
+
+    /* Map the window (= make it visible) */
+    if (map)
+        xcb_map_window(conn, result);
+
+    return result;
+}
+
+/*
+ * Changes a single value in the graphic context (so one doesn’t have to define an array of values)
+ *
+ */
+void xcb_change_gc_single(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t mask, uint32_t value) {
+    xcb_change_gc(conn, gc, mask, &value);
+}
+
+/*
+ * Draws a line from x,y to to_x,to_y using the given color
+ *
+ */
+void xcb_draw_line(xcb_connection_t *conn, xcb_drawable_t drawable, xcb_gcontext_t gc,
+                   uint32_t colorpixel, uint32_t x, uint32_t y, uint32_t to_x, uint32_t to_y) {
+    xcb_change_gc_single(conn, gc, XCB_GC_FOREGROUND, colorpixel);
+    xcb_point_t points[] = {{x, y}, {to_x, to_y}};
+    xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, drawable, gc, 2, points);
+}
+
+/*
+ * Draws a rectangle from x,y with width,height using the given color
+ *
+ */
+void xcb_draw_rect(xcb_connection_t *conn, xcb_drawable_t drawable, xcb_gcontext_t gc,
+                   uint32_t colorpixel, uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
+    xcb_change_gc_single(conn, gc, XCB_GC_FOREGROUND, colorpixel);
+    xcb_rectangle_t rect = {x, y, width, height};
+    xcb_poly_fill_rectangle(conn, drawable, gc, 1, &rect);
+}
+
+/*
+ * Generates a configure_notify event and sends it to the given window
+ * Applications need this to think they’ve configured themselves correctly.
+ * The truth is, however, that we will manage them.
+ *
+ */
+void fake_configure_notify(xcb_connection_t *conn, Rect r, xcb_window_t window) {
+    /* Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes.
+     * In order to properly initialize these bytes, we allocate 32 bytes even
+     * though we only need less for an xcb_configure_notify_event_t */
+    void *event = scalloc(32);
+    xcb_configure_notify_event_t *generated_event = event;
+
+    generated_event->event = window;
+    generated_event->window = window;
+    generated_event->response_type = XCB_CONFIGURE_NOTIFY;
+
+    generated_event->x = r.x;
+    generated_event->y = r.y;
+    generated_event->width = r.width;
+    generated_event->height = r.height;
+
+    generated_event->border_width = 0;
+    generated_event->above_sibling = XCB_NONE;
+    generated_event->override_redirect = false;
+
+    xcb_send_event(conn, false, window, XCB_EVENT_MASK_STRUCTURE_NOTIFY, (char*)generated_event);
+    xcb_flush(conn);
+
+    free(event);
+}
+
+/*
+ * Generates a configure_notify_event with absolute coordinates (relative to the X root
+ * window, not to the client’s frame) for the given client.
+ *
+ */
+void fake_absolute_configure_notify(Con *con) {
+    Rect absolute;
+    if (con->window == NULL)
+        return;
+
+    absolute.x = con->rect.x + con->window_rect.x;
+    absolute.y = con->rect.y + con->window_rect.y;
+    absolute.width = con->window_rect.width;
+    absolute.height = con->window_rect.height;
+
+    DLOG("fake rect = (%d, %d, %d, %d)\n", absolute.x, absolute.y, absolute.width, absolute.height);
+
+    fake_configure_notify(conn, absolute, con->window->id);
+}
+
+/*
+ * Sends the WM_TAKE_FOCUS ClientMessage to the given window
+ *
+ */
+void send_take_focus(xcb_window_t window) {
+    /* Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes.
+     * In order to properly initialize these bytes, we allocate 32 bytes even
+     * though we only need less for an xcb_configure_notify_event_t */
+    void *event = scalloc(32);
+    xcb_client_message_event_t *ev = event;
+
+    ev->response_type = XCB_CLIENT_MESSAGE;
+    ev->window = window;
+    ev->type = A_WM_PROTOCOLS;
+    ev->format = 32;
+    ev->data.data32[0] = A_WM_TAKE_FOCUS;
+    ev->data.data32[1] = XCB_CURRENT_TIME;
+
+    DLOG("Sending WM_TAKE_FOCUS to the client\n");
+    xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char*)ev);
+    free(event);
+}
+
+/*
+ * Finds out which modifier mask is the one for numlock, as the user may change this.
+ *
+ */
+void xcb_get_numlock_mask(xcb_connection_t *conn) {
+    xcb_key_symbols_t *keysyms;
+    xcb_get_modifier_mapping_cookie_t cookie;
+    xcb_get_modifier_mapping_reply_t *reply;
+    xcb_keycode_t *modmap;
+    int mask, i;
+    const int masks[8] = { XCB_MOD_MASK_SHIFT,
+                           XCB_MOD_MASK_LOCK,
+                           XCB_MOD_MASK_CONTROL,
+                           XCB_MOD_MASK_1,
+                           XCB_MOD_MASK_2,
+                           XCB_MOD_MASK_3,
+                           XCB_MOD_MASK_4,
+                           XCB_MOD_MASK_5 };
+
+    /* Request the modifier map */
+    cookie = xcb_get_modifier_mapping(conn);
+
+    /* Get the keysymbols */
+    keysyms = xcb_key_symbols_alloc(conn);
+
+    if ((reply = xcb_get_modifier_mapping_reply(conn, cookie, NULL)) == NULL) {
+        xcb_key_symbols_free(keysyms);
+        return;
+    }
+
+    modmap = xcb_get_modifier_mapping_keycodes(reply);
+
+    /* Get the keycode for numlock */
+#ifdef OLD_XCB_KEYSYMS_API
+    xcb_keycode_t numlock = xcb_key_symbols_get_keycode(keysyms, XCB_NUM_LOCK);
+#else
+    /* For now, we only use the first keysymbol. */
+    xcb_keycode_t *numlock_syms = xcb_key_symbols_get_keycode(keysyms, XCB_NUM_LOCK);
+    if (numlock_syms == NULL)
+        return;
+    xcb_keycode_t numlock = *numlock_syms;
+    free(numlock_syms);
+#endif
+
+    /* Check all modifiers (Mod1-Mod5, Shift, Control, Lock) */
+    for (mask = 0; mask < 8; mask++)
+        for (i = 0; i < reply->keycodes_per_modifier; i++)
+            if (modmap[(mask * reply->keycodes_per_modifier) + i] == numlock)
+                xcb_numlock_mask = masks[mask];
+
+    xcb_key_symbols_free(keysyms);
+    free(reply);
+}
+
+/*
+ * Raises the given window (typically client->frame) above all other windows
+ *
+ */
+void xcb_raise_window(xcb_connection_t *conn, xcb_window_t window) {
+    uint32_t values[] = { XCB_STACK_MODE_ABOVE };
+    xcb_configure_window(conn, window, XCB_CONFIG_WINDOW_STACK_MODE, values);
+}
+
+/*
+ * Query the width of the given text (16-bit characters, UCS) with given real
+ * length (amount of glyphs) using the given font.
+ *
+ */
+int predict_text_width(char *text, int length) {
+    xcb_query_text_extents_cookie_t cookie;
+    xcb_query_text_extents_reply_t *reply;
+    xcb_generic_error_t *error;
+    int width;
+
+    cookie = xcb_query_text_extents(conn, config.font.id, length, (xcb_char2b_t*)text);
+    if ((reply = xcb_query_text_extents_reply(conn, cookie, &error)) == NULL) {
+        ELOG("Could not get text extents (X error code %d)\n",
+             error->error_code);
+        /* We return the rather safe guess of 7 pixels, because a
+         * rendering error is better than a crash. Plus, the user will
+         * see the error in his log. */
+        return 7;
+    }
+
+    width = reply->overall_width;
+    free(reply);
+    return width;
+}
+
+/*
+ * Configures the given window to have the size/position specified by given rect
+ *
+ */
+void xcb_set_window_rect(xcb_connection_t *conn, xcb_window_t window, Rect r) {
+    xcb_void_cookie_t cookie;
+    cookie = xcb_configure_window(conn, window,
+                         XCB_CONFIG_WINDOW_X |
+                         XCB_CONFIG_WINDOW_Y |
+                         XCB_CONFIG_WINDOW_WIDTH |
+                         XCB_CONFIG_WINDOW_HEIGHT,
+                         &(r.x));
+    /* ignore events which are generated because we configured a window */
+    add_ignore_event(cookie.sequence, -1);
+}
+
+/*
+ * Returns true if the given reply contains the given atom.
+ *
+ */
+bool xcb_reply_contains_atom(xcb_get_property_reply_t *prop, xcb_atom_t atom) {
+    if (prop == NULL || xcb_get_property_value_length(prop) == 0)
+        return false;
+
+    xcb_atom_t *atoms;
+    if ((atoms = xcb_get_property_value(prop)) == NULL)
+        return false;
+
+    for (int i = 0; i < xcb_get_property_value_length(prop) / (prop->format / 8); i++)
+        if (atoms[i] == atom)
+            return true;
+
+    return false;
+
+}
diff --git a/src/xcursor.c b/src/xcursor.c
new file mode 100644 (file)
index 0000000..69518c3
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+#include <assert.h>
+#include <X11/Xcursor/Xcursor.h>
+#include <X11/cursorfont.h>
+
+#include "i3.h"
+#include "xcb.h"
+#include "xcursor.h"
+
+static Cursor cursors[XCURSOR_CURSOR_MAX];
+
+static const int xcb_cursors[XCURSOR_CURSOR_MAX] = {
+    XCB_CURSOR_LEFT_PTR,
+    XCB_CURSOR_SB_H_DOUBLE_ARROW,
+    XCB_CURSOR_SB_V_DOUBLE_ARROW
+};
+
+static Cursor load_cursor(const char *name) {
+    Cursor c = XcursorLibraryLoadCursor(xlibdpy, name);
+    if (c == None)
+        xcursor_supported = false;
+    return c;
+}
+
+void xcursor_load_cursors() {
+    cursors[XCURSOR_CURSOR_POINTER] = load_cursor("left_ptr");
+    cursors[XCURSOR_CURSOR_RESIZE_HORIZONTAL] = load_cursor("sb_h_double_arrow");
+    cursors[XCURSOR_CURSOR_RESIZE_VERTICAL] = load_cursor("sb_v_double_arrow");
+}
+
+/*
+ * Sets the cursor of the root window to the 'pointer' cursor.
+ *
+ * This function is called when i3 is initialized, because with some login
+ * managers, the root window will not have a cursor otherwise.
+ *
+ * We have a separate xcursor function to use the same X11 connection as the
+ * xcursor_load_cursors() function. If we mix the Xlib and the XCB connection,
+ * races might occur (even though we flush the Xlib connection).
+ *
+ */
+void xcursor_set_root_cursor() {
+    XSetWindowAttributes attributes;
+    attributes.cursor = xcursor_get_cursor(XCURSOR_CURSOR_POINTER);
+    XChangeWindowAttributes(xlibdpy, DefaultRootWindow(xlibdpy), CWCursor, &attributes);
+    XFlush(xlibdpy);
+}
+
+Cursor xcursor_get_cursor(enum xcursor_cursor_t c) {
+    assert(c >= 0 && c < XCURSOR_CURSOR_MAX);
+    return cursors[c];
+}
+
+int xcursor_get_xcb_cursor(enum xcursor_cursor_t c) {
+    assert(c >= 0 && c < XCURSOR_CURSOR_MAX);
+    return xcb_cursors[c];
+}
diff --git a/src/xinerama.c b/src/xinerama.c
new file mode 100644 (file)
index 0000000..c116dea
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009-2011 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * This is LEGACY code (we support RandR, which can do much more than
+ * Xinerama), but necessary for the poor users of the nVidia binary
+ * driver which does not support RandR in 2010 *sigh*.
+ *
+ */
+
+#include <xcb/xinerama.h>
+
+#include "all.h"
+
+static int num_screens;
+
+/*
+ * Looks in outputs for the Output whose start coordinates are x, y
+ *
+ */
+static Output *get_screen_at(int x, int y) {
+    Output *output;
+    TAILQ_FOREACH(output, &outputs, outputs)
+        if (output->rect.x == x && output->rect.y == y)
+            return output;
+
+    return NULL;
+}
+
+/*
+ * Gets the Xinerama screens and converts them to virtual Outputs (only one screen for two
+ * Xinerama screen which are configured in clone mode) in the given screenlist
+ *
+ */
+static void query_screens(xcb_connection_t *conn) {
+    xcb_xinerama_query_screens_reply_t *reply;
+    xcb_xinerama_screen_info_t *screen_info;
+
+    reply = xcb_xinerama_query_screens_reply(conn, xcb_xinerama_query_screens_unchecked(conn), NULL);
+    if (!reply) {
+        ELOG("Couldn't get Xinerama screens\n");
+        return;
+    }
+    screen_info = xcb_xinerama_query_screens_screen_info(reply);
+    int screens = xcb_xinerama_query_screens_screen_info_length(reply);
+
+    for (int screen = 0; screen < screens; screen++) {
+        Output *s = get_screen_at(screen_info[screen].x_org, screen_info[screen].y_org);
+        if (s != NULL) {
+            DLOG("Re-used old Xinerama screen %p\n", s);
+            /* This screen already exists. We use the littlest screen so that the user
+               can always see the complete workspace */
+            s->rect.width = min(s->rect.width, screen_info[screen].width);
+            s->rect.height = min(s->rect.height, screen_info[screen].height);
+        } else {
+            s = scalloc(sizeof(Output));
+            asprintf(&(s->name), "xinerama-%d", num_screens);
+            DLOG("Created new Xinerama screen %s (%p)\n", s->name, s);
+            s->active = true;
+            s->rect.x = screen_info[screen].x_org;
+            s->rect.y = screen_info[screen].y_org;
+            s->rect.width = screen_info[screen].width;
+            s->rect.height = screen_info[screen].height;
+            /* We always treat the screen at 0x0 as the primary screen */
+            if (s->rect.x == 0 && s->rect.y == 0)
+                    TAILQ_INSERT_HEAD(&outputs, s, outputs);
+            else TAILQ_INSERT_TAIL(&outputs, s, outputs);
+            output_init_con(s);
+            init_ws_for_output(s, output_get_content(s->con));
+            num_screens++;
+        }
+
+        DLOG("found Xinerama screen: %d x %d at %d x %d\n",
+                        screen_info[screen].width, screen_info[screen].height,
+                        screen_info[screen].x_org, screen_info[screen].y_org);
+    }
+
+    free(reply);
+
+    if (num_screens == 0) {
+        ELOG("No screens found. Please fix your setup. i3 will exit now.\n");
+        exit(0);
+    }
+}
+
+/*
+ * We have just established a connection to the X server and need the initial Xinerama
+ * information to setup workspaces for each screen.
+ *
+ */
+void xinerama_init() {
+    if (!xcb_get_extension_data(conn, &xcb_xinerama_id)->present) {
+        DLOG("Xinerama extension not found, disabling.\n");
+        disable_randr(conn);
+    } else {
+        xcb_xinerama_is_active_reply_t *reply;
+        reply = xcb_xinerama_is_active_reply(conn, xcb_xinerama_is_active(conn), NULL);
+
+        if (reply == NULL || !reply->state) {
+            DLOG("Xinerama is not active (in your X-Server), disabling.\n");
+            disable_randr(conn);
+        } else
+            query_screens(conn);
+
+        FREE(reply);
+    }
+
+#if 0
+    Output *output;
+    Workspace *ws;
+    /* Just go through each active output and associate one workspace */
+    TAILQ_FOREACH(output, &outputs, outputs) {
+        ws = get_first_workspace_for_output(output);
+        initialize_output(conn, output, ws);
+    }
+#endif
+}
diff --git a/testcases/Makefile b/testcases/Makefile
new file mode 100644 (file)
index 0000000..edf5ee0
--- /dev/null
@@ -0,0 +1,10 @@
+test:
+       PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(1)" -It/lib t/12*.t
+
+clean:
+       rm -rf testsuite-* latest
+
+all: test
+
+testfull:
+       PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(1)" -It/lib t/01* t/02* t/03* t/05* t/17* t/18* t/19* t/20*
diff --git a/testcases/Xdummy b/testcases/Xdummy
new file mode 100755 (executable)
index 0000000..638a7b3
--- /dev/null
@@ -0,0 +1,1930 @@
+#!/bin/sh
+# ----------------------------------------------------------------------
+#    Copyright (C) 2005-2010 Karl J. Runge <runge@karlrunge.com> 
+#    All rights reserved.
+# 
+# This file is part of Xdummy.
+# 
+# Xdummy is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or (at
+# your option) any later version.
+# 
+# Xdummy is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with Xdummy; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
+# or see <http://www.gnu.org/licenses/>.
+# ----------------------------------------------------------------------
+# 
+# 
+# Xdummy: an LD_PRELOAD hack to run a stock Xorg(1) or XFree86(1) server
+# with the "dummy" video driver to make it avoid Linux VT switching, etc.
+#
+# Run "Xdummy -help" for more info.
+#
+install=""
+uninstall=""
+runit=1
+prconf=""
+notweak=""
+root=""
+nosudo=""
+xserver=""
+geom=""
+nomodelines=""
+depth=""
+debug=""
+strace=""
+cmdline_config=""
+
+PATH=$PATH:/bin:/usr/bin
+export PATH
+
+program=`basename "$0"`
+
+help () {
+       ${PAGER:-more} << END
+$program:
+
+    A hack to run a stock Xorg(1) or XFree86(1) X server with the "dummy"
+    (RAM-only framebuffer) video driver such that it AVOIDS the Linux VT
+    switching, opening device files in /dev, keyboard and mouse conflicts,
+    and other problems associated with the normal use of "dummy".
+
+    In other words, it tries to make Xorg/XFree86 with the "dummy"
+    device driver act more like Xvfb(1).
+
+    The primary motivation for the Xdummy script is to provide a virtual X
+    server for x11vnc but with more features than Xvfb (or Xvnc); however
+    it could be used for other reasons (e.g. better automated testing
+    than with Xvfb.)  One nice thing is the dummy server supports RANDR
+    dynamic resizing while Xvfb does not.
+
+    So, for example, x11vnc+Xdummy terminal services are a little better
+    than x11vnc+Xvfb.
+
+    To achieve this, while running the real Xserver $program intercepts
+    system and library calls via the LD_PRELOAD method and modifies
+    the behavior to make it work correctly (e.g. avoid the VT stuff.)
+    LD_PRELOAD tricks are usually "clever hacks" and so might not work
+    in all situations or break when something changes.
+
+    WARNING: Take care in using Xdummy, although it never has it is
+    possible that it could damage hardware.  One can use the -prconf
+    option to have it print out the xorg.conf config that it would use
+    and then inspect it carefully before actually using it.
+
+    This program no longer needs to be run as root as of 12/2009.
+    However, if there are problems for certain situations (usually older
+    servers) it may perform better if run as root (use the -root option.)
+    When running as root remember the previous paragraph and that Xdummy
+    comes without any warranty.
+
+    gcc/cc and other build tools are required for this script to be able
+    to compile the LD_PRELOAD shared object.  Be sure they are installed
+    on the system.  See -install and -uninstall described below.
+
+    Your Linux distribution may not install the dummy driver by default,
+    e.g:
+
+        /usr/lib/xorg/modules/drivers/dummy_drv.so
+    
+    some have it in a package named xserver-xorg-video-dummy you that
+    need to install.
+
+Usage:
+
+       $program <${program}-args> <Xserver-args>
+
+       (actually, the arguments can be supplied in any order.)
+
+Examples:
+
+       $program -install
+
+       $program :1
+
+       $program -debug :1
+
+       $program -tmpdir ~/mytmp :1 -nolisten tcp
+
+startx example:
+
+       startx -e bash -- $program :2 -depth 16
+
+       (if startx needs to be run as root, you can su(1) to a normal
+       user in the bash shell and then launch ~/.xinitrc or ~/.xsession,
+       gnome-session, startkde, startxfce4, etc.)
+
+xdm example:
+
+       xdm -config /usr/local/dummy/xdm-config -nodaemon
+
+       where the xdm-config file has line:
+
+            DisplayManager.servers:         /usr/local/dummy/Xservers
+
+       and /usr/local/dummy/Xservers has lines:
+
+            :1 local /usr/local/dummy/Xdummy :1 -debug
+            :2 local /usr/local/dummy/Xdummy :2 -debug
+
+        (-debug is optional)
+
+gdm/kdm example:
+
+       TBD.
+
+Root permission and x11vnc:
+
+       Update: as of 12/2009 this program no longer must be run as root.
+       So try it as non-root before running it as root and/or the
+       following schemes.
+
+       In some circumstances X server program may need to be run as root.
+       If so, one could run x11vnc as root with -unixpw (it switches
+       to the user that logs in) and that may be OK, some other ideas:
+
+       - add this to sudo via visudo:
+
+               ALL ALL = NOPASSWD: /usr/local/bin/Xdummy
+
+       - use this little suid wrapper:
+/* 
+ * xdummy.c
+ *
+   cc -o ./xdummy xdummy.c
+   sudo cp ./xdummy /usr/local/bin/xdummy
+   sudo chown root:root /usr/local/bin/xdummy
+   sudo chmod u+s /usr/local/bin/xdummy
+ *
+ */
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <stdio.h>
+
+int main (int argc, char *argv[]) {
+       extern char **environ;
+       char str[100];
+       sprintf(str, "XDUMMY_UID=%d", (int) getuid());
+       putenv(str);
+       setuid(0);  
+       setgid(0);
+       execv("/usr/local/bin/Xdummy", argv); 
+       exit(1);
+       return 1;
+}
+
+
+Options:
+
+    ${program}-args:
+
+       -install        Compile the LD_PRELOAD shared object and install it
+                       next to the $program script file as:
+
+                         $0.so
+
+                       When that file exists it is used as the LD_PRELOAD
+                       shared object without recompiling.  Otherwise,
+                       each time $program is run the LD_PRELOAD shared
+                       object is compiled as a file in /tmp (or -tmpdir)
+
+                       If you set the environment variable
+                       INTERPOSE_GETUID=1 when building, then when
+                       $program is run as an ordinary user, the shared
+                       object will interpose getuid() calls and pretend
+                       to be root.  Otherwise it doesn't pretend to
+                       be root.
+
+                       You can also set the CFLAGS environment variable
+                       to anything else you want on the compile cmdline.
+
+       -uninstall      Remove the file:
+
+                         $0.so
+
+                       The LD_PRELOAD shared object will then be compiled
+                       each time this program is run.
+
+       The X server is not started under -install, -uninstall, or -prconf.
+
+
+       :N              The DISPLAY (e.g. :15) is often the first
+                       argument.  It is passed to the real X server and
+                       also used by the Xdummy script as an identifier.
+
+       -geom geom1[,geom2...]  Take the geometry (e.g. 1024x768) or list
+                       of geometries and insert them into the Screen
+                       section of the tweaked X server config file.
+                       Use this to have a different geometry than the
+                       one(s) in the system config file.
+
+                       The option -geometry can be used instead of -geom;
+                       x11vnc calls Xdummy and Xvfb this way.
+
+       -nomodelines    When you specify -geom/-geometry, $program will
+                       create Modelines for each geometry and put them
+                       in the Monitor section.  If you do not want this
+                       then supply -nomodelines.
+
+       -depth n        Use pixel color depth n (e.g. 8, 16, or 24). This
+                       makes sure the X config file has a Screen.Display
+                       subsection of this depth.  Note this option is
+                       ALSO passed to the X server.
+
+       -DEPTH n        Same as -depth, except not passed to X server.
+
+       -tmpdir dir     Specify a temporary directory, owned by you and
+                       only writable by you.  This is used in place of
+                       /tmp/Xdummy.\$USER/..  to place the $program.so
+                       shared object, tweaked config files, etc.
+
+       -nonroot        Run in non-root mode (working 12/2009, now default)
+
+       -root           Run as root (may still be needed in some
+                       environments.)  Same as XDUMMY_RUN_AS_ROOT=1.
+
+       -nosudo         Do not try to use sudo(1) when re-running as root,
+                       use su(1) instead.
+
+       -xserver path   Specify the path to the Xserver to use.  Default
+                       is to try "Xorg" first and then "XFree86".  If
+                       those are not in \$PATH, it tries these locations:
+                               /usr/bin/Xorg
+                               /usr/X11R6/bin/Xorg
+                               /usr/X11R6/bin/XFree86
+
+       -n              Do not run the command to start the X server,
+                       just show the command that $program would run.
+                       The LD_PRELOAD shared object will be built,
+                       if needed.  Also note any XDUMMY* environment
+                       variables that need to be set.
+
+       -prconf         Print, to stdout, the tweaked Xorg/XFree86
+                       config file (-config and -xf86config server
+                       options, respectively.)  The Xserver is not
+                       started.
+
+       -notweak        Do not tweak (modify) the Xorg/XFree86 config file
+                       (system or server command line) at all.  The -geom
+                       and similar config file modifications are ignored.
+
+                       It is up to you to make sure it is a working
+                       config file (e.g. "dummy" driver, etc.)
+                       Perhaps you want to use a file based on the
+                       -prconf output.
+
+       -debug          Extra debugging output.
+
+       -strace         strace(1) the Xserver process (for troubleshooting.)
+       -ltrace         ltrace(1) instead of strace (can be slow.)
+
+       -h, -help       Print out this help.
+
+
+    Xserver-args:
+
+       Most of the Xorg and XFree86 options will work and are simply
+       passed along if you supply them.  Important ones that may be
+       supplied if missing:
+
+       :N              X Display number for server to use.
+
+       vtNN            Linux virtual terminal (VT) to use (a VT is currently
+                       still used, just not switched to and from.)
+
+       -config file            Driver "dummy" tweaked config file, a
+       -xf86config file        number of settings are tweaked besides Driver.
+
+       If -config/-xf86config is not given, the system one
+       (e.g. /etc/X11/xorg.conf) is used.  If the system one cannot be
+       found, a built-in one is used.  Any settings in the config file
+       that are not consistent with "dummy" mode will be overwritten
+       (unless -notweak is specified.)
+
+       Use -config xdummy-builtin to force usage of the builtin config.
+
+       If "file" is only a basename (e.g. "xorg.dummy.conf") with no /'s,
+       then no tweaking of it is done: the X server will look for that
+       basename via its normal search algorithm.  If the found file does
+       not refer to the "dummy" driver, etc, then the X server will fail.
+
+Notes:
+
+    The Xorg/XFree86 "dummy" driver is currently undocumented.  It works
+    well in this mode, but it is evidently not intended for end-users.
+    So it could be removed or broken at any time.
+
+    If the display Xserver-arg (e.g. :1) is not given, or ":" is given
+    that indicates $program should try to find a free one (based on
+    tcp ports.)
+
+    If the display virtual terminal, VT, (e.g. vt9) is not given that
+    indicates $program should try to find a free one (or guess a high one.) 
+    
+    This program is not completely secure WRT files in /tmp (but it tries
+    to a good degree.)  Better is to use the -tmpdir option to supply a
+    directory only writable by you.  Even better is to get rid of users
+    on the local machine you do not trust :-)
+
+    Set XDUMMY_SET_XV=1 to turn on debugging output for this script.
+
+END
+}
+
+warn() {
+       echo "$*" 1>&2
+}
+
+if [ "X$XDUMMY_SET_XV" != "X" ]; then
+       set -xv
+fi
+
+if [ "X$XDUMMY_UID" = "X" ]; then
+       XDUMMY_UID=`id -u`
+       export XDUMMY_UID
+fi
+if [ "X$XDUMMY_UID" = "X0" ]; then
+       if [ "X$SUDO_UID" != "X" ]; then
+               XDUMMY_UID=$SUDO_UID
+               export XDUMMY_UID
+       fi
+fi
+
+# check if root=1 first:
+#
+if [ "X$XDUMMY_RUN_AS_ROOT" = "X1" ]; then
+       root=1
+fi
+for arg in $*
+do
+       if [ "X$arg" = "X-nonroot" ]; then
+               root=""
+       elif [ "X$arg" = "X-root" ]; then
+               root=1
+       fi
+done
+
+# See if it really needs to be run as root:
+#
+if [ "X$XDUMMY_SU_EXEC" = "X" -a "X$root" = "X1" -a "X`id -u`" != "X0"  ]; then
+       # this is to prevent infinite loop in case su/sudo doesn't work:
+       XDUMMY_SU_EXEC=1
+       export XDUMMY_SU_EXEC
+
+       dosu=1
+       nosudo=""
+
+       for arg in $*
+       do
+               if [ "X$arg" = "X-nonroot" ]; then
+                       dosu=""
+               elif [ "X$arg" = "X-nosudo" ]; then
+                       nosudo="1"
+               elif [ "X$arg" = "X-help" ]; then
+                       dosu=""
+               elif [ "X$arg" = "X-h" ]; then
+                       dosu=""
+               elif [ "X$arg" = "X-install" ]; then
+                       dosu=""
+               elif [ "X$arg" = "X-uninstall" ]; then
+                       dosu=""
+               elif [ "X$arg" = "X-n" ]; then
+                       dosu=""
+               elif [ "X$arg" = "X-prconf" ]; then
+                       dosu=""
+               fi
+       done
+       if [ $dosu ]; then
+               # we need to restart it with su/sudo:
+               if type sudo > /dev/null 2>&1; then
+                       :
+               else
+                       nosudo=1
+               fi
+               if [ "X$nosudo" = "X" ]; then
+                       warn "$program: supply the sudo password to restart as root:"
+                       if [ "X$XDUMMY_UID" != "X" ]; then
+                               exec sudo $0 -uid $XDUMMY_UID "$@"
+                       else
+                               exec sudo $0 "$@"
+                       fi
+               else
+                       warn "$program: supply the root password to restart as root:"
+                       if [ "X$XDUMMY_UID" != "X" ]; then
+                               exec su -c "$0 -uid $XDUMMY_UID $*"
+                       else
+                               exec su -c "$0 $*"
+                       fi
+               fi
+               # DONE:
+               exit
+       fi
+fi
+
+# This will hold the X display, e.g. :20
+#
+disp=""
+args=""
+cmdline_config=""
+
+# Process Xdummy args:
+#
+while [ "X$1" != "X" ]
+do
+    if [ "X$1" = "X-config" -o "X$1" = "X-xf86config" ]; then
+       cmdline_config="$2"
+    fi
+    case $1 in 
+       ":"*)   disp=$1
+                ;;
+       "-install") install=1; runit=""
+                ;;
+       "-uninstall") uninstall=1; runit=""
+                ;;
+       "-n")  runit=""
+                ;;
+       "-no") runit=""
+                ;;
+       "-norun") runit=""
+                ;;
+       "-prconf") prconf=1; runit=""
+                ;;
+       "-notweak") notweak=1
+                ;;
+       "-noconf")  notweak=1
+                ;;
+       "-nonroot") root=""
+                ;;
+       "-root")    root=1
+                ;;
+       "-nosudo") nosudo=1
+                ;;
+       "-xserver") xserver="$2"; shift
+                ;;
+       "-uid") XDUMMY_UID="$2"; shift
+               export XDUMMY_UID
+                ;;
+       "-geom")     geom="$2"; shift
+                ;;
+       "-geometry") geom="$2"; shift
+                ;;
+       "-nomodelines") nomodelines=1
+                ;;
+       "-depth") depth="$2"; args="$args -depth $2";
+                 shift
+                ;;
+       "-DEPTH") depth="$2"; shift
+                ;;
+       "-tmpdir") XDUMMY_TMPDIR="$2"; shift
+                ;;
+       "-debug")   debug=1
+                ;;
+       "-nodebug") debug=""
+                ;;
+       "-strace") strace=1
+                ;;
+       "-ltrace") strace=2
+                ;;
+       "-h")    help; exit 0
+                ;;
+       "-help") help; exit 0
+                ;;
+       *)      args="$args $1"
+                ;;
+    esac
+    shift
+done
+
+# Try to get a username for use in our tmp directory, etc.
+#
+user=""
+if [ X`id -u` = "X0"  ]; then
+       user=root       # this will also be used below for id=0
+elif [ "X$USER" != "X" ]; then
+       user=$USER
+elif [ "X$LOGNAME" != "X" ]; then
+       user=$LOGNAME
+fi
+
+# Keep trying...
+#
+if [ "X$user" = "X" ]; then
+       user=`whoami 2>/dev/null`
+fi
+if [ "X$user" = "X" ]; then
+       user=`basename "$HOME"`
+fi
+if [ "X$user" = "X" -o "X$user" = "X." ]; then
+       user="u$$"
+fi
+
+if [ "X$debug" = "X1" -a "X$runit" != "X" ]; then
+       echo ""
+       echo "/usr/bin/env:"
+       env | egrep -v '^(LS_COLORS|TERMCAP)' | sort
+       echo ""
+fi
+
+# Function to compile the LD_PRELOAD shared object:
+#
+make_so() {
+       # extract code embedded in this script into a tmp C file: 
+       n1=`grep -n '^#code_begin' $0 | head -1 | awk -F: '{print $1}'`
+       n2=`grep -n '^#code_end'   $0 | head -1 | awk -F: '{print $1}'`
+       n1=`expr $n1 + 1`
+       dn=`expr $n2 - $n1`
+
+       tmp=$tdir/Xdummy.$RANDOM$$.c
+       rm -f $tmp
+       if [ -e $tmp -o -h $tmp ]; then
+               warn "$tmp still exists."
+               exit 1
+       fi
+       touch $tmp || exit 1
+       tail -n +$n1 $0 | head -n $dn > $tmp
+
+       # compile it to Xdummy.so:
+       if [ -f "$SO" ]; then
+               mv $SO $SO.$$
+               rm -f $SO.$$
+       fi
+       rm -f $SO
+       touch $SO
+       if [ ! -f "$SO" ]; then
+               SO=$tdir/Xdummy.$user.so
+               warn "warning switching LD_PRELOAD shared object to: $SO"
+       fi
+
+       if [ -f "$SO" ]; then
+               mv $SO $SO.$$
+               rm -f $SO.$$
+       fi
+       rm -f $SO
+
+       # we assume gcc:
+       if [ "X$INTERPOSE_GETUID" = "X1" ]; then
+               CFLAGS="$CFLAGS -DINTERPOSE_GETUID"
+       fi
+       echo "$program:" cc -shared -fPIC $CFLAGS -o $SO $tmp
+                         cc -shared -fPIC $CFLAGS -o $SO $tmp
+       rc=$?
+       rm -f $tmp
+       if [ $rc != 0 ]; then
+               warn "$program: cannot build $SO"
+               exit 1
+       fi
+       if [ "X$debug" != "X" -o "X$install" != "X" ]; then
+               warn "$program: created  $SO"
+               ls -l "$SO"
+       fi
+}
+
+# Set tdir to tmp dir for make_so():
+if [ "X$XDUMMY_TMPDIR" != "X" ]; then
+       tdir=$XDUMMY_TMPDIR
+       mkdir -p $tdir
+else
+       tdir="/tmp"
+fi
+
+# Handle -install/-uninstall case:
+SO=$0.so
+if [ "X$install" != "X" -o "X$uninstall" != "X" ]; then
+       if [ -e "$SO" -o -h "$SO" ]; then
+               warn "$program: removing $SO"
+       fi
+       if [ -f "$SO" ]; then
+               mv $SO $SO.$$
+               rm -f $SO.$$
+       fi
+       rm -f $SO
+       if [ -e "$SO" -o -h "$SO" ]; then
+               warn "warning: $SO still exists."
+               exit 1
+       fi
+       if [ $install ]; then
+               make_so
+               if [ ! -f "$SO" ]; then
+                       exit 1
+               fi
+       fi
+       exit 0
+fi
+
+# We need a tmp directory for the .so, tweaked config file, and for
+# redirecting filenames we cannot create (under -nonroot)
+#
+tack=""
+if [ "X$XDUMMY_TMPDIR" = "X" ]; then
+       XDUMMY_TMPDIR="/tmp/Xdummy.$user"
+
+       # try to tack on a unique subdir (display number or pid)
+       # to allow multiple instances
+       #
+       if [ "X$disp" != "X" ]; then
+               t0=$disp
+       else
+               t0=$1
+       fi
+       tack=`echo "$t0" | sed -e 's/^.*://'`
+       if echo "$tack" | grep '^[0-9][0-9]*$' > /dev/null; then
+               :
+       else
+               tack=$$
+       fi
+       if [ "X$tack" != "X" ]; then
+               XDUMMY_TMPDIR="$XDUMMY_TMPDIR/$tack"
+       fi
+fi
+
+tmp=$XDUMMY_TMPDIR
+if echo "$tmp" | grep '^/tmp' > /dev/null; then
+       if [ "X$tmp" != "X/tmp" -a "X$tmp" != "X/tmp/" ]; then
+               # clean this subdir of /tmp out, otherwise leave it...
+               rm -rf $XDUMMY_TMPDIR
+               if [ -e $XDUMMY_TMPDIR ]; then
+                       warn "$XDUMMY_TMPDIR still exists"
+                       exit 1
+               fi
+       fi
+fi
+
+mkdir -p $XDUMMY_TMPDIR
+chmod 700 $XDUMMY_TMPDIR
+if [ "X$tack" != "X" ]; then
+       chmod 700 `dirname "$XDUMMY_TMPDIR"` 2>/dev/null
+fi
+
+# See if we can write something there:
+#
+tfile="$XDUMMY_TMPDIR/test.file"
+touch $tfile
+if [ ! -f "$tfile" ]; then
+       XDUMMY_TMPDIR="/tmp/Xdummy.$$.$USER"
+       warn "warning: setting tmpdir to $XDUMMY_TMPDIR ..."
+       rm -rf $XDUMMY_TMPDIR || exit 1
+       mkdir -p $XDUMMY_TMPDIR || exit 1
+fi
+rm -f $tfile
+
+export XDUMMY_TMPDIR
+
+# Compile the LD_PRELOAD shared object if needed (needs XDUMMY_TMPDIR)
+#
+if [ ! -f "$SO" ]; then
+       SO="$XDUMMY_TMPDIR/Xdummy.so"
+       make_so
+fi
+
+# Decide which X server to use:
+#
+if [ "X$xserver" = "X" ]; then
+       if type Xorg >/dev/null 2>&1; then
+               xserver="Xorg"
+       elif type XFree86 >/dev/null 2>&1; then
+               xserver="XFree86"
+       elif -x /usr/bin/Xorg; then
+               xserver="/usr/bin/Xorg"
+       elif -x /usr/X11R6/bin/Xorg; then
+               xserver="/usr/X11R6/bin/Xorg"
+       elif -x /usr/X11R6/bin/XFree86; then
+               xserver="/usr/X11R6/bin/XFree86"
+       fi
+       if [ "X$xserver" = "X" ]; then
+               # just let it fail below.
+               xserver="/usr/bin/Xorg"
+               warn "$program: cannot locate a stock Xserver... assuming $xserver"
+       fi
+fi
+
+# See if the binary is suid or not readable under -nonroot mode:
+#
+if [ "X$BASH_VERSION" != "X" ]; then
+       xserver_path=`type -p $xserver 2>/dev/null`
+else
+       xserver_path=`type $xserver 2>/dev/null | awk '{print $NF}'`
+fi
+if [ -e "$xserver_path" -a "X$root" = "X" -a "X$runit" != "X" ]; then
+       if [ ! -r $xserver_path -o -u $xserver_path -o -g $xserver_path ]; then
+               # XXX not quite correct with rm -rf $XDUMMY_TMPDIR ...
+               # we keep on a filesystem we know root can write to.
+               base=`basename "$xserver_path"`
+               new="/tmp/$base.$user.bin"
+               if [ -e $new ]; then
+                       snew=`ls -l $new          | awk '{print $5}' | grep '^[0-9][0-9]*$'`
+                       sold=`ls -l $xserver_path | awk '{print $5}' | grep '^[0-9][0-9]*$'`
+                       if [ "X$snew" != "X" -a "X$sold" != "X" -a "X$sold" != "X$snew" ]; then
+                               warn "removing different sized copy:"
+                               ls -l $new $xserver_path
+                               rm -f $new
+                       fi
+               fi
+               if [ ! -e $new -o ! -s $new ]; then
+                       rm -f $new
+                       touch $new || exit 1
+                       chmod 700 $new || exit 1
+                       if [ ! -r $xserver_path ]; then
+                               warn ""
+                               warn "NEED TO COPY UNREADABLE $xserver_path to $new as root:"
+                               warn ""
+                               ls -l $xserver_path 1>&2
+                               warn ""
+                               warn "This only needs to be done once:"
+                               warn "    cat $xserver_path > $new"
+                               warn ""
+                               nos=$nosudo
+                               if type sudo > /dev/null 2>&1; then
+                                       :
+                               else
+                                       nos=1
+                               fi
+                               if [ "X$nos" = "X1" ]; then
+                                       warn "Please supply root passwd to 'su -c'"
+                                       su -c "cat $xserver_path > $new"
+                               else
+                                       warn "Please supply the sudo passwd if asked:"
+                                       sudo /bin/sh -c "cat $xserver_path > $new"
+                               fi
+                       else
+                               warn ""
+                               warn "COPYING SETUID $xserver_path to $new"
+                               warn ""
+                               ls -l $xserver_path 1>&2
+                               warn ""
+                               cat $xserver_path > $new
+                       fi
+                       ls -l $new
+                       if [ -s $new ]; then
+                               :
+                       else
+                               rm -f $new
+                               ls -l $new
+                               exit 1
+                       fi
+                       warn ""
+                       warn "Please restart Xdummy now."
+                       exit 0
+               fi
+               if [ ! -O $new ]; then
+                       warn "file \"$new\" not owned by us!"
+                       ls -l $new
+                       exit 1
+               fi
+               xserver=$new
+       fi 
+fi
+
+# Work out display:
+#
+if [ "X$disp" != "X" ]; then
+       :
+elif [ "X$1" != "X" ]; then
+       if echo "$1" | grep '^:[0-9]' > /dev/null; then
+               disp=$1
+               shift
+       elif [ "X$1" = "X:" ]; then
+               # ":" means for us to find one.
+               shift
+       fi
+fi
+if [ "X$disp" = "X" -o "X$disp" = "X:" ]; then
+       # try to find an open display port:
+       # (tcp outdated...)
+       ports=`netstat -ant | grep LISTEN | awk '{print $4}' | sed -e 's/^.*://'`
+       n=0
+       while [ $n -le 20 ]
+       do
+               port=`printf "60%02d" $n`
+               if echo "$ports" | grep "^${port}\$" > /dev/null; then
+                       :
+               else
+                       disp=":$n"
+                       warn "$program: auto-selected DISPLAY $disp"
+                       break   
+               fi
+               n=`expr $n + 1`
+       done
+fi
+
+# Work out which vt to use, try to find/guess an open one if necessary.
+#
+vt=""
+for arg in $*
+do
+       if echo "$arg" | grep '^vt' > /dev/null; then
+               vt=$arg
+               break
+       fi
+done
+if [ "X$vt" = "X" ]; then
+       if [ "X$user" = "Xroot" ]; then
+               # root can user fuser(1) to see if it is in use:
+               if type fuser >/dev/null 2>&1; then
+                       # try /dev/tty17 thru /dev/tty32
+                       n=17
+                       while [ $n -le 32 ]
+                       do
+                               dev="/dev/tty$n"
+                               if fuser $dev >/dev/null 2>&1; then
+                                       :
+                               else
+                                       vt="vt$n"
+                                       warn "$program: auto-selected VT $vt => $dev"
+                                       break
+                               fi
+                               n=`expr $n + 1`
+                       done
+               fi
+       fi
+       if [ "X$vt" = "X" ]; then
+               # take a wild guess...
+               vt=vt16
+               warn "$program: selected fallback VT $vt"
+       fi
+else
+       vt=""
+fi
+
+# Decide flavor of Xserver:
+#
+stype=`basename "$xserver"`
+if echo "$stype" | grep -i xfree86 > /dev/null; then
+       stype=xfree86
+else
+       stype=xorg
+fi
+
+tweak_config() {
+    in="$1"
+    config2="$XDUMMY_TMPDIR/xdummy_modified_xconfig.conf"
+    if [ "X$disp" != "X" ]; then
+       d=`echo "$disp" | sed -e 's,/,,g' -e 's/:/_/g'`
+       config2="$config2$d"
+    fi
+    
+    # perl script to tweak the config file... add/delete options, etc.
+    #
+    env XDUMMY_GEOM=$geom \
+        XDUMMY_DEPTH=$depth \
+        XDUMMY_NOMODELINES=$nomodelines \
+        perl > $config2 < $in -e '
+    $n = 0;
+    $geom  = $ENV{XDUMMY_GEOM};
+    $depth = $ENV{XDUMMY_DEPTH};
+    $nomodelines = $ENV{XDUMMY_NOMODELINES};
+    $mode_str = "";
+    $videoram = "24000";
+    $HorizSync   = "30.0 - 130.0";
+    $VertRefresh = "50.0 - 250.0";
+    if ($geom ne "") {
+       my $tmp = "";
+       foreach $g (split(/,/, $geom)) {
+               $tmp .= "\"$g\" ";
+               if (!$nomodelines && $g =~ /(\d+)x(\d+)/) {
+                       my $w = $1;
+                       my $h = $2;
+                       $mode_str .= "  Modeline \"$g\" ";
+                       my $dot = sprintf("%.2f", $w * $h * 70 * 1.e-6);
+                       $mode_str .= $dot;
+                       $mode_str .= " " . $w;
+                       $mode_str .= " " . int(1.02 * $w);
+                       $mode_str .= " " . int(1.10 * $w);
+                       $mode_str .= " " . int(1.20 * $w);
+                       $mode_str .= " " . $h;
+                       $mode_str .= " " . int($h + 1);
+                       $mode_str .= " " . int($h + 3);
+                       $mode_str .= " " . int($h + 20);
+                       $mode_str .= "\n";
+               }
+       }
+       $tmp =~ s/\s*$//;
+       $geom = $tmp;
+    }
+    while (<>) {
+       if ($ENV{XDUMMY_NOTWEAK}) {
+               print $_;
+               next;
+       }
+       $n++;
+       if (/^\s*#/) {
+               # pass comments straight thru
+               print;
+               next;
+       }
+       if (/^\s*Section\s+(\S+)/i) {
+               # start of Section
+               $sect = $1;
+               $sect =~ s/\W//g;
+               $sect =~ y/A-Z/a-z/;
+               $sects{$sect} = 1;
+               print;
+               next;
+       }
+       if (/^\s*EndSection/i) {
+               # end of Section
+               if ($sect eq "serverflags") {
+                       if (!$got_DontVTSwitch) {
+                               print "  ##Xdummy:##\n";
+                               print "  Option \"DontVTSwitch\" \"true\"\n";
+                       }
+                       if (!$got_AllowMouseOpenFail) {
+                               print "  ##Xdummy:##\n";
+                               print "  Option \"AllowMouseOpenFail\" \"true\"\n";
+                       }
+                       if (!$got_PciForceNone) {
+                               print "  ##Xdummy:##\n";
+                               print "  Option \"PciForceNone\" \"true\"\n";
+                       }
+               } elsif ($sect eq "device") {
+                       if (!$got_Driver) {
+                               print "  ##Xdummy:##\n";
+                               print "  Driver \"dummy\"\n";
+                       }
+                       if (!$got_VideoRam) {
+                               print "  ##Xdummy:##\n";
+                               print "  VideoRam $videoram\n";
+                       }
+               } elsif ($sect eq "screen") {
+                       if ($depth ne "" && !got_DefaultDepth) {
+                               print "  ##Xdummy:##\n";
+                               print "  DefaultDepth $depth\n";
+                       }
+                       if ($got_Monitor eq "") {
+                               print "  ##Xdummy:##\n";
+                               print "  Monitor \"Monitor0\"\n";
+                       }
+               } elsif ($sect eq "monitor") {
+                       if (!got_HorizSync) {
+                               print "  ##Xdummy:##\n";
+                               print "  HorizSync   $HorizSync\n";
+                       }
+                       if (!got_VertRefresh) {
+                               print "  ##Xdummy:##\n";
+                               print "  VertRefresh $VertRefresh\n";
+                       }
+                       if (!$nomodelines) {
+                               print "  ##Xdummy:##\n";
+                               print $mode_str;
+                       }
+               }
+               $sect = "";
+               print;
+               next;
+       }
+
+       if (/^\s*SubSection\s+(\S+)/i) {
+               # start of Section
+               $subsect = $1;
+               $subsect =~ s/\W//g;
+               $subsect =~ y/A-Z/a-z/;
+               $subsects{$subsect} = 1;
+               if ($sect eq "screen" && $subsect eq "display") {
+                       $got_Modes = 0;
+               }
+               print;
+               next;
+       }
+       if (/^\s*EndSubSection/i) {
+               # end of SubSection
+               if ($sect eq "screen") {
+                       if ($subsect eq "display") {
+                               if ($depth ne "" && !$set_Depth) {
+                                       print "          ##Xdummy:##\n";
+                                       print "          Depth\t$depth\n";
+                               }
+                               if ($geom ne "" && ! $got_Modes) {
+                                       print "          ##Xdummy:##\n";
+                                       print "          Modes\t$geom\n";
+                               }
+                       }
+               }
+               $subsect = "";
+               print;
+               next;
+       }
+
+       $l = $_;
+       $l =~ s/#.*$//;
+       if ($sect eq "serverflags") {
+               if ($l =~ /^\s*Option.*DontVTSwitch/i) {
+                       $_ =~ s/false/true/ig;
+                       $got_DontVTSwitch = 1;
+               }
+               if ($l =~ /^\s*Option.*AllowMouseOpenFail/i) {
+                       $_ =~ s/false/true/ig;
+                       $got_AllowMouseOpenFail = 1;
+               }
+               if ($l =~ /^\s*Option.*PciForceNone/i) {
+                       $_ =~ s/false/true/ig;
+                       $got_PciForceNone= 1;
+               }
+       }
+       if ($sect eq "module") {
+               if ($l =~ /^\s*Load.*\b(dri|fbdevhw)\b/i) {
+                       $_ = "##Xdummy## $_";
+               }
+       }
+       if ($sect eq "monitor") {
+               if ($l =~ /^\s*HorizSync/i) {
+                       $got_HorizSync = 1;
+               }
+               if ($l =~ /^\s*VertRefresh/i) {
+                       $got_VertRefresh = 1;
+               }
+       }
+       if ($sect eq "device") {
+               if ($l =~ /^(\s*Driver)\b/i) {
+                       $_ = "$1 \"dummy\"\n";
+                       $got_Driver = 1;
+               }
+               if ($l =~ /^\s*VideoRam/i) {
+                       $got_VideoRam= 1;
+               }
+       }
+       if ($sect eq "inputdevice") {
+               if ($l =~ /^\s*Option.*\bDevice\b/i) {
+                       print "  ##Xdummy:##\n";
+                       $_ = "  Option \"Device\" \"/dev/dilbert$n\"\n";
+               }
+       }
+       if ($sect eq "screen") {
+               if ($l =~ /^\s*DefaultDepth\s+(\d+)/i) {
+                       if ($depth ne "") {
+                               print "  ##Xdummy:##\n";
+                               $_ = "  DefaultDepth\t$depth\n";
+                       }
+                       $got_DefaultDepth = 1;
+               }
+               if ($l =~ /^\s*Monitor\s+(\S+)/i) {
+                       $got_Monitor = $1;
+                       $got_Monitor =~ s/"//g;
+               }
+               if ($subsect eq "display") {
+                       if ($geom ne "") {
+                               if ($l =~ /^(\s*Modes)\b/i) {
+                                       print "          ##Xdummy:##\n";
+                                       $_ = "$1 $geom\n";
+                                       $got_Modes = 1;
+                               }
+                       }
+                       if ($l =~ /^\s*Depth\s+(\d+)/i) {
+                               my $d = $1;
+                               if (!$set_Depth && $depth ne "") {
+                                       $set_Depth = 1;
+                                       if ($depth != $d) {
+                                               print "          ##Xdummy:##\n";
+                                               $_ =  "          Depth\t$depth\n";
+                                       }
+                               }
+                       }
+               }
+       }
+       print;
+    }
+    if ($ENV{XDUMMY_NOTWEAK}) {
+       exit;
+    }
+    # create any crucial sections that are missing:
+    if (! exists($sects{serverflags})) {
+       print "\n##Xdummy:##\n";
+       print "Section \"ServerFlags\"\n";
+       print "  Option \"DontVTSwitch\" \"true\"\n";
+       print "  Option \"AllowMouseOpenFail\" \"true\"\n";
+       print "  Option \"PciForceNone\" \"true\"\n";
+       print "EndSection\n";
+    }
+    if (! exists($sects{device})) {
+       print "\n##Xdummy:##\n";
+       print "Section \"Device\"\n";
+       print "  Identifier \"Videocard0\"\n";
+       print "  Driver \"dummy\"\n";
+       print "  VideoRam $videoram\n";
+       print "EndSection\n";
+    }
+    if (! exists($sects{monitor})) {
+       print "\n##Xdummy:##\n";
+       print "Section \"Monitor\"\n";
+       print "  Identifier \"Monitor0\"\n";
+       print "  HorizSync   $HorizSync\n";
+       print "  VertRefresh $VertRefresh\n";
+       print "EndSection\n";
+    }
+    if (! exists($sects{screen})) {
+       print "\n##Xdummy:##\n";
+       print "Section \"Screen\"\n";
+       print "  Identifier \"Screen0\"\n";
+       print "  Device \"Videocard0\"\n";
+       if ($got_Monitor ne "") {
+               print "  Monitor \"$got_Monitor\"\n";
+       } else {
+               print "  Monitor \"Monitor0\"\n";
+       }
+       if ($depth ne "") {
+               print "  DefaultDepth $depth\n";
+       } else {
+               print "  DefaultDepth 24\n";
+       }
+       print "  SubSection \"Display\"\n";
+       print "    Viewport 0 0\n";
+       print "    Depth 24\n";
+       if ($got_Modes) {
+               ;
+       } elsif ($geom ne "") {
+               print "    Modes $geom\n";
+       } else {
+               print "    Modes \"1280x1024\" \"1024x768\" \"800x600\"\n";
+       }
+       print "  EndSubSection\n";
+       print "EndSection\n";
+    }
+';
+}
+
+# Work out config file and tweak it.
+#
+if [ "X$cmdline_config" = "X" ]; then
+       :
+elif [ "X$cmdline_config" = "Xxdummy-builtin" ]; then
+       :
+elif echo "$cmdline_config" | grep '/' > /dev/null; then
+       :
+else
+       # ignore basename only case (let server handle it)
+       cmdline_config=""
+       notweak=1
+fi
+
+config=$cmdline_config
+
+if [ "X$notweak" = "X1" -a "X$root" = "X" -a  -f "$cmdline_config" ]; then
+       # if not root we need to copy (but not tweak) the specified config.
+       XDUMMY_NOTWEAK=1
+       export XDUMMY_NOTWEAK
+       notweak=""
+fi
+
+if [ ! $notweak ]; then
+       # tweaked config will be put in $config2:
+       config2=""
+       if [ "X$config" = "X" ]; then
+               # use the default one:
+               if [ "X$stype" = "Xxorg" ]; then
+                       config=/etc/X11/xorg.conf
+               else
+                       if [ -f "/etc/X11/XF86Config-4" ]; then
+                               config="/etc/X11/XF86Config-4"
+                       else
+                               config="/etc/X11/XF86Config"
+                       fi
+               fi
+               if [ ! -f "$config" ]; then
+                       for c in /etc/X11/xorg.conf /etc/X11/XF86Config-4 /etc/X11/XF86Config
+                       do
+                               if [ -f $c ]; then
+                                       config=$c
+                                       break
+                               fi
+                       done
+               fi
+       fi
+
+       if [ "X$config" = "Xxdummy-builtin" ]; then
+               config=""
+       fi
+
+       if [ ! -f "$config" ]; then
+               config="$XDUMMY_TMPDIR/xorg.conf"
+               warn "$program: using minimal built-in xorg.conf settings."
+               cat > $config <<END
+
+Section "ServerLayout"
+    Identifier     "Layout0"
+    Screen      0  "Screen0"
+    InputDevice    "Keyboard0" "CoreKeyboard"
+    InputDevice    "Mouse0" "CorePointer"
+EndSection
+
+Section "Files"
+EndSection
+
+Section "Module"
+    Load           "dbe"
+    Load           "extmod"
+    Load           "freetype"
+    Load           "glx"
+EndSection
+
+Section "InputDevice"
+    Identifier     "Mouse0"
+    Driver         "mouse"
+    Option         "Protocol" "auto"
+    Option         "Device" "/dev/psaux"
+    Option         "Emulate3Buttons" "no"
+    Option         "ZAxisMapping" "4 5"
+EndSection
+
+Section "InputDevice"
+    Identifier     "Keyboard0"
+    Driver         "kbd"
+EndSection
+
+Section "Monitor"
+    Identifier     "Monitor0"
+    VendorName     "Unknown"
+    ModelName      "Unknown"
+    HorizSync       30.0 - 130.0
+    VertRefresh     50.0 - 250.0
+    Option         "DPMS"
+EndSection
+
+Section "Device"
+    Identifier     "Device0"
+    Driver         "foovideo"
+    VendorName     "foovideo Corporation"
+EndSection
+
+Section "Screen"
+    Identifier     "Screen0"
+    Device         "Device0"
+    Monitor        "Monitor0"
+    DefaultDepth    24
+    SubSection     "Display"
+        Depth       24
+        Modes           "1280x1024"
+    EndSubSection
+EndSection
+
+END
+       fi
+
+       if [ -f "$config" ]; then
+               tweak_config $config
+       fi
+
+       # now we need to get our tweaked config file onto the command line:
+       if [ "X$cmdline_config" = "X" ]; then
+               # append to cmdline (FUBAR will be substituted below.)
+               if [ "X$stype" = "Xxorg" ]; then
+                       args="$args -config FUBAR"
+               else
+                       args="$args -xf86config FUBAR"
+               fi
+       fi
+       if [ "X$config2" != "X" ]; then
+               # or modify $args:
+               c2=$config2
+               if [ "X$root" = "X" ]; then
+                       # ordinary user cannot use absolute path.
+                       c2=`basename $config2`
+               fi
+               args=`echo "$args" | sed \
+                       -e "s,-config  *[^ ][^ ]*,-config $c2,g" \
+                       -e "s,-xf86config  *[^ ][^ ]*,-xf86config $c2,g"`
+       fi
+fi
+
+if [ $prconf ]; then
+       warn ""
+       warn "Printing out the Xorg/XFree86 server config file:"
+       warn ""
+       if [ "X$config2" = "X" ]; then
+               warn "NO CONFIG GENERATED."
+               exit 1
+       else
+               cat "$config2"
+       fi
+       exit 0
+fi
+
+if [ $debug ]; then
+       XDUMMY_DEBUG=1
+       export XDUMMY_DEBUG
+fi
+if [ $root ]; then
+       XDUMMY_ROOT=1
+       export XDUMMY_ROOT
+fi
+
+# Finally, run it:
+#
+if [ "X$debug" != "X" -o "X$runit" = "X" ]; then
+       if [ ! $runit ]; then
+               echo ""
+               echo "/usr/bin/env:"
+               env | egrep -v '^(LS_COLORS|TERMCAP)' | sort
+               echo ""
+               echo "XDUMMY*:"
+               env | grep '^XDUMMY' | sort
+               echo ""
+       fi
+       warn ""
+       warn "The command to run is:"
+       warn ""
+       so=$SO
+       pwd=`pwd`
+       if echo "$so" | grep '^\./' > /dev/null; then
+               so=`echo "$so" | sed -e "s,^\.,$pwd,"`
+       fi
+       if echo "$so" | grep '/' > /dev/null; then
+               :
+       else
+               so="$pwd/$so"
+       fi
+       warn "env LD_PRELOAD=$so $xserver $disp $args $vt"
+       warn ""
+       if [ ! $runit ]; then
+               exit 0
+       fi
+fi
+
+if [ $strace ]; then
+       if [ "X$strace" = "X2" ]; then
+               ltrace -f env LD_PRELOAD=$SO $xserver $disp $args $vt
+       else
+               strace -f env LD_PRELOAD=$SO $xserver $disp $args $vt
+       fi
+else
+       exec env LD_PRELOAD=$SO $xserver $disp $args $vt
+fi
+
+exit $?
+
+#########################################################################
+
+code() {
+#code_begin
+#include <stdio.h>
+#define O_ACCMODE          0003
+#define O_RDONLY             00
+#define O_WRONLY             01
+#define O_RDWR               02
+#define O_CREAT            0100 /* not fcntl */
+#define O_EXCL             0200 /* not fcntl */
+#define O_NOCTTY           0400 /* not fcntl */
+#define O_TRUNC           01000 /* not fcntl */
+#define O_APPEND          02000
+#define O_NONBLOCK        04000
+#define O_NDELAY        O_NONBLOCK
+#define O_SYNC           010000
+#define O_FSYNC          O_SYNC
+#define O_ASYNC          020000
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <linux/vt.h>
+#include <linux/kd.h>
+
+#define __USE_GNU
+#include <dlfcn.h>
+
+static char tmpdir[4096];
+static char str1[4096];
+static char str2[4096];
+
+static char devs[256][1024];
+static int debug = -1;
+static int root = -1;
+static int changed_uid = 0;
+static int saw_fonts = 0;
+static int saw_lib_modules = 0;
+
+static time_t start = 0; 
+
+void check_debug(void) {
+       if (debug < 0) {
+               if (getenv("XDUMMY_DEBUG") != NULL) {
+                       debug = 1;
+               } else {
+                       debug = 0;
+               }
+               /* prevent other processes using the preload: */
+               putenv("LD_PRELOAD=");
+       }
+}
+void check_root(void) {
+       if (root < 0) {
+               /* script tells us if we are root */
+               if (getenv("XDUMMY_ROOT") != NULL) {
+                       root = 1;
+               } else {
+                       root = 0;
+               }
+       }
+}
+
+void check_uid(void) {
+       if (start == 0) {
+               start = time(NULL);
+               if (debug) fprintf(stderr, "START: %u\n", (unsigned int) start);
+               return;
+       } else if (changed_uid == 0) {
+               if (saw_fonts || time(NULL) > start + 20) {
+                       if (getenv("XDUMMY_UID")) {
+                               int uid = atoi(getenv("XDUMMY_UID"));
+                               if (debug) fprintf(stderr, "SETREUID: %d saw_fonts=%d\n", uid, saw_fonts);
+                               if (uid >= 0) {
+                                       /* this will simply fail in -nonroot mode: */
+                                       setreuid(uid, -1);
+                               }
+                       }
+                       changed_uid = 1;
+               }
+       }
+}
+
+#define CHECKIT if (debug < 0) check_debug(); \
+               if (root  < 0) check_root(); \
+               check_uid();
+
+static void set_tmpdir(void) {
+       char *s;
+       static int didset = 0;
+       if (didset) {
+               return;
+       }
+       s = getenv("XDUMMY_TMPDIR");
+       if (! s) {
+               s = "/tmp";
+       }
+       tmpdir[0] = '\0';
+       strcat(tmpdir, s);
+       strcat(tmpdir, "/");
+       didset = 1;
+}
+
+static char *tmpdir_path(const char *path) {
+       char *str;
+       set_tmpdir();
+       strcpy(str2, path);
+       str = str2;
+       while (*str) {
+               if (*str == '/') {
+                       *str = '_';
+               }
+               str++;
+       }
+       strcpy(str1, tmpdir);
+       strcat(str1, str2);
+       return str1;
+}
+
+int open(const char *pathname, int flags, unsigned short mode) {
+       int fd;
+       char *store_dev = NULL;
+       static int (*real_open)(const char *, int , unsigned short) = NULL;
+
+       CHECKIT
+       if (! real_open) {
+               real_open = (int (*)(const char *, int , unsigned short))
+                       dlsym(RTLD_NEXT, "open");
+       }
+
+       if (strstr(pathname, "lib/modules/")) {
+               /* not currently used. */
+               saw_lib_modules = 1;
+       }
+
+       if (!root) {
+               if (strstr(pathname, "/dev/") == pathname) {
+                       store_dev = strdup(pathname);
+               }
+               if (strstr(pathname, "/dev/tty") == pathname && strcmp(pathname, "/dev/tty")) {
+                       pathname = tmpdir_path(pathname);
+                       if (debug) fprintf(stderr, "OPEN: %s -> %s (as FIFO)\n", store_dev, pathname);
+                       /* we make it a FIFO so ioctl on it does not fail */
+                       unlink(pathname);
+                       mkfifo(pathname, 0666);
+               } else if (0) {
+                       /* we used to handle more /dev files ... */
+                       fd = real_open(pathname, O_WRONLY|O_CREAT, 0777);
+                       close(fd);
+               }
+       }
+
+       fd = real_open(pathname, flags, mode);
+
+       if (debug) fprintf(stderr, "OPEN: %s %d %d fd=%d\n", pathname, flags, mode, fd);
+
+       if (! root) {
+               if (store_dev) {
+                       if (fd < 256) {
+                               strcpy(devs[fd], store_dev);
+                       }
+                       free(store_dev);
+               }
+       }
+
+       return(fd);
+}
+
+int open64(const char *pathname, int flags, unsigned short mode) {
+       int fd;
+
+       CHECKIT
+       if (debug) fprintf(stderr, "OPEN64: %s %d %d\n", pathname, flags, mode);
+
+       fd = open(pathname, flags, mode);
+       return(fd);
+}
+
+int rename(const char *oldpath, const char *newpath) {
+       static int (*real_rename)(const char *, const char *) = NULL;
+
+       CHECKIT
+       if (! real_rename) {
+               real_rename = (int (*)(const char *, const char *))
+                       dlsym(RTLD_NEXT, "rename");
+       }
+
+       if (debug) fprintf(stderr, "RENAME: %s %s\n", oldpath, newpath);
+
+       if (root) {
+               return(real_rename(oldpath, newpath));
+       }
+
+       if (strstr(oldpath, "/var/log") == oldpath) {
+               if (debug) fprintf(stderr, "RENAME: returning 0\n");
+               return 0;
+       }
+       return(real_rename(oldpath, newpath));
+}
+
+FILE *fopen(const char *pathname, const char *mode) {
+       static FILE* (*real_fopen)(const char *, const char *) = NULL;
+       char *str;
+
+       if (! saw_fonts) {
+               if (strstr(pathname, "/fonts/")) {
+                       if (strstr(pathname, "fonts.dir")) {
+                               saw_fonts = 1;
+                       } else if (strstr(pathname, "fonts.alias")) {
+                               saw_fonts = 1;
+                       }
+               }
+       }
+
+       CHECKIT
+       if (! real_fopen) {
+               real_fopen = (FILE* (*)(const char *, const char *))
+                       dlsym(RTLD_NEXT, "fopen");
+       }
+
+       if (debug) fprintf(stderr, "FOPEN: %s %s\n", pathname, mode);
+
+       if (strstr(pathname, "xdummy_modified_xconfig.conf")) {
+               /* make our config appear to be in /etc/X11, etc. */
+               char *q = strrchr(pathname, '/');
+               if (q != NULL && getenv("XDUMMY_TMPDIR") != NULL) {
+                       strcpy(str1, getenv("XDUMMY_TMPDIR"));
+                       strcat(str1, q);
+                       if (debug) fprintf(stderr, "FOPEN: %s -> %s\n", pathname, str1);
+                       pathname = str1;
+               }
+       }
+
+       if (root) {
+               return(real_fopen(pathname, mode));
+       }
+
+       str = (char *) pathname;
+       if (strstr(pathname, "/var/log") == pathname) {
+               str = tmpdir_path(pathname);
+               if (debug) fprintf(stderr, "FOPEN: %s -> %s\n", pathname, str);
+       }
+       return(real_fopen(str, mode));
+}
+
+
+#define RETURN0 if (debug) \
+       {fprintf(stderr, "IOCTL: covered %d 0x%x\n", fd, req);} return 0;
+#define RETURN1 if (debug) \
+       {fprintf(stderr, "IOCTL: covered %d 0x%x\n", fd, req);} return -1;
+
+int ioctl(int fd, int req, void *ptr) {
+       static int closed_xf86Info_consoleFd = 0;
+       static int (*real_ioctl)(int, int , void *) = NULL;
+
+       CHECKIT
+       if (! real_ioctl) {
+               real_ioctl = (int (*)(int, int , void *))
+                       dlsym(RTLD_NEXT, "open");
+       }
+       if (debug) fprintf(stderr, "IOCTL: %d 0x%x %p\n", fd, req, ptr);
+
+       /* based on xorg-x11-6.8.1-dualhead.patch */
+       if (req == VT_GETMODE) {
+               /* close(xf86Info.consoleFd) */
+               if (0 && ! closed_xf86Info_consoleFd) {
+                       /* I think better not to close it... */
+                       close(fd);
+                       closed_xf86Info_consoleFd = 1;
+               }
+               RETURN0
+       } else if (req == VT_SETMODE) {
+               RETURN0
+       } else if (req == VT_GETSTATE) {
+               RETURN0
+       } else if (req == KDSETMODE) {
+               RETURN0
+       } else if (req == KDSETLED) {
+               RETURN0
+       } else if (req == KDGKBMODE) {
+               RETURN0
+       } else if (req == KDSKBMODE) {
+               RETURN0
+       } else if (req == VT_ACTIVATE) {
+               RETURN0
+       } else if (req == VT_WAITACTIVE) {
+               RETURN0
+       } else if (req == VT_RELDISP) {
+               if (ptr == (void *) 1) {
+                       RETURN1
+               } else if (ptr == (void *) VT_ACKACQ) {
+                       RETURN0
+               }
+       }
+
+       return(real_ioctl(fd, req, ptr));
+}
+
+typedef void (*sighandler_t)(int);
+#define SIGUSR1       10
+#define SIG_DFL       ((sighandler_t)0)
+
+sighandler_t signal(int signum, sighandler_t handler) {
+       static sighandler_t (*real_signal)(int, sighandler_t) = NULL;
+
+       CHECKIT
+       if (! real_signal) {
+               real_signal = (sighandler_t (*)(int, sighandler_t))
+                       dlsym(RTLD_NEXT, "signal");
+       }
+
+       if (debug) fprintf(stderr, "SIGNAL: %d %p\n", signum, handler);
+
+       if (signum == SIGUSR1) {
+               if (debug) fprintf(stderr, "SIGNAL: skip SIGUSR1\n");
+               return SIG_DFL;
+       }
+       
+       return(real_signal(signum, handler));
+}
+
+int close(int fd) {
+       static int (*real_close)(int) = NULL;
+
+       CHECKIT
+       if (! real_close) {
+               real_close = (int (*)(int)) dlsym(RTLD_NEXT, "close");
+       }
+
+       if (debug) fprintf(stderr, "CLOSE: %d\n", fd);
+       if (!root) {
+               if (fd < 256) {
+                       devs[fd][0] = '\0';
+               }
+       }
+       return(real_close(fd));
+}
+
+struct stat {
+       int foo;
+};
+
+int stat(const char *path, struct stat *buf) {
+       static int (*real_stat)(const char *, struct stat *) = NULL;
+
+       CHECKIT
+       if (! real_stat) {
+               real_stat = (int (*)(const char *, struct stat *))
+                       dlsym(RTLD_NEXT, "stat");
+       }
+
+       if (debug) fprintf(stderr, "STAT: %s\n", path);
+
+       return(real_stat(path, buf));
+}
+
+int stat64(const char *path, struct stat *buf) {
+       static int (*real_stat64)(const char *, struct stat *) = NULL;
+
+       CHECKIT
+       if (! real_stat64) {
+               real_stat64 = (int (*)(const char *, struct stat *))
+                       dlsym(RTLD_NEXT, "stat64");
+       }
+
+       if (debug) fprintf(stderr, "STAT64: %s\n", path);
+
+       return(real_stat64(path, buf));
+}
+
+int chown(const char *path, uid_t owner, gid_t group) {
+       static int (*real_chown)(const char *, uid_t, gid_t) = NULL;
+
+       CHECKIT
+       if (! real_chown) {
+               real_chown = (int (*)(const char *, uid_t, gid_t))
+                       dlsym(RTLD_NEXT, "chown");
+       }
+
+       if (root) {
+               return(real_chown(path, owner, group));
+       }
+
+       if (debug) fprintf(stderr, "CHOWN: %s %d %d\n", path, owner, group);
+
+       if (strstr(path, "/dev") == path) {
+               if (debug) fprintf(stderr, "CHOWN: return 0\n");
+               return 0;
+       }
+
+       return(real_chown(path, owner, group));
+}
+
+extern int *__errno_location (void);
+#ifndef ENODEV
+#define ENODEV 19
+#endif
+
+int ioperm(unsigned long from, unsigned long num, int turn_on) {
+       static int (*real_ioperm)(unsigned long, unsigned long, int) = NULL;
+
+       CHECKIT
+       if (! real_ioperm) {
+               real_ioperm = (int (*)(unsigned long, unsigned long, int))
+                       dlsym(RTLD_NEXT, "ioperm");
+       }
+       if (debug) fprintf(stderr, "IOPERM: %d %d %d\n", (int) from, (int) num, turn_on);
+       if (root) {
+               return(real_ioperm(from, num, turn_on));
+       }
+       if (from == 0 && num == 1024 && turn_on == 1) {
+               /* we want xf86EnableIO to fail */
+               if (debug) fprintf(stderr, "IOPERM: setting ENODEV.\n");
+               *__errno_location() = ENODEV;
+               return -1;
+       }
+       return 0;
+}
+
+int iopl(int level) {
+       static int (*real_iopl)(int) = NULL;
+
+       CHECKIT
+       if (! real_iopl) {
+               real_iopl = (int (*)(int)) dlsym(RTLD_NEXT, "iopl");
+       }
+       if (debug) fprintf(stderr, "IOPL: %d\n", level);
+       if (root) {
+               return(real_iopl(level));
+       }
+       return 0;
+}
+
+#ifdef INTERPOSE_GETUID 
+
+/*
+ * we got things to work w/o pretending to be root.
+ * so we no longer interpose getuid(), etc.
+ */
+
+uid_t getuid(void) {
+       static uid_t (*real_getuid)(void) = NULL;
+       CHECKIT
+       if (! real_getuid) {
+               real_getuid = (uid_t (*)(void)) dlsym(RTLD_NEXT, "getuid");
+       }
+       if (root) {
+               return(real_getuid());
+       }
+       if (debug) fprintf(stderr, "GETUID: 0\n");
+       return 0;
+}
+uid_t geteuid(void) {
+       static uid_t (*real_geteuid)(void) = NULL;
+       CHECKIT
+       if (! real_geteuid) {
+               real_geteuid = (uid_t (*)(void)) dlsym(RTLD_NEXT, "geteuid");
+       }
+       if (root) {
+               return(real_geteuid());
+       }
+       if (debug) fprintf(stderr, "GETEUID: 0\n");
+       return 0;
+}
+uid_t geteuid_kludge1(void) {
+       static uid_t (*real_geteuid)(void) = NULL;
+       CHECKIT
+       if (! real_geteuid) {
+               real_geteuid = (uid_t (*)(void)) dlsym(RTLD_NEXT, "geteuid");
+       }
+       if (debug) fprintf(stderr, "GETEUID: 0 saw_libmodules=%d\n", saw_lib_modules);
+       if (root && !saw_lib_modules) {
+               return(real_geteuid());
+       } else {
+               saw_lib_modules = 0;
+               return 0;
+       }
+}
+
+uid_t getuid32(void) {
+       static uid_t (*real_getuid32)(void) = NULL;
+       CHECKIT
+       if (! real_getuid32) {
+               real_getuid32 = (uid_t (*)(void)) dlsym(RTLD_NEXT, "getuid32");
+       }
+       if (root) {
+               return(real_getuid32());
+       }
+       if (debug) fprintf(stderr, "GETUID32: 0\n");
+       return 0;
+}
+uid_t geteuid32(void) {
+       static uid_t (*real_geteuid32)(void) = NULL;
+       CHECKIT
+       if (! real_geteuid32) {
+               real_geteuid32 = (uid_t (*)(void)) dlsym(RTLD_NEXT, "geteuid32");
+       }
+       if (root) {
+               return(real_geteuid32());
+       }
+       if (debug) fprintf(stderr, "GETEUID32: 0\n");
+       return 0;
+}
+
+gid_t getgid(void) {
+       static gid_t (*real_getgid)(void) = NULL;
+       CHECKIT
+       if (! real_getgid) {
+               real_getgid = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getgid");
+       }
+       if (root) {
+               return(real_getgid());
+       }
+       if (debug) fprintf(stderr, "GETGID: 0\n");
+       return 0;
+}
+gid_t getegid(void) {
+       static gid_t (*real_getegid)(void) = NULL;
+       CHECKIT
+       if (! real_getegid) {
+               real_getegid = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getegid");
+       }
+       if (root) {
+               return(real_getegid());
+       }
+       if (debug) fprintf(stderr, "GETEGID: 0\n");
+       return 0;
+}
+gid_t getgid32(void) {
+       static gid_t (*real_getgid32)(void) = NULL;
+       CHECKIT
+       if (! real_getgid32) {
+               real_getgid32 = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getgid32");
+       }
+       if (root) {
+               return(real_getgid32());
+       }
+       if (debug) fprintf(stderr, "GETGID32: 0\n");
+       return 0;
+}
+gid_t getegid32(void) {
+       static gid_t (*real_getegid32)(void) = NULL;
+       CHECKIT
+       if (! real_getegid32) {
+               real_getegid32 = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getegid32");
+       }
+       if (root) {
+               return(real_getegid32());
+       }
+       if (debug) fprintf(stderr, "GETEGID32: 0\n");
+       return 0;
+}
+#endif
+
+#if 0
+/* maybe we need to interpose on strcmp someday... here is the template */
+int strcmp(const char *s1, const char *s2) {
+       static int (*real_strcmp)(const char *, const char *) = NULL;
+       CHECKIT
+       if (! real_strcmp) {
+               real_strcmp = (int (*)(const char *, const char *)) dlsym(RTLD_NEXT, "strcmp");
+       }
+       if (debug) fprintf(stderr, "STRCMP: '%s' '%s'\n", s1, s2);
+       return(real_strcmp(s1, s2));
+}
+#endif
+
+#code_end
+}
diff --git a/testcases/complete-run.pl b/testcases/complete-run.pl
new file mode 100755 (executable)
index 0000000..c05d6e5
--- /dev/null
@@ -0,0 +1,211 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+#
+# © 2010-2011 Michael Stapelberg and contributors
+#
+# syntax: ./complete-run.pl --display :1 --display :2
+# to run the test suite on the X11 displays :1 and :2
+# use 'Xdummy :1' and 'Xdummy :2' before to start two
+# headless X11 servers
+#
+
+use strict;
+use warnings;
+use EV;
+use AnyEvent;
+use IO::Scalar; # not in core :\
+use File::Temp qw(tempfile tempdir);
+use v5.10;
+use DateTime;
+use Data::Dumper;
+use Cwd qw(abs_path);
+use Proc::Background;
+use TAP::Harness;
+use TAP::Parser;
+use TAP::Parser::Aggregator;
+use File::Basename qw(basename);
+use AnyEvent::I3 qw(:all);
+use Try::Tiny;
+use Getopt::Long;
+use Time::HiRes qw(sleep);
+use X11::XCB::Connection;
+
+# install a dummy CHLD handler to overwrite the CHLD handler of AnyEvent / EV
+# XXX: we could maybe also use a different loop than the default loop in EV?
+$SIG{CHLD} = sub {
+};
+
+# reads in a whole file
+sub slurp {
+    open my $fh, '<', shift;
+    local $/;
+    <$fh>;
+}
+
+my $coverage_testing = 0;
+my @displays = ();
+
+my $result = GetOptions(
+    "coverage-testing" => \$coverage_testing,
+    "display=s" => \@displays,
+);
+
+@displays = split(/,/, join(',', @displays));
+@displays = map { s/ //g; $_ } @displays;
+
+@displays = qw(:1) if @displays == 0;
+
+# connect to all displays for two reasons:
+# 1: check if the display actually works
+# 2: keep the connection open so that i3 is not the only client. this prevents
+#    the X server from exiting (Xdummy will restart it, but not quick enough
+#    sometimes)
+my @conns;
+my @wdisplays;
+for my $display (@displays) {
+    try {
+        my $x = X11::XCB::Connection->new(display => $display);
+        push @conns, $x;
+        push @wdisplays, $display;
+    } catch {
+        say STDERR "WARNING: Not using X11 display $display, could not connect";
+    };
+}
+
+my $i3cmd = abs_path("../i3") . " -V -d all --disable-signalhandler";
+my $config = slurp('i3-test.config');
+
+# 1: get a list of all testcases
+my @testfiles = @ARGV;
+
+# if no files were passed on command line, run all tests from t/
+@testfiles = <t/*.t> if @testfiles == 0;
+
+# 2: create an output directory for this test-run
+my $outdir = "testsuite-";
+$outdir .= DateTime->now->strftime("%Y-%m-%d-%H-%M-%S-");
+$outdir .= `git describe --tags`;
+chomp($outdir);
+mkdir($outdir) or die "Could not create $outdir";
+unlink("latest") if -e "latest";
+symlink("$outdir", "latest") or die "Could not symlink latest to $outdir";
+
+# 3: run all tests
+my @done;
+my $num = @testfiles;
+my $harness = TAP::Harness->new({ });
+
+my $aggregator = TAP::Parser::Aggregator->new();
+$aggregator->start();
+
+my $cv = AnyEvent->condvar;
+
+# We start tests concurrently: For each display, one test gets started. Every
+# test starts another test after completing.
+take_job($_) for @wdisplays;
+
+#
+# Takes a test from the beginning of @testfiles and runs it.
+#
+# The TAP::Parser (which reads the test output) will get called as soon as
+# there is some activity on the stdout file descriptor of the test process
+# (using an AnyEvent->io watcher).
+#
+# When a test completes and @done contains $num entries, the $cv condvar gets
+# triggered to finish testing.
+#
+sub take_job {
+    my ($display) = @_;
+    my ($fh, $tmpfile) = tempfile();
+    say $fh $config;
+    say $fh "ipc-socket /tmp/nested-$display";
+    close($fh);
+
+    my $test = shift @testfiles;
+    return unless $test;
+    my $logpath = "$outdir/i3-log-for-" . basename($test);
+    my $cmd = "export DISPLAY=$display; exec $i3cmd -c $tmpfile >$logpath 2>&1";
+    my $dont_start = (slurp($test) =~ /# !NO_I3_INSTANCE!/);
+
+    my $process = Proc::Background->new($cmd) unless $dont_start;
+    say "[$display] Running $test with logfile $logpath";
+
+    sleep 0.5;
+    my $kill_i3 = sub {
+        # Don’t bother killing i3 when we haven’t started it
+        return if $dont_start;
+
+        # When measuring code coverage, try to exit i3 cleanly (otherwise, .gcda
+        # files are not written) and fallback to killing it
+        if ($coverage_testing) {
+            my $exited = 0;
+            try {
+                say "Exiting i3 cleanly...";
+                i3("/tmp/nested-$display")->command('exit')->recv;
+                $exited = 1;
+            };
+            return if $exited;
+        }
+
+        say "[$display] killing i3";
+        kill(9, $process->pid) or die "could not kill i3";
+    };
+
+    my $output;
+    my $parser = TAP::Parser->new({
+        exec => [ 'sh', '-c', "DISPLAY=$display /usr/bin/perl -It/lib $test" ],
+        spool => IO::Scalar->new(\$output),
+        merge => 1,
+    });
+
+    my @watchers;
+    my ($stdout, $stderr) = $parser->get_select_handles;
+    for my $handle ($parser->get_select_handles) {
+        my $w;
+        $w = AnyEvent->io(
+            fh => $handle,
+            poll => 'r',
+            cb => sub {
+                # Ignore activity on stderr (unnecessary with merge => 1,
+                # but let’s keep it in here if we want to use merge => 0
+                # for some reason in the future).
+                return if defined($stderr) and $handle == $stderr;
+
+                my $result = $parser->next;
+                if (defined($result)) {
+                    # TODO: check if we should bail out
+                    return;
+                }
+
+                # $result is not defined, we are done parsing
+                say "[$display] $test finished";
+                close($parser->delete_spool);
+                $aggregator->add($test, $parser);
+                push @done, [ $test, $output ];
+
+                $kill_i3->();
+
+                undef $_ for @watchers;
+                if (@done == $num) {
+                    $cv->send;
+                } else {
+                    take_job($display);
+                }
+            }
+        );
+        push @watchers, $w;
+    }
+}
+
+$cv->recv;
+
+$aggregator->stop();
+
+for (@done) {
+    my ($test, $output) = @$_;
+    say "output for $test:";
+    say $output;
+}
+
+# 4: print summary
+$harness->summary($aggregator);
diff --git a/testcases/i3-test.config b/testcases/i3-test.config
new file mode 100644 (file)
index 0000000..4f59205
--- /dev/null
@@ -0,0 +1,103 @@
+for_window [class="borderless"] border none
+for_window [title="special borderless title"] border none
+for_window [title="special mark title"] border none, mark bleh
+
+# ISO 10646 = Unicode
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# Use Mouse+Mod1 to drag floating windows to their wanted position
+floating_modifier Mod1
+
+# Open empty container
+bindsym Mod1+Shift+Return open
+
+# Start terminal (Mod1+Enter)
+bindsym Mod1+Return exec /usr/bin/urxvt
+
+# Start dmenu (Mod1+p)
+bindsym Mod1+p exec /usr/bin/dmenu_run
+
+# Horizontal orientation
+bindsym Mod1+h split h
+
+# Vertical orientation
+bindsym Mod1+v split v
+
+# Fullscreen (Mod1+f)
+bindsym Mod1+f fullscreen
+
+# Stacking (Mod1+s)
+bindsym Mod1+s layout stacking
+
+# Tabbed (Mod1+w)
+bindsym Mod1+w layout tabbed
+
+# Default (Mod1+l)
+bindsym Mod1+l layout default
+
+# toggle tiling / floating
+bindsym Mod1+Shift+space mode toggle
+
+bindsym Mod1+u level up
+#bindsym Mod1+d level down
+
+# Kill current client (Mod1+c)
+bindsym Mod1+c kill
+
+# Restore saved JSON layout
+bindsym Mod1+y restore /home/michael/i3/layout.json
+
+# Restart i3
+bindsym Mod1+Shift+c restart
+# Reload i3
+bindsym Mod1+Shift+j reload
+# Exit i3
+bindsym Mod1+Shift+l exit
+
+# Focus (Mod1+n/r/t/d)
+bindsym Mod1+n prev h
+bindsym Mod1+r next v
+bindsym Mod1+t prev v
+bindsym Mod1+d next h
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Left prev h
+bindsym Mod1+Right next h
+bindsym Mod1+Down next v
+bindsym Mod1+Up prev v
+
+# Move
+bindsym Mod1+Shift+n move left
+bindsym Mod1+Shift+r move down
+bindsym Mod1+Shift+t move up
+bindsym Mod1+Shift+d move right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Shift+Left move left
+bindsym Mod1+Shift+Right move right
+bindsym Mod1+Shift+Down move down
+bindsym Mod1+Shift+Up move up
+
+# Workspaces (Mod1+1/2/…)
+bindsym Mod1+1 workspace 1
+bindsym Mod1+2 workspace 2
+bindsym Mod1+3 workspace 3
+bindsym Mod1+4 workspace 4
+bindsym Mod1+5 workspace 5
+bindsym Mod1+6 workspace 6
+bindsym Mod1+7 workspace 7
+bindsym Mod1+8 workspace 8
+bindsym Mod1+9 workspace 9
+bindsym Mod1+0 workspace 10
+
+# Move to Workspaces
+bindsym Mod1+Shift+1 move workspace 1
+bindsym Mod1+Shift+2 move workspace 2
+bindsym Mod1+Shift+3 move workspace 3
+bindsym Mod1+Shift+4 move workspace 4
+bindsym Mod1+Shift+5 move workspace 5
+bindsym Mod1+Shift+6 move workspace 6
+bindsym Mod1+Shift+7 move workspace 7
+bindsym Mod1+Shift+8 move workspace 8
+bindsym Mod1+Shift+9 move workspace 9
+bindsym Mod1+Shift+0 move workspace 10
diff --git a/testcases/t/00-load.t b/testcases/t/00-load.t
new file mode 100644 (file)
index 0000000..5dfc5c6
--- /dev/null
@@ -0,0 +1,10 @@
+#!perl
+
+use Test::More tests => 2;
+
+BEGIN {
+       use_ok( 'X11::XCB::Connection' );
+       use_ok( 'X11::XCB::Window' );
+}
+
+diag( "Testing i3, Perl $], $^X" );
diff --git a/testcases/t/01-tile.t b/testcases/t/01-tile.t
new file mode 100644 (file)
index 0000000..0db3b83
--- /dev/null
@@ -0,0 +1,32 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $original_rect = X11::XCB::Rect->new(x => 0, y => 0, width => 30, height => 30);
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => $original_rect,
+    background_color => '#C0C0C0',
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+is_deeply($window->rect, $original_rect, "rect unmodified before mapping");
+
+$window->map;
+
+sleep(0.25);
+
+my $new_rect = $window->rect;
+ok(!eq_deeply($new_rect, $original_rect), "Window got repositioned");
+
+done_testing;
diff --git a/testcases/t/02-fullscreen.t b/testcases/t/02-fullscreen.t
new file mode 100644 (file)
index 0000000..34e5364
--- /dev/null
@@ -0,0 +1,170 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+use List::Util qw(first);
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+sub fullscreen_windows {
+    scalar grep { $_->{fullscreen_mode} != 0 } @{get_ws_content($tmp)}
+}
+
+# get the output of this workspace
+my $tree = $i3->get_tree->recv;
+my @outputs = @{$tree->{nodes}};
+my $output;
+for my $o (@outputs) {
+    # get the first CT_CON of each output
+    my $content = first { $_->{type} == 2 } @{$o->{nodes}};
+    if (defined(first { $_->{name} eq $tmp } @{$content->{nodes}})) {
+        $output = $o;
+        last;
+    }
+}
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+##################################
+# map a window, then fullscreen it
+##################################
+
+my $original_rect = X11::XCB::Rect->new(x => 0, y => 0, width => 30, height => 30);
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => $original_rect,
+    background_color => '#C0C0C0',
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+is_deeply($window->rect, $original_rect, "rect unmodified before mapping");
+
+$window->map;
+
+sleep 0.25;
+
+# open another container to make the window get only half of the screen
+cmd 'open';
+
+my $new_rect = $window->rect;
+ok(!eq_deeply($new_rect, $original_rect), "Window got repositioned");
+$original_rect = $new_rect;
+
+sleep 0.25;
+
+$window->fullscreen(1);
+
+sleep 0.25;
+
+$new_rect = $window->rect;
+ok(!eq_deeply($new_rect, $original_rect), "Window got repositioned after fullscreen");
+
+my $orect = $output->{rect};
+my $wrect = $new_rect;
+
+# see if the window really is fullscreen. 20 px for borders are allowed
+my $threshold = 20;
+ok(($wrect->{x} - $orect->{x}) < $threshold, 'x coordinate fullscreen');
+ok(($wrect->{y} - $orect->{y}) < $threshold, 'y coordinate fullscreen');
+ok(abs($wrect->{width} - $orect->{width}) < $threshold, 'width coordinate fullscreen');
+ok(abs($wrect->{height} - $orect->{height}) < $threshold, 'height coordinate fullscreen');
+
+
+$window->unmap;
+
+#########################################################
+# test with a window which is fullscreened before mapping
+#########################################################
+
+# open another container because the empty one will swallow the window we
+# map in a second
+cmd 'open';
+
+$original_rect = X11::XCB::Rect->new(x => 0, y => 0, width => 30, height => 30);
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => $original_rect,
+    background_color => 61440,
+);
+
+is_deeply($window->rect, $original_rect, "rect unmodified before mapping");
+
+$window->fullscreen(1);
+$window->map;
+
+sleep(0.25);
+
+$new_rect = $window->rect;
+ok(!eq_deeply($new_rect, $original_rect), "Window got repositioned after fullscreen");
+ok($window->mapped, "Window is mapped after opening it in fullscreen mode");
+
+$wrect = $new_rect;
+
+# see if the window really is fullscreen. 20 px for borders are allowed
+ok(($wrect->{x} - $orect->{x}) < $threshold, 'x coordinate fullscreen');
+ok(($wrect->{y} - $orect->{y}) < $threshold, 'y coordinate fullscreen');
+ok(abs($wrect->{width} - $orect->{width}) < $threshold, 'width coordinate fullscreen');
+ok(abs($wrect->{height} - $orect->{height}) < $threshold, 'height coordinate fullscreen');
+
+###############################################################################
+# test if setting two windows in fullscreen mode at the same time does not work
+###############################################################################
+
+$original_rect = X11::XCB::Rect->new(x => 0, y => 0, width => 30, height => 30);
+my $swindow = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => $original_rect,
+    background_color => '#C0C0C0',
+);
+
+$swindow->map;
+sleep 0.25;
+
+ok(!$swindow->mapped, 'window not mapped while fullscreen window active');
+
+$new_rect = $swindow->rect;
+ok(!eq_deeply($new_rect, $original_rect), "Window got repositioned");
+
+$swindow->fullscreen(1);
+sleep 0.25;
+
+is(fullscreen_windows(), 1, 'amount of fullscreen windows');
+
+$window->fullscreen(0);
+sleep 0.25;
+is(fullscreen_windows(), 0, 'amount of fullscreen windows');
+
+ok($swindow->mapped, 'window mapped after other fullscreen ended');
+
+###########################################################################
+# as $swindow is out of state at the moment (it requested to be fullscreen,
+# but the WM denied), we check what happens if we go out of fullscreen now
+# (nothing should happen)
+###########################################################################
+
+$swindow->fullscreen(0);
+sleep 0.25;
+
+is(fullscreen_windows(), 0, 'amount of fullscreen windows after disabling');
+
+cmd 'fullscreen';
+
+is(fullscreen_windows(), 1, 'amount of fullscreen windows after fullscreen command');
+
+cmd 'fullscreen';
+
+is(fullscreen_windows(), 0, 'amount of fullscreen windows after fullscreen command');
+
+# clean up the workspace so that it will be cleaned when switching away
+cmd 'kill' for (@{get_ws_content($tmp)});
+
+done_testing;
diff --git a/testcases/t/03-unmanaged.t b/testcases/t/03-unmanaged.t
new file mode 100644 (file)
index 0000000..1ef934e
--- /dev/null
@@ -0,0 +1,33 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $original_rect = X11::XCB::Rect->new(x => 0, y => 0, width => 30, height => 30);
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => $original_rect,
+    override_redirect => 1,
+    background_color => '#C0C0C0',
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+is_deeply($window->rect, $original_rect, "rect unmodified before mapping");
+
+$window->map;
+
+my $new_rect = $window->rect;
+isa_ok($new_rect, 'X11::XCB::Rect');
+
+is_deeply($new_rect, $original_rect, "window untouched");
+
+done_testing;
diff --git a/testcases/t/04-floating.t b/testcases/t/04-floating.t
new file mode 100644 (file)
index 0000000..d4aea82
--- /dev/null
@@ -0,0 +1,63 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+# Create a floating window which is smaller than the minimum enforced size of i3
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+my ($absolute, $top) = $window->rect;
+
+ok($window->mapped, 'Window is mapped');
+cmp_ok($absolute->{width}, '>=', 75, 'i3 raised the width to 75');
+cmp_ok($absolute->{height}, '>=', 50, 'i3 raised the height to 50');
+
+ok($absolute->{x} != 0 && $absolute->{y} != 0, 'i3 did not map it to (0x0)');
+
+$window->unmap;
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 1, 1, 80, 90],
+    background_color => '#C0C0C0',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+($absolute, $top) = $window->rect;
+
+cmp_ok($absolute->{width}, '==', 80, "i3 let the width at 80");
+cmp_ok($absolute->{height}, '==', 92, "i3 let the height at 90");
+
+# We need to compare the position with decorations due to the way
+# we do decoration rendering (on the parent frame) in the tree branch
+cmp_ok($top->{x}, '==', 1, 'i3 mapped it to x=1');
+cmp_ok($top->{y}, '==', 19, 'i3 mapped it to y=18');
+
+$window->unmap;
+
+done_testing;
diff --git a/testcases/t/05-ipc.t b/testcases/t/05-ipc.t
new file mode 100644 (file)
index 0000000..a910c93
--- /dev/null
@@ -0,0 +1,34 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+
+fresh_workspace;
+
+#####################################################################
+# Ensure IPC works by switching workspaces
+#####################################################################
+
+# Create a window so we can get a focus different from NULL
+my $window = open_standard_window($x);
+diag("window->id = " . $window->id);
+
+sleep 0.25;
+
+my $focus = $x->input_focus;
+diag("old focus = $focus");
+
+# Switch to another workspace
+fresh_workspace;
+
+my $new_focus = $x->input_focus;
+isnt($focus, $new_focus, "Focus changed");
+
+done_testing;
diff --git a/testcases/t/06-focus.t b/testcases/t/06-focus.t
new file mode 100644 (file)
index 0000000..d357c8a
--- /dev/null
@@ -0,0 +1,107 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $i3 = i3(get_socket_path());
+my $tmp = fresh_workspace;
+
+#####################################################################
+# Create two windows and make sure focus switching works
+#####################################################################
+
+# Change mode of the container to "default" for following tests
+cmd 'layout default';
+cmd 'split v';
+
+my $top = open_standard_window($x);
+my $mid = open_standard_window($x);
+my $bottom = open_standard_window($x);
+sleep 0.25;
+
+diag("top id = " . $top->id);
+diag("mid id = " . $mid->id);
+diag("bottom id = " . $bottom->id);
+
+#
+# Returns the input focus after sending the given command to i3 via IPC
+# end sleeping for half a second to make sure i3 reacted
+#
+sub focus_after {
+    my $msg = shift;
+
+    $i3->command($msg)->recv;
+    return $x->input_focus;
+}
+
+$focus = $x->input_focus;
+is($focus, $bottom->id, "Latest window focused");
+
+$focus = focus_after('focus up');
+is($focus, $mid->id, "Middle window focused");
+
+$focus = focus_after('focus up');
+is($focus, $top->id, "Top window focused");
+
+#####################################################################
+# Test focus wrapping
+#####################################################################
+
+$focus = focus_after('focus up');
+is($focus, $bottom->id, "Bottom window focused (wrapping to the top works)");
+
+$focus = focus_after('focus down');
+is($focus, $top->id, "Top window focused (wrapping to the bottom works)");
+
+###############################################
+# Test focus with empty containers and colspan
+###############################################
+
+#my $otmp = get_unused_workspace();
+#$i3->command("workspace $otmp")->recv;
+#
+#$top = i3test::open_standard_window($x);
+#$bottom = i3test::open_standard_window($x);
+#sleep 0.25;
+#
+#$focus = focus_after("mj");
+#$focus = focus_after("mh");
+#$focus = focus_after("k");
+#is($focus, $bottom->id, "Selecting top window without snapping doesn't work");
+#
+#$focus = focus_after("sl");
+#is($focus, $bottom->id, "Bottom window focused");
+#
+#$focus = focus_after("k");
+#is($focus, $top->id, "Top window focused");
+#
+## Same thing, but left/right instead of top/bottom
+#
+#my $o2tmp = get_unused_workspace();
+#$i3->command("workspace $o2tmp")->recv;
+#
+#my $left = i3test::open_standard_window($x);
+#my $right = i3test::open_standard_window($x);
+#sleep 0.25;
+#
+#$focus = focus_after("ml");
+#$focus = focus_after("h");
+#$focus = focus_after("mk");
+#$focus = focus_after("l");
+#is($focus, $left->id, "Selecting right window without snapping doesn't work");
+#
+#$focus = focus_after("sj");
+#is($focus, $left->id, "left window focused");
+#
+#$focus = focus_after("l");
+#is($focus, $right->id, "right window focused");
+
+
+done_testing;
diff --git a/testcases/t/07-move.t b/testcases/t/07-move.t
new file mode 100644 (file)
index 0000000..6e35ebe
--- /dev/null
@@ -0,0 +1,82 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Beware that this test uses workspace 9 to perform some tests (it expects
+# the workspace to be empty).
+# TODO: skip it by default?
+
+use i3test tests => 8;
+use X11::XCB qw(:all);
+use Time::HiRes qw(sleep);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+SKIP: {
+    skip "Testcase not yet modified for new move concept", 7;
+
+my $x = X11::XCB::Connection->new;
+
+my $i3 = i3;
+
+# Switch to the nineth workspace
+$i3->command('9')->recv;
+
+#####################################################################
+# Create two windows and make sure focus switching works
+#####################################################################
+
+my $top = i3test::open_standard_window($x);
+sleep(0.25);
+my $mid = i3test::open_standard_window($x);
+sleep(0.25);
+my $bottom = i3test::open_standard_window($x);
+sleep(0.25);
+
+diag("top id = " . $top->id);
+diag("mid id = " . $mid->id);
+diag("bottom id = " . $bottom->id);
+
+#
+# Returns the input focus after sending the given command to i3 via IPC
+# end sleeping for half a second to make sure i3 reacted
+#
+sub focus_after {
+    my $msg = shift;
+
+    $i3->command($msg)->recv;
+    return $x->input_focus;
+}
+
+$focus = $x->input_focus;
+is($focus, $bottom->id, "Latest window focused");
+
+$focus = focus_after("ml");
+is($focus, $bottom->id, "Right window still focused");
+
+$focus = focus_after("h");
+is($focus, $mid->id, "Middle window focused");
+
+#####################################################################
+# Now move to the top window, move right, then move left again
+# (e.g., does i3 remember the focus in the last container?)
+#####################################################################
+
+$focus = focus_after("k");
+is($focus, $top->id, "Top window focused");
+
+$focus = focus_after("l");
+is($focus, $bottom->id, "Right window focused");
+
+$focus = focus_after("h");
+is($focus, $top->id, "Top window focused");
+
+#####################################################################
+# Move window cross-workspace
+#####################################################################
+
+for my $cmd (qw(m12 t m13 12 13)) {
+    $i3->command($cmd)->recv;
+}
+ok(1, "Still living");
+}
diff --git a/testcases/t/08-focus-stack.t b/testcases/t/08-focus-stack.t
new file mode 100644 (file)
index 0000000..f814397
--- /dev/null
@@ -0,0 +1,49 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Checks if the focus is correctly restored, when creating a floating client
+# over an unfocused tiling client and destroying the floating one again.
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window') or BAIL_OUT('Could not load X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $i3 = i3(get_socket_path());
+fresh_workspace;
+
+cmd 'split h';
+my $tiled_left = open_standard_window($x);
+my $tiled_right = open_standard_window($x);
+
+sleep 0.25;
+
+# Get input focus before creating the floating window
+my $focus = $x->input_focus;
+
+# Create a floating window which is smaller than the minimum enforced size of i3
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 1, 1, 30, 30],
+    background_color => '#C0C0C0',
+    type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 1;
+sleep 0.25;
+is($x->input_focus, $window->id, 'floating window focused');
+
+$window->unmap;
+
+sleep 0.25;
+
+is($x->input_focus, $focus, 'Focus correctly restored');
+
+done_testing;
diff --git a/testcases/t/09-stacking.t b/testcases/t/09-stacking.t
new file mode 100644 (file)
index 0000000..1cb205e
--- /dev/null
@@ -0,0 +1,132 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Beware that this test uses workspace 9 to perform some tests (it expects
+# the workspace to be empty).
+# TODO: skip it by default?
+
+use i3test tests => 22;
+use X11::XCB qw(:all);
+use Time::HiRes qw(sleep);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+SKIP: {
+    skip "stacking test not yet updated", 21;
+
+my $x = X11::XCB::Connection->new;
+
+my $i3 = i3;
+
+# Switch to the nineth workspace
+$i3->command('9')->recv;
+
+#####################################################################
+# Create two windows and make sure focus switching works
+#####################################################################
+
+my $top = i3test::open_standard_window($x);
+sleep(0.25);
+my $mid = i3test::open_standard_window($x);
+sleep(0.25);
+my $bottom = i3test::open_standard_window($x);
+sleep(0.25);
+
+diag("top id = " . $top->id);
+diag("mid id = " . $mid->id);
+diag("bottom id = " . $bottom->id);
+
+#
+# Returns the input focus after sending the given command to i3 via IPC
+# end sleeping for half a second to make sure i3 reacted
+#
+sub focus_after {
+    my $msg = shift;
+
+    $i3->command($msg)->recv;
+    return $x->input_focus;
+}
+
+$focus = $x->input_focus;
+is($focus, $bottom->id, "Latest window focused");
+
+$focus = focus_after("s");
+is($focus, $bottom->id, "Last window still focused");
+
+$focus = focus_after("k");
+is($focus, $mid->id, "Middle window focused");
+
+$focus = focus_after("k");
+is($focus, $top->id, "Top window focused");
+
+#####################################################################
+# Test focus wrapping
+#####################################################################
+
+$focus = focus_after("k");
+is($focus, $bottom->id, "Bottom window focused (wrapping to the top works)");
+
+$focus = focus_after("j");
+is($focus, $top->id, "Top window focused (wrapping to the bottom works)");
+
+#####################################################################
+# Restore of focus after moving windows out/into the stack
+#####################################################################
+
+$focus = focus_after("ml");
+is($focus, $top->id, "Top window still focused (focus after moving)");
+
+$focus = focus_after("h");
+is($focus, $bottom->id, "Bottom window focused (focus after moving)");
+
+my $new = i3test::open_standard_window($x);
+sleep(0.25);
+
+# By now, we have this layout:
+# ----------------
+# | mid    |
+# | bottom | top
+# | new    |
+# ----------------
+
+$focus = focus_after("l");
+is($focus, $top->id, "Got top window");
+
+$focus = focus_after("mh");
+is($focus, $top->id, "Moved it into the stack");
+
+$focus = focus_after("k");
+is($focus, $new->id, "Window above is new");
+
+$focus = focus_after("k");
+is($focus, $bottom->id, "Window above is bottom");
+
+$focus = focus_after("k");
+is($focus, $mid->id, "Window above is mid");
+
+$focus = focus_after("k");
+is($focus, $top->id, "At top again");
+
+$focus = focus_after("ml");
+is($focus, $top->id, "Still at top, moved out");
+
+$focus = focus_after("h");
+is($focus, $mid->id, "At mid again");
+
+$focus = focus_after("j");
+is($focus, $bottom->id, "At bottom again");
+
+$focus = focus_after("l");
+is($focus, $top->id, "At top again");
+
+$focus = focus_after("mh");
+is($focus, $top->id, "Still at top, moved into");
+
+$focus = focus_after("k");
+is($focus, $bottom->id, "Window above is bottom");
+
+$focus = focus_after("k");
+is($focus, $mid->id, "Window above is mid");
+
+}
diff --git a/testcases/t/10-dock.t b/testcases/t/10-dock.t
new file mode 100644 (file)
index 0000000..d4da824
--- /dev/null
@@ -0,0 +1,192 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+use List::Util qw(first);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+#####################################################################
+# verify that there is no dock window yet
+#####################################################################
+
+# Children of all dockareas
+my @docked = get_dock_clients;
+is(@docked, 0, 'no dock clients yet');
+
+#####################################################################
+# Create a dock window and see if it gets managed
+#####################################################################
+
+my $screens = $x->screens;
+
+# Get the primary screen
+my $primary = first { $_->primary } @{$screens};
+
+# TODO: focus the primary screen before
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->map;
+
+sleep 0.25;
+
+my $rect = $window->rect;
+is($rect->width, $primary->rect->width, 'dock client is as wide as the screen');
+is($rect->height, 30, 'height is unchanged');
+
+#####################################################################
+# check that we can find it in the layout tree at the expected position
+#####################################################################
+
+@docked = get_dock_clients('top');
+is(@docked, 1, 'one dock client found');
+
+# verify the position/size
+my $docknode = $docked[0];
+
+is($docknode->{rect}->{x}, 0, 'dock node placed at x=0');
+is($docknode->{rect}->{y}, 0, 'dock node placed at y=0');
+is($docknode->{rect}->{width}, $primary->rect->width, 'dock node as wide as the screen');
+is($docknode->{rect}->{height}, 30, 'dock node has unchanged height');
+
+$window->destroy;
+
+sleep 0.25;
+
+@docked = get_dock_clients();
+is(@docked, 0, 'no more dock clients');
+
+#####################################################################
+# check if it gets placed on bottom (by coordinates)
+#####################################################################
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 1000, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->map;
+
+sleep 0.25;
+
+my $rect = $window->rect;
+is($rect->width, $primary->rect->width, 'dock client is as wide as the screen');
+is($rect->height, 30, 'height is unchanged');
+
+@docked = get_dock_clients('bottom');
+is(@docked, 1, 'dock client on bottom');
+
+$window->destroy;
+
+sleep 0.25;
+
+@docked = get_dock_clients();
+is(@docked, 0, 'no more dock clients');
+
+#####################################################################
+# check if it gets placed on bottom (by hint)
+#####################################################################
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 1000, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->_create();
+
+# Add a _NET_WM_STRUT_PARTIAL hint
+my $atomname = $x->atom(name => '_NET_WM_STRUT_PARTIAL');
+my $atomtype = $x->atom(name => 'CARDINAL');
+
+$x->change_property(
+    PROP_MODE_REPLACE,
+    $window->id,
+    $atomname->id,
+    $atomtype->id,
+    32,         # 32 bit integer
+    12,
+    pack('L12', 0, 0, 16, 0, 0, 0, 0, 0, 0, 1280, 0, 0)
+);
+
+$window->map;
+
+sleep 0.25;
+
+@docked = get_dock_clients('top');
+is(@docked, 1, 'dock client on top');
+
+$window->destroy;
+
+sleep 0.25;
+
+@docked = get_dock_clients();
+is(@docked, 0, 'no more dock clients');
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 1000, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->_create();
+
+# Add a _NET_WM_STRUT_PARTIAL hint
+my $atomname = $x->atom(name => '_NET_WM_STRUT_PARTIAL');
+my $atomtype = $x->atom(name => 'CARDINAL');
+
+$x->change_property(
+    PROP_MODE_REPLACE,
+    $window->id,
+    $atomname->id,
+    $atomtype->id,
+    32,         # 32 bit integer
+    12,
+    pack('L12', 0, 0, 0, 16, 0, 0, 0, 0, 0, 1280, 0, 0)
+);
+
+$window->map;
+
+sleep 0.25;
+
+@docked = get_dock_clients('bottom');
+is(@docked, 1, 'dock client on bottom');
+
+$window->destroy;
+
+
+#####################################################################
+# regression test: transient dock client
+#####################################################################
+
+my $fwindow = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$fwindow->transient_for($window);
+$fwindow->map;
+
+sleep 0.25;
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/11-goto.t b/testcases/t/11-goto.t
new file mode 100644 (file)
index 0000000..542dc82
--- /dev/null
@@ -0,0 +1,89 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+use Digest::SHA1 qw(sha1_base64);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $i3 = i3(get_socket_path());
+my $tmp = fresh_workspace;
+
+cmd 'split h';
+
+#####################################################################
+# Create two windows and make sure focus switching works
+#####################################################################
+
+my $top = open_standard_window($x);
+sleep 0.25;
+my $mid = open_standard_window($x);
+sleep 0.25;
+my $bottom = open_standard_window($x);
+sleep 0.25;
+
+diag("top id = " . $top->id);
+diag("mid id = " . $mid->id);
+diag("bottom id = " . $bottom->id);
+
+#
+# Returns the input focus after sending the given command to i3 via IPC
+# end sleeping for half a second to make sure i3 reacted
+#
+sub focus_after {
+    my $msg = shift;
+
+    cmd $msg;
+    return $x->input_focus;
+}
+
+$focus = $x->input_focus;
+is($focus, $bottom->id, "Latest window focused");
+
+$focus = focus_after('focus left');
+is($focus, $mid->id, "Middle window focused");
+
+#####################################################################
+# Now goto a mark which does not exist
+#####################################################################
+
+my $random_mark = sha1_base64(rand());
+
+$focus = focus_after(qq|[con_mark="$random_mark"] focus|);
+is($focus, $mid->id, "focus unchanged");
+
+$i3->command("mark $random_mark")->recv;
+
+$focus = focus_after('focus left');
+is($focus, $top->id, "Top window focused");
+
+$focus = focus_after(qq|[con_mark="$random_mark"] focus|);
+is($focus, $mid->id, "goto worked");
+
+# check that we can specify multiple criteria
+
+$focus = focus_after('focus left');
+is($focus, $top->id, "Top window focused");
+
+$focus = focus_after(qq|[con_mark="$random_mark" con_mark="$random_mark"] focus|);
+is($focus, $mid->id, "goto worked");
+
+#####################################################################
+# Check whether the focus command will switch to a different
+# workspace if necessary
+#####################################################################
+
+my $tmp2 = fresh_workspace;
+
+is(focused_ws(), $tmp2, 'tmp2 now focused');
+
+cmd qq|[con_mark="$random_mark"] focus|;
+
+is(focused_ws(), $tmp, 'tmp now focused');
+
+done_testing;
diff --git a/testcases/t/12-floating-resize.t b/testcases/t/12-floating-resize.t
new file mode 100644 (file)
index 0000000..09297df
--- /dev/null
@@ -0,0 +1,76 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Beware that this test uses workspace 9 to perform some tests (it expects
+# the workspace to be empty).
+# TODO: skip it by default?
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+
+fresh_workspace;
+
+#####################################################################
+# Create a floating window and see if resizing works
+#####################################################################
+
+# Create a floating window
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+sleep 0.25;
+
+# See if configurerequests cause window movements (they should not)
+my ($a, $t) = $window->rect;
+$window->rect(X11::XCB::Rect->new(x => $a->x, y => $a->y, width => $a->width, height => $a->height));
+
+sleep 0.25;
+my ($na, $nt) = $window->rect;
+is_deeply($na, $a, 'Rects are equal after configurerequest');
+
+sub test_resize {
+    $window->rect(X11::XCB::Rect->new(x => 0, y => 0, width => 100, height => 100));
+
+    my ($absolute, $top) = $window->rect;
+
+    # Make sure the width/height are different from what we’re gonna test, so
+    # that the test will work.
+    isnt($absolute->width, 300, 'width != 300');
+    isnt($absolute->height, 500, 'height != 500');
+
+    $window->rect(X11::XCB::Rect->new(x => 0, y => 0, width => 300, height => 500));
+    sleep 0.25;
+
+    ($absolute, $top) = $window->rect;
+
+    is($absolute->width, 300, 'width = 300');
+    is($absolute->height, 500, 'height = 500');
+}
+
+# Test with default border
+test_resize;
+
+# Test borderless
+cmd 'border none';
+
+test_resize;
+
+# Test with 1-px-border
+cmd 'border 1pixel';
+
+test_resize;
+
+done_testing;
diff --git a/testcases/t/13-urgent.t b/testcases/t/13-urgent.t
new file mode 100644 (file)
index 0000000..f40b72f
--- /dev/null
@@ -0,0 +1,75 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+use List::Util qw(first);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# Create two windows and put them in stacking mode
+#####################################################################
+
+cmd 'split v';
+
+my $top = open_standard_window($x);
+my $bottom = open_standard_window($x);
+
+my @urgent = grep { $_->{urgent} } @{get_ws_content($tmp)};
+is(@urgent, 0, 'no window got the urgent flag');
+
+# cmd 'layout stacking';
+
+#####################################################################
+# Add the urgency hint, switch to a different workspace and back again
+#####################################################################
+$top->add_hint('urgency');
+sleep 0.5;
+
+@content = @{get_ws_content($tmp)};
+@urgent = grep { $_->{urgent} } @content;
+$top_info = first { $_->{window} == $top->id } @content;
+$bottom_info = first { $_->{window} == $bottom->id } @content;
+
+ok($top_info->{urgent}, 'top window is marked urgent');
+ok(!$bottom_info->{urgent}, 'bottom window is not marked urgent');
+is(@urgent, 1, 'exactly one window got the urgent flag');
+
+cmd '[id="' . $top->id . '"] focus';
+
+@urgent = grep { $_->{urgent} } @{get_ws_content($tmp)};
+is(@urgent, 0, 'no window got the urgent flag after focusing');
+
+$top->add_hint('urgency');
+sleep 0.5;
+
+@urgent = grep { $_->{urgent} } @{get_ws_content($tmp)};
+is(@urgent, 0, 'no window got the urgent flag after re-setting urgency hint');
+
+#####################################################################
+# Check if the workspace urgency hint gets set/cleared correctly
+#####################################################################
+my $ws = get_ws($tmp);
+ok(!$ws->{urgent}, 'urgent flag not set on workspace');
+
+my $otmp = fresh_workspace;
+
+$top->add_hint('urgency');
+sleep 0.5;
+
+$ws = get_ws($tmp);
+ok($ws->{urgent}, 'urgent flag set on workspace');
+
+cmd "workspace $tmp";
+
+$ws = get_ws($tmp);
+ok(!$ws->{urgent}, 'urgent flag not set on workspace after switching');
+
+done_testing;
diff --git a/testcases/t/14-client-leader.t b/testcases/t/14-client-leader.t
new file mode 100644 (file)
index 0000000..98978eb
--- /dev/null
@@ -0,0 +1,141 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Connection') or BAIL_OUT('Cannot load X11::XCB::Connection');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+####################################################################################
+# first part: test if a floating window will be correctly positioned above its leader
+#
+# This is verified by opening two windows, then opening a floating window above the
+# right one, then above the left one. If the floating windows are all positioned alike,
+# one of both (depending on your screen resolution) will be positioned wrong.
+####################################################################################
+
+my $left = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [0, 0, 30, 30],
+    background_color => '#FF0000',
+);
+
+$left->name('Left');
+$left->map;
+
+my $right = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [0, 0, 30, 30],
+    background_color => '#FF0000',
+);
+
+$right->name('Right');
+$right->map;
+
+sleep 0.25;
+
+my ($abs, $rgeom) = $right->rect;
+
+my $child = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#C0C0C0',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+$child->name('Child window');
+$child->client_leader($right);
+$child->map;
+
+sleep 0.25;
+
+my $cgeom;
+($abs, $cgeom) = $child->rect;
+cmp_ok($cgeom->x, '>=', $rgeom->x, 'Child X >= right container X');
+
+my $child2 = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#C0C0C0',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+$child2->name('Child window 2');
+$child2->client_leader($left);
+$child2->map;
+
+sleep 0.25;
+
+($abs, $cgeom) = $child2->rect;
+cmp_ok(($cgeom->x + $cgeom->width), '<', $rgeom->x, 'child above left window');
+
+# check wm_transient_for
+
+
+my $fwindow = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+);
+
+$fwindow->transient_for($right);
+$fwindow->map;
+
+sleep 0.25;
+
+my ($absolute, $top) = $fwindow->rect;
+ok($absolute->{x} != 0 && $absolute->{y} != 0, 'i3 did not map it to (0x0)');
+
+SKIP: {
+    skip "(workspace placement by client_leader not yet implemented)", 3;
+
+#####################################################################
+# Create a parent window
+#####################################################################
+
+my $window = $x->root->create_child(
+class => WINDOW_CLASS_INPUT_OUTPUT,
+rect => [ 0, 0, 30, 30 ],
+background_color => '#C0C0C0',
+);
+
+$window->name('Parent window');
+$window->map;
+
+sleep 0.25;
+
+#########################################################################
+# Switch to a different workspace and open a child window. It should be opened
+# on the old workspace.
+#########################################################################
+fresh_workspace;
+
+my $child = $x->root->create_child(
+class => WINDOW_CLASS_INPUT_OUTPUT,
+rect => [ 0, 0, 30, 30 ],
+background_color => '#C0C0C0',
+);
+
+$child->name('Child window');
+$child->client_leader($window);
+$child->map;
+
+sleep 0.25;
+
+isnt($x->input_focus, $child->id, "Child window focused");
+
+# Switch back
+cmd "workspace $tmp";
+
+is($x->input_focus, $child->id, "Child window focused");
+
+}
+
+done_testing;
diff --git a/testcases/t/15-ipc-workspaces.t b/testcases/t/15-ipc-workspaces.t
new file mode 100644 (file)
index 0000000..085163b
--- /dev/null
@@ -0,0 +1,25 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use List::MoreUtils qw(all);
+
+my $i3 = i3(get_socket_path());
+
+####################
+# Request workspaces
+####################
+
+SKIP: {
+    skip "IPC API not yet stabilized", 2;
+
+my $workspaces = $i3->get_workspaces->recv;
+
+ok(@{$workspaces} > 0, "More than zero workspaces found");
+
+my $name_exists = all { defined($_->{name}) } @{$workspaces};
+ok($name_exists, "All workspaces have a name");
+
+}
+
+done_testing;
diff --git a/testcases/t/16-nestedcons.t b/testcases/t/16-nestedcons.t
new file mode 100644 (file)
index 0000000..f9d2726
--- /dev/null
@@ -0,0 +1,68 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use List::MoreUtils qw(all none);
+use List::Util qw(first);
+
+my $i3 = i3(get_socket_path());
+
+####################
+# Request tree
+####################
+
+my $tree = $i3->get_tree->recv;
+
+my $expected = {
+    fullscreen_mode => 0,
+    nodes => ignore(),
+    window => undef,
+    name => 'root',
+    orientation => ignore(),
+    type => 0,
+    id => ignore(),
+    rect => ignore(),
+    window_rect => ignore(),
+    geometry => ignore(),
+    swallows => ignore(),
+    percent => undef,
+    layout => 'default',
+    focus => ignore(),
+    focused => JSON::XS::false,
+    urgent => JSON::XS::false,
+    border => 'normal',
+    'floating_nodes' => ignore(),
+};
+
+cmp_deeply($tree, $expected, 'root node OK');
+
+my @nodes = @{$tree->{nodes}};
+
+ok(@nodes > 0, 'root node has at least one leaf');
+
+ok((all { $_->{type} == 1 } @nodes), 'all nodes are of type CT_OUTPUT');
+ok((none { defined($_->{window}) } @nodes), 'no CT_OUTPUT contains a window');
+ok((all { @{$_->{nodes}} > 0 } @nodes), 'all nodes have at least one leaf (workspace)');
+my @workspaces;
+for my $ws (@nodes) {
+    my $content = first { $_->{type} == 2 } @{$ws->{nodes}};
+    @workspaces = (@workspaces, @{$content->{nodes}});
+}
+
+ok((all { $_->{type} == 4 } @workspaces), 'all workspaces are of type CT_WORKSPACE');
+#ok((all { @{$_->{nodes}} == 0 } @workspaces), 'all workspaces are empty yet');
+ok((none { defined($_->{window}) } @workspaces), 'no CT_OUTPUT contains a window');
+
+# TODO: get the focused container
+
+$i3->command('open')->recv;
+
+# TODO: get the focused container, check if it changed.
+# TODO: get the old focused container, check if there is a new child
+
+#diag(Dumper(\@workspaces));
+
+#diag(Dumper($tree));
+
+
+done_testing;
diff --git a/testcases/t/17-workspace.t b/testcases/t/17-workspace.t
new file mode 100644 (file)
index 0000000..19e2df3
--- /dev/null
@@ -0,0 +1,101 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests whether we can switch to a non-existant workspace
+# (necessary for further tests)
+#
+use List::Util qw(first);
+use i3test;
+
+# to ensure that workspace 1 stays open
+cmd 'open';
+
+my $tmp = fresh_workspace;
+ok(workspace_exists($tmp), 'workspace created');
+# if the workspace could not be created, we cannot run any other test
+# (every test starts by creating its workspace)
+if (!workspace_exists($tmp)) {
+    BAIL_OUT('Cannot create workspace, further tests make no sense');
+}
+
+my $otmp = fresh_workspace;
+diag("Other temporary workspace name: $otmp\n");
+
+# As the old workspace was empty, it should get
+# cleaned up as we switch away from it
+cmd "workspace $otmp";
+ok(!workspace_exists($tmp), 'old workspace cleaned up');
+
+# Switch to the same workspace again to make sure it doesn’t get cleaned up
+cmd "workspace $otmp";
+cmd "workspace $otmp";
+ok(workspace_exists($otmp), 'other workspace still exists');
+
+
+#####################################################################
+# check if the workspace next / prev commands work
+#####################################################################
+
+cmd 'workspace next';
+
+ok(!workspace_exists('next'), 'workspace "next" does not exist');
+
+cmd "workspace $tmp";
+cmd 'open';
+
+ok(workspace_exists($tmp), 'workspace created');
+
+cmd "workspace $otmp";
+cmd 'open';
+
+ok(workspace_exists($tmp), 'workspace tmp still exists');
+ok(workspace_exists($otmp), 'workspace otmp created');
+
+is(focused_ws(), $otmp, 'focused workspace is otmp');
+
+cmd 'workspace prev';
+is(focused_ws(), $tmp, 'focused workspace is tmp after workspace prev');
+
+cmd 'workspace next';
+is(focused_ws(), $otmp, 'focused workspace is otmp after workspace next');
+
+
+#####################################################################
+# check that wrapping works
+#####################################################################
+
+cmd 'workspace next';
+is(focused_ws(), '1', 'focused workspace is 1 after workspace next');
+
+cmd 'workspace next';
+is(focused_ws(), $tmp, 'focused workspace is tmp after workspace next');
+
+cmd 'workspace next';
+is(focused_ws(), $otmp, 'focused workspace is otmp after workspace next');
+
+
+cmd 'workspace prev';
+is(focused_ws(), $tmp, 'focused workspace is tmp after workspace prev');
+
+cmd 'workspace prev';
+is(focused_ws(), '1', 'focused workspace is tmp after workspace prev');
+
+cmd 'workspace prev';
+is(focused_ws(), $otmp, 'focused workspace is otmp after workspace prev');
+
+
+#####################################################################
+# check if we can change to "next" / "prev"
+#####################################################################
+
+cmd 'workspace "next"';
+
+ok(workspace_exists('next'), 'workspace "next" exists');
+is(focused_ws(), 'next', 'now on workspace next');
+
+cmd 'workspace "prev"';
+
+ok(workspace_exists('prev'), 'workspace "prev" exists');
+is(focused_ws(), 'prev', 'now on workspace prev');
+
+done_testing;
diff --git a/testcases/t/18-openkill.t b/testcases/t/18-openkill.t
new file mode 100644 (file)
index 0000000..e2a729c
--- /dev/null
@@ -0,0 +1,40 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests whether opening an empty container and killing it again works
+#
+use List::Util qw(first);
+use i3test;
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+# Open a new container
+cmd 'open';
+
+ok(@{get_ws_content($tmp)} == 1, 'container opened');
+
+cmd 'kill';
+ok(@{get_ws_content($tmp)} == 0, 'container killed');
+
+##############################################################
+# open two containers and kill the one which is not focused
+# by its ID to test if the parser correctly matches the window
+##############################################################
+
+cmd 'open';
+cmd 'open';
+ok(@{get_ws_content($tmp)} == 2, 'two containers opened');
+
+my $content = get_ws_content($tmp);
+my $not_focused = first { !$_->{focused} } @{$content};
+my $id = $not_focused->{id};
+
+cmd "[con_id=\"$id\"] kill";
+
+$content = get_ws_content($tmp);
+ok(@{$content} == 1, 'one container killed');
+ok($content->[0]->{id} != $id, 'correct window killed');
+
+done_testing;
diff --git a/testcases/t/19-match.t b/testcases/t/19-match.t
new file mode 100644 (file)
index 0000000..2332bc7
--- /dev/null
@@ -0,0 +1,121 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests all kinds of matching methods
+#
+use i3test;
+use X11::XCB qw(:all);
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+# Open a new window
+my $x = X11::XCB::Connection->new;
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#C0C0C0',
+);
+
+$window->map;
+# give it some time to be picked up by the window manager
+# TODO: better check for $window->mapped or something like that?
+# maybe we can even wait for getting mapped?
+my $c = 0;
+while (@{get_ws_content($tmp)} == 0 and $c++ < 5) {
+    sleep 0.25;
+}
+my $content = get_ws_content($tmp);
+ok(@{$content} == 1, 'window mapped');
+my $win = $content->[0];
+
+######################################################################
+# first test that matches which should not match this window really do
+# not match it
+######################################################################
+# TODO: use PCRE expressions
+# TODO: specify more match types
+cmd q|[class="*"] kill|;
+cmd q|[con_id="99999"] kill|;
+
+$content = get_ws_content($tmp);
+ok(@{$content} == 1, 'window still there');
+
+# now kill the window
+cmd 'nop now killing the window';
+my $id = $win->{id};
+cmd qq|[con_id="$id"] kill|;
+
+# give i3 some time to pick up the UnmapNotify event
+sleep 0.25;
+
+cmd 'nop checking if its gone';
+$content = get_ws_content($tmp);
+ok(@{$content} == 0, 'window killed');
+
+# TODO: same test, but with pcre expressions
+
+######################################################################
+# check that multiple criteria work are checked with a logical AND,
+# not a logical OR (that is, matching is not cancelled after the first
+# criterion matches).
+######################################################################
+
+$tmp = fresh_workspace;
+
+# TODO: move to X11::XCB
+sub set_wm_class {
+    my ($id, $class, $instance) = @_;
+
+    # Add a _NET_WM_STRUT_PARTIAL hint
+    my $atomname = $x->atom(name => 'WM_CLASS');
+    my $atomtype = $x->atom(name => 'STRING');
+
+    $x->change_property(
+        PROP_MODE_REPLACE,
+        $id,
+        $atomname->id,
+        $atomtype->id,
+        8,
+        length($class) + length($instance) + 2,
+        "$instance\x00$class\x00"
+    );
+}
+
+my $left = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#0000ff',
+);
+
+$left->_create;
+set_wm_class($left->id, 'special', 'special');
+$left->name('left');
+$left->map;
+sleep 0.25;
+
+my $right = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#0000ff',
+);
+
+$right->_create;
+set_wm_class($right->id, 'special', 'special');
+$right->name('right');
+$right->map;
+sleep 0.25;
+
+# two windows should be here
+$content = get_ws_content($tmp);
+ok(@{$content} == 2, 'two windows opened');
+
+cmd '[class="special" title="left"] kill';
+
+sleep 0.25;
+
+$content = get_ws_content($tmp);
+is(@{$content}, 1, 'one window still there');
+
+done_testing;
diff --git a/testcases/t/20-multiple-cmds.t b/testcases/t/20-multiple-cmds.t
new file mode 100644 (file)
index 0000000..784329f
--- /dev/null
@@ -0,0 +1,56 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests multiple commands (using ';') and multiple operations (using ',')
+#
+use i3test;
+
+my $tmp = fresh_workspace;
+
+sub multiple_cmds {
+    my ($cmd) = @_;
+
+    cmd 'open';
+    cmd 'open';
+    ok(@{get_ws_content($tmp)} == 2, 'two containers opened');
+
+    cmd $cmd;
+    ok(@{get_ws_content($tmp)} == 0, "both containers killed (cmd = $cmd)");
+}
+multiple_cmds('kill;kill');
+multiple_cmds('kill; kill');
+multiple_cmds('kill ; kill');
+multiple_cmds('kill ;kill');
+multiple_cmds('kill  ;kill');
+multiple_cmds('kill  ;  kill');
+multiple_cmds("kill;\tkill");
+multiple_cmds("kill\t;kill");
+multiple_cmds("kill\t;\tkill");
+multiple_cmds("kill\t ;\tkill");
+multiple_cmds("kill\t ;\t kill");
+multiple_cmds("kill \t ; \t kill");
+
+#####################################################################
+# test if un-quoted strings are handled correctly
+#####################################################################
+
+$tmp = fresh_workspace;
+cmd 'open';
+my $unused = get_unused_workspace;
+ok(!($unused ~~ @{get_workspace_names()}), 'workspace does not exist yet');
+cmd "move workspace $unused; nop parser test";
+ok(($unused ~~ @{get_workspace_names()}), 'workspace exists after moving');
+
+#####################################################################
+# quote the workspace name and use a ; (command separator) in its name
+#####################################################################
+
+$unused = get_unused_workspace;
+$unused .= ';a';
+ok(!($unused ~~ @{get_workspace_names()}), 'workspace does not exist yet');
+cmd qq|move workspace "$unused"; nop parser test|;
+ok(($unused ~~ @{get_workspace_names()}), 'workspace exists after moving');
+
+# TODO: need a non-invasive command before implementing a test which uses ','
+
+done_testing;
diff --git a/testcases/t/21-next-prev.t b/testcases/t/21-next-prev.t
new file mode 100644 (file)
index 0000000..447be31
--- /dev/null
@@ -0,0 +1,76 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests focus switching (next/prev)
+#
+use i3test;
+
+my $tmp = fresh_workspace;
+
+######################################################################
+# Open one container, verify that 'focus down' and 'focus right' do nothing
+######################################################################
+cmd 'open';
+
+my ($nodes, $focus) = get_ws_content($tmp);
+my $old_focused = $focus->[0];
+
+cmd 'focus down';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $old_focused, 'focus did not change with only one con');
+
+cmd 'focus right';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $old_focused, 'focus did not change with only one con');
+
+######################################################################
+# Open another container, verify that 'focus right' switches
+######################################################################
+my $left = $old_focused;
+
+cmd 'open';
+($nodes, $focus) = get_ws_content($tmp);
+isnt($old_focused, $focus->[0], 'new container is focused');
+my $mid = $focus->[0];
+
+cmd 'open';
+($nodes, $focus) = get_ws_content($tmp);
+isnt($old_focused, $focus->[0], 'new container is focused');
+my $right = $focus->[0];
+
+cmd 'focus right';
+($nodes, $focus) = get_ws_content($tmp);
+isnt($focus->[0], $right, 'focus did change');
+is($focus->[0], $left, 'left container focused (wrapping)');
+
+cmd 'focus right';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $mid, 'middle container focused');
+
+cmd 'focus right';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $right, 'right container focused');
+
+cmd 'focus left';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $mid, 'middle container focused');
+
+cmd 'focus left';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $left, 'left container focused');
+
+cmd 'focus left';
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $right, 'right container focused');
+
+
+######################################################################
+# Test focus command
+######################################################################
+
+cmd qq|[con_id="$mid"] focus|;
+($nodes, $focus) = get_ws_content($tmp);
+is($focus->[0], $mid, 'middle container focused');
+
+
+done_testing;
diff --git a/testcases/t/22-split.t b/testcases/t/22-split.t
new file mode 100644 (file)
index 0000000..3484c7f
--- /dev/null
@@ -0,0 +1,92 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests splitting
+#
+use i3test;
+use X11::XCB qw(:all);
+
+my $tmp = fresh_workspace;
+
+my $ws = get_ws($tmp);
+is($ws->{orientation}, 'horizontal', 'orientation horizontal by default');
+cmd 'split v';
+$ws = get_ws($tmp);
+is($ws->{orientation}, 'vertical', 'split v changes workspace orientation');
+
+######################################################################
+# Open two containers, split, open another container. Then verify
+# the layout is like we expect it to be
+######################################################################
+cmd 'open';
+cmd 'open';
+my $content = get_ws_content($tmp);
+
+is(@{$content}, 2, 'two containers on workspace level');
+my $first = $content->[0];
+my $second = $content->[1];
+
+is(@{$first->{nodes}}, 0, 'first container has no children');
+is(@{$second->{nodes}}, 0, 'second container has no children (yet)');
+my $old_name = $second->{name};
+
+
+cmd 'split h';
+cmd 'open';
+
+$content = get_ws_content($tmp);
+
+is(@{$content}, 2, 'two containers on workspace level');
+$first = $content->[0];
+$second = $content->[1];
+
+is(@{$first->{nodes}}, 0, 'first container has no children');
+isnt($second->{name}, $old_name, 'second container was replaced');
+is($second->{orientation}, 'horizontal', 'orientation is horizontal');
+is(@{$second->{nodes}}, 2, 'second container has 2 children');
+is($second->{nodes}->[0]->{name}, $old_name, 'found old second container');
+
+# TODO: extend this test-case (test next/prev)
+# - wrapping (no horizontal switch possible, goes level-up)
+# - going level-up "manually"
+
+######################################################################
+# Test splitting multiple times without actually creating windows
+######################################################################
+
+$tmp = fresh_workspace;
+
+$ws = get_ws($tmp);
+is($ws->{orientation}, 'horizontal', 'orientation horizontal by default');
+cmd 'split v';
+$ws = get_ws($tmp);
+is($ws->{orientation}, 'vertical', 'split v changes workspace orientation');
+
+cmd 'open';
+my @content = @{get_ws_content($tmp)};
+
+# recursively sums up all nodes and their children
+sub sum_nodes {
+    my ($nodes) = @_;
+
+    return 0 if !@{$nodes};
+
+    my @children = (map { @{$_->{nodes}} } @{$nodes},
+                    map { @{$_->{'floating_nodes'}} } @{$nodes});
+
+    return @{$nodes} + sum_nodes(\@children);
+}
+
+my $old_count = sum_nodes(\@content);
+cmd 'split v';
+
+@content = @{get_ws_content($tmp)};
+$old_count = sum_nodes(\@content);
+
+cmd 'split v';
+
+@content = @{get_ws_content($tmp)};
+my $count = sum_nodes(\@content);
+is($count, $old_count, 'not more windows after splitting again');
+
+done_testing;
diff --git a/testcases/t/24-move.t b/testcases/t/24-move.t
new file mode 100644 (file)
index 0000000..4df3a2a
--- /dev/null
@@ -0,0 +1,134 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests moving. Basically, there are four different code-paths:
+# 1) move a container which cannot be moved (single container on a workspace)
+# 2) move a container before another single container
+# 3) move a container inside another container
+# 4) move a container in a different direction so that we need to go up in tree
+#
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+######################################################################
+# 1) move a container which cannot be moved
+######################################################################
+
+cmd 'open';
+
+my $old_content = get_ws_content($tmp);
+is(@{$old_content}, 1, 'one container on this workspace');
+
+my $first = $old_content->[0]->{id};
+
+#cmd 'move before h';
+#cmd 'move before v';
+#cmd 'move after v';
+#cmd 'move after h';
+
+my $content = get_ws_content($tmp);
+#is_deeply($old_content, $content, 'workspace unmodified after useless moves');
+
+######################################################################
+# 2) move a container before another single container
+######################################################################
+
+cmd 'open';
+$content = get_ws_content($tmp);
+is(@{$content}, 2, 'two containers on this workspace');
+my $second = $content->[1]->{id};
+
+is($content->[0]->{id}, $first, 'first container unmodified');
+
+# Move the second container before the first one (→ swap them)
+cmd 'move left';
+$content = get_ws_content($tmp);
+is($content->[0]->{id}, $second, 'first container modified');
+
+# We should not be able to move any further
+cmd 'move left';
+$content = get_ws_content($tmp);
+is($content->[0]->{id}, $second, 'first container unmodified');
+
+# Now move in the other direction
+cmd 'move right';
+$content = get_ws_content($tmp);
+is($content->[0]->{id}, $first, 'first container modified');
+
+# We should not be able to move any further
+cmd 'move right';
+$content = get_ws_content($tmp);
+is($content->[0]->{id}, $first, 'first container unmodified');
+
+######################################################################
+# 3) move a container inside another container
+######################################################################
+
+# Split the current (second) container and create a new container on workspace
+# level. Our layout looks like this now:
+# --------------------------
+# |       | second |       |
+# | first | ------ | third |
+# |       |        |       |
+# --------------------------
+cmd 'split v';
+cmd 'focus parent';
+cmd 'open';
+
+$content = get_ws_content($tmp);
+is(@{$content}, 3, 'three containers on this workspace');
+my $third = $content->[2]->{id};
+
+cmd 'move left';
+$content = get_ws_content($tmp);
+is(@{$content}, 2, 'only two containers on this workspace');
+my $nodes = $content->[1]->{nodes};
+is($nodes->[0]->{id}, $second, 'second container on top');
+is($nodes->[1]->{id}, $third, 'third container on bottom');
+
+######################################################################
+# move it inside the split container
+######################################################################
+
+cmd 'move up';
+$nodes = get_ws_content($tmp)->[1]->{nodes};
+is($nodes->[0]->{id}, $third, 'third container on top');
+is($nodes->[1]->{id}, $second, 'second container on bottom');
+
+# move it outside again
+cmd 'move left';
+$content = get_ws_content($tmp);
+is(@{$content}, 3, 'three nodes on this workspace');
+
+# due to automatic flattening/cleanup, the remaining split container
+# will be replaced by the con itself, so we will still have 3 nodes
+cmd 'move right';
+$content = get_ws_content($tmp);
+is(@{$content}, 2, 'two nodes on this workspace');
+
+######################################################################
+# 4) We create two v-split containers on the workspace, then we move
+#    all Cons from the left v-split to the right one. The old vsplit
+#    container needs to be closed. Verify that it will be closed.
+######################################################################
+
+my $otmp = fresh_workspace;
+
+cmd "open";
+cmd "open";
+cmd "split v";
+cmd "open";
+cmd 'focus left';
+cmd "split v";
+cmd "open";
+cmd "move right";
+cmd 'focus left';
+cmd "move right";
+
+$content = get_ws_content($otmp);
+is(@{$content}, 1, 'only one nodes on this workspace');
+
+done_testing;
diff --git a/testcases/t/26-regress-close.t b/testcases/t/26-regress-close.t
new file mode 100644 (file)
index 0000000..8aec87d
--- /dev/null
@@ -0,0 +1,18 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression: closing of floating clients did crash i3 when closing the
+# container which contained this client.
+#
+use i3test;
+
+fresh_workspace;
+
+cmd 'open';
+cmd 'mode toggle';
+cmd 'kill';
+cmd 'kill';
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/27-regress-floating-parent.t b/testcases/t/27-regress-floating-parent.t
new file mode 100644 (file)
index 0000000..52b8b9c
--- /dev/null
@@ -0,0 +1,41 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression: make a container floating, kill its parent, make it tiling again
+#
+use i3test;
+
+my $tmp = fresh_workspace;
+
+cmd 'open';
+my $left = get_focused($tmp);
+cmd 'open';
+my $old = get_focused($tmp);
+cmd 'split v';
+cmd 'open';
+my $floating = get_focused($tmp);
+diag("focused floating: " . get_focused($tmp));
+cmd 'mode toggle';
+# TODO: eliminate this race conditition
+sleep 1;
+
+# kill old container
+cmd qq|[con_id="$old"] focus|;
+is(get_focused($tmp), $old, 'old container focused');
+cmd 'kill';
+
+# kill left container
+cmd qq|[con_id="$left"] focus|;
+is(get_focused($tmp), $left, 'old container focused');
+cmd 'kill';
+
+# focus floating window, make it tiling again
+cmd qq|[con_id="$floating"] focus|;
+is(get_focused($tmp), $floating, 'floating window focused');
+
+sleep 1;
+cmd 'mode toggle';
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/28-open-order.t b/testcases/t/28-open-order.t
new file mode 100644 (file)
index 0000000..b638e70
--- /dev/null
@@ -0,0 +1,37 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Check if new containers are opened after the currently focused one instead
+# of always at the end
+use List::Util qw(first);
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+# Open two new container
+my $first = open_empty_con($i3);
+
+ok(@{get_ws_content($tmp)} == 1, 'containers opened');
+
+my $second = open_empty_con($i3);
+
+isnt($first, $second, 'different container focused');
+
+##############################################################
+# see if new containers open after the currently focused
+##############################################################
+
+cmd qq|[con_id="$first"] focus|;
+cmd 'open';
+$content = get_ws_content($tmp);
+ok(@{$content} == 3, 'three containers opened');
+
+is($content->[0]->{id}, $first, 'first container unmodified');
+isnt($content->[1]->{id}, $second, 'second container replaced');
+is($content->[2]->{id}, $second, 'third container unmodified');
+
+done_testing;
diff --git a/testcases/t/29-focus-after-close.t b/testcases/t/29-focus-after-close.t
new file mode 100644 (file)
index 0000000..ac029eb
--- /dev/null
@@ -0,0 +1,122 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Check if the focus is correctly restored after closing windows.
+#
+use i3test;
+use X11::XCB qw(:all);
+use List::Util qw(first);
+
+my $x = X11::XCB::Connection->new;
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $first = open_empty_con($i3);
+my $second = open_empty_con($i3);
+
+cmd 'split v';
+
+my ($nodes, $focus) = get_ws_content($tmp);
+
+ok(!$nodes->[1]->{focused}, 'split container not focused');
+cmd 'focus parent';
+($nodes, $focus) = get_ws_content($tmp);
+ok($nodes->[1]->{focused}, 'split container focused after focus parent');
+
+my $third = open_empty_con($i3);
+
+isnt(get_focused($tmp), $second, 'different container focused');
+
+# We have the following layout now (con is focused):
+# .----------------.
+# | split  |       |
+# | .----. |  con  |
+# | | cn | |       |
+# | `----' |       |
+# `----------------'
+
+##############################################################
+# see if the focus goes down to $first (not to its split parent)
+# when closing $second
+##############################################################
+
+cmd 'kill';
+# TODO: this testcase sometimes has different outcomes when the
+# sleep is missing. why?
+sleep 0.25;
+($nodes, $focus) = get_ws_content($tmp);
+is($nodes->[1]->{nodes}->[0]->{id}, $second, 'second container found');
+ok($nodes->[1]->{nodes}->[0]->{focused}, 'second container focused');
+
+##############################################################
+# another case, using a slightly different layout (regression)
+##############################################################
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+cmd 'split v';
+$first = open_empty_con($i3);
+my $bottom = open_empty_con($i3);
+
+cmd 'focus up';
+cmd 'split h';
+my $middle = open_empty_con($i3);
+my $right = open_empty_con($i3);
+cmd 'focus down';
+
+# We have the following layout now (second is focused):
+# .----------------------------.
+# | .------------------------. |
+# | | first | middle | right | |
+# | `------------------------' |
+# |----------------------------|
+# |                            |
+# |          second            |
+# |                            |
+# `----------------------------'
+
+# Check if the focus is restored to $right when we close $second
+cmd 'kill';
+
+is(get_focused($tmp), $right, 'top right container focused (in focus stack)');
+
+($nodes, $focus) = get_ws_content($tmp);
+my $tr = first { $_->{id} eq $right } @{$nodes->[0]->{nodes}};
+is($tr->{focused}, 1, 'top right container really has focus');
+
+##############################################################
+# check if focus is correct after closing an unfocused window
+##############################################################
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+$first = open_empty_con($i3);
+$middle = open_empty_con($i3);
+# XXX: the $right empty con will be filled with the x11 window we are creating afterwards
+$right = open_empty_con($i3);
+my $win = open_standard_window($x, '#00ff00');
+
+cmd qq|[con_id="$middle"] focus|;
+$win->destroy;
+
+sleep 0.25;
+
+is(get_focused($tmp), $middle, 'middle container focused');
+
+##############################################################
+# and now for something completely different:
+# check if the pointer position is relevant when restoring focus
+# (it should not be relevant, of course)
+##############################################################
+
+# TODO: add test code as soon as I can reproduce it
+
+done_testing;
diff --git a/testcases/t/30-close-empty-split.t b/testcases/t/30-close-empty-split.t
new file mode 100644 (file)
index 0000000..57855cd
--- /dev/null
@@ -0,0 +1,82 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Check if empty split containers are automatically closed.
+#
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $first = open_empty_con($i3);
+my $second = open_empty_con($i3);
+cmd qq|[con_id="$first"] focus|;
+
+cmd 'split v';
+
+($nodes, $focus) = get_ws_content($tmp);
+
+is($nodes->[0]->{focused}, 0, 'split container not focused');
+
+# focus the split container
+cmd 'level up';
+($nodes, $focus) = get_ws_content($tmp);
+my $split = $focus->[0];
+cmd 'level down';
+
+my $second = open_empty_con($i3);
+
+isnt($first, $second, 'different container focused');
+
+##############################################################
+# close both windows and see if the split container still exists
+##############################################################
+
+cmd 'kill';
+cmd 'kill';
+($nodes, $focus) = get_ws_content($tmp);
+isnt($nodes->[0]->{id}, $split, 'split container closed');
+
+##############################################################
+# same thing but this time we are moving the cons away instead
+# of killing them
+##############################################################
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+$first = open_empty_con($i3);
+$second = open_empty_con($i3);
+cmd qq|[con_id="$first"] focus|;
+
+cmd 'split v';
+
+($nodes, $focus) = get_ws_content($tmp);
+
+is($nodes->[0]->{focused}, 0, 'split container not focused');
+
+# focus the split container
+cmd 'level up';
+($nodes, $focus) = get_ws_content($tmp);
+my $split = $focus->[0];
+cmd 'level down';
+
+my $second = open_empty_con($i3);
+
+isnt($first, $second, 'different container focused');
+
+##############################################################
+# close both windows and see if the split container still exists
+##############################################################
+
+my $otmp = get_unused_workspace();
+cmd "move workspace $otmp";
+cmd "move workspace $otmp";
+($nodes, $focus) = get_ws_content($tmp);
+isnt($nodes->[0]->{id}, $split, 'split container closed');
+
+done_testing;
diff --git a/testcases/t/31-stacking-order.t b/testcases/t/31-stacking-order.t
new file mode 100644 (file)
index 0000000..9c1e74c
--- /dev/null
@@ -0,0 +1,52 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Check if stacking containers can be used independantly of
+# the split mode (horizontal/vertical) of the underlying
+# container.
+#
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+# Enforce vertical split mode
+cmd 'split v';
+
+my $first = open_empty_con($i3);
+my $second = open_empty_con($i3);
+
+isnt($first, $second, 'two different containers opened');
+
+##############################################################
+# change mode to stacking and cycle through the containers
+##############################################################
+
+cmd 'layout stacking';
+is(get_focused($tmp), $second, 'second container still focused');
+
+cmd 'focus down';
+is(get_focused($tmp), $first, 'first container focused');
+
+cmd 'focus up';
+is(get_focused($tmp), $second, 'second container focused again');
+
+##############################################################
+# now change the orientation to horizontal and cycle
+##############################################################
+
+cmd 'focus parent';
+cmd 'split h';
+cmd 'focus child';
+
+cmd 'focus down';
+is(get_focused($tmp), $first, 'first container focused');
+
+cmd 'focus up';
+is(get_focused($tmp), $second, 'second container focused again');
+
+
+done_testing;
diff --git a/testcases/t/32-move-workspace.t b/testcases/t/32-move-workspace.t
new file mode 100644 (file)
index 0000000..3b50e39
--- /dev/null
@@ -0,0 +1,62 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Checks if the 'move workspace' command works correctly
+#
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+# We move the pointer out of our way to avoid a bug where the focus will
+# be set to the window under the cursor
+my $x = X11::XCB::Connection->new;
+$x->root->warp_pointer(0, 0);
+
+my $tmp = get_unused_workspace();
+my $tmp2 = get_unused_workspace();
+cmd "workspace $tmp";
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $first = open_empty_con($i3);
+my $second = open_empty_con($i3);
+ok(@{get_ws_content($tmp)} == 2, 'two containers on first ws');
+
+cmd "workspace $tmp2";
+ok(@{get_ws_content($tmp2)} == 0, 'no containers on second ws yet');
+
+cmd "workspace $tmp";
+
+cmd "move workspace $tmp2";
+ok(@{get_ws_content($tmp)} == 1, 'one container on first ws anymore');
+ok(@{get_ws_content($tmp2)} == 1, 'one container on second ws');
+my ($nodes, $focus) = get_ws_content($tmp2);
+
+is($focus->[0], $second, 'same container on different ws');
+
+($nodes, $focus) = get_ws_content($tmp);
+ok($nodes->[0]->{focused}, 'first container focused on first ws');
+
+###################################################################
+# check if floating cons are moved to new workspaces properly
+# (that is, if they are floating on the target ws, too)
+###################################################################
+
+$tmp = get_unused_workspace();
+$tmp2 = get_unused_workspace();
+cmd "workspace $tmp";
+
+cmd "open";
+cmd "floating toggle";
+
+my $ws = get_ws($tmp);
+is(@{$ws->{nodes}}, 0, 'no nodes on workspace');
+is(@{$ws->{floating_nodes}}, 1, 'one floating node on workspace');
+
+cmd "move workspace $tmp2";
+
+$ws = get_ws($tmp2);
+is(@{$ws->{nodes}}, 0, 'no nodes on workspace');
+is(@{$ws->{floating_nodes}}, 1, 'one floating node on workspace');
+
+done_testing;
diff --git a/testcases/t/33-size-hints.t b/testcases/t/33-size-hints.t
new file mode 100644 (file)
index 0000000..05897c8
--- /dev/null
@@ -0,0 +1,42 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Checks if size hints are interpreted correctly.
+#
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $win = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => X11::XCB::Rect->new(x => 0, y => 0, width => 30, height => 30),
+    background_color => '#C0C0C0',
+);
+
+# XXX: we should check screen size. in screens with an AR of 2.0,
+# this is not a good idea.
+my $aspect = X11::XCB::Sizehints::Aspect->new;
+$aspect->min_num(600);
+$aspect->min_den(300);
+$aspect->max_num(600);
+$aspect->max_den(300);
+$win->_create;
+$win->map;
+sleep 0.25;
+$win->hints->aspect($aspect);
+$x->flush;
+
+sleep 0.25;
+
+my $rect = $win->rect;
+my $ar = $rect->width / $rect->height;
+diag("Aspect ratio = $ar");
+ok(($ar > 1.90) && ($ar < 2.10), 'Aspect ratio about 2.0');
+
+done_testing;
diff --git a/testcases/t/34-invalid-command.t b/testcases/t/34-invalid-command.t
new file mode 100644 (file)
index 0000000..d58985e
--- /dev/null
@@ -0,0 +1,12 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# 
+#
+use i3test;
+
+cmd 'blargh!';
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/35-floating-focus.t b/testcases/t/35-floating-focus.t
new file mode 100644 (file)
index 0000000..3f820ea
--- /dev/null
@@ -0,0 +1,174 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+
+use i3test;
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+#############################################################################
+# 1: see if focus stays the same when toggling tiling/floating mode
+#############################################################################
+
+my $first = open_standard_window($x);
+my $second = open_standard_window($x);
+
+is($x->input_focus, $second->id, 'second window focused');
+
+cmd 'floating enable';
+cmd 'floating disable';
+
+is($x->input_focus, $second->id, 'second window still focused after mode toggle');
+
+#############################################################################
+# 2: see if focus stays on the current floating window if killing another
+# floating window
+#############################################################################
+
+$tmp = fresh_workspace;
+
+$first = open_standard_window($x);    # window 2
+$second = open_standard_window($x);   # window 3
+my $third = open_standard_window($x); # window 4
+
+is($x->input_focus, $third->id, 'last container focused');
+
+cmd 'floating enable';
+
+cmd '[id="' . $second->id . '"] focus';
+
+is($x->input_focus, $second->id, 'second con focused');
+
+cmd 'floating enable';
+
+# now kill the third one (it's floating). focus should stay unchanged
+cmd '[id="' . $third->id . '"] kill';
+
+sleep 0.25;
+
+is($x->input_focus, $second->id, 'second con still focused after killing third');
+
+
+#############################################################################
+# 3: see if the focus gets reverted correctly when closing floating clients
+# (first to the next floating client, then to the last focused tiling client)
+#############################################################################
+
+$tmp = fresh_workspace;
+
+$first = open_standard_window($x, '#ff0000');    # window 5
+$second = open_standard_window($x, '#00ff00');   # window 6
+my $third = open_standard_window($x, '#0000ff'); # window 7
+
+is($x->input_focus, $third->id, 'last container focused');
+
+cmd 'floating enable';
+
+cmd '[id="' . $second->id . '"] focus';
+
+is($x->input_focus, $second->id, 'second con focused');
+
+cmd 'floating enable';
+
+# now kill the second one. focus should fall back to the third one, which is
+# also floating
+cmd 'kill';
+
+sleep 0.25;
+
+is($x->input_focus, $third->id, 'third con focused');
+
+cmd 'kill';
+
+sleep 0.25;
+
+is($x->input_focus, $first->id, 'first con focused after killing all floating cons');
+
+#############################################################################
+# 4: same test as 3, but with another split con
+#############################################################################
+
+$tmp = fresh_workspace;
+
+$first = open_standard_window($x, '#ff0000');    # window 5
+cmd 'split v';
+cmd 'layout stacked';
+$second = open_standard_window($x, '#00ff00');   # window 6
+$third = open_standard_window($x, '#0000ff'); # window 7
+
+is($x->input_focus, $third->id, 'last container focused');
+
+cmd 'floating enable';
+
+cmd '[id="' . $second->id . '"] focus';
+
+is($x->input_focus, $second->id, 'second con focused');
+
+cmd 'floating enable';
+
+sleep 0.5;
+
+# now kill the second one. focus should fall back to the third one, which is
+# also floating
+cmd 'kill';
+
+sleep 0.25;
+
+is($x->input_focus, $third->id, 'second con focused');
+
+cmd 'kill';
+
+sleep 0.25;
+
+is($x->input_focus, $first->id, 'first con focused after killing all floating cons');
+
+#############################################################################
+# 5: see if the 'focus tiling' and 'focus floating' commands work
+#############################################################################
+
+$tmp = fresh_workspace;
+
+$first = open_standard_window($x, '#ff0000');    # window 8
+$second = open_standard_window($x, '#00ff00');   # window 9
+
+is($x->input_focus, $second->id, 'second container focused');
+
+cmd 'floating enable';
+
+is($x->input_focus, $second->id, 'second container focused');
+
+cmd 'focus tiling';
+
+sleep 0.25;
+
+is($x->input_focus, $first->id, 'first (tiling) container focused');
+
+cmd 'focus floating';
+
+sleep 0.25;
+
+is($x->input_focus, $second->id, 'second (floating) container focused');
+
+cmd 'focus floating';
+
+sleep 0.25;
+
+is($x->input_focus, $second->id, 'second (floating) container still focused');
+
+cmd 'focus mode_toggle';
+
+sleep 0.25;
+
+is($x->input_focus, $first->id, 'first (tiling) container focused');
+
+cmd 'focus mode_toggle';
+
+sleep 0.25;
+
+is($x->input_focus, $second->id, 'second (floating) container focused');
+
+
+done_testing;
diff --git a/testcases/t/36-floating-ws-empty.t b/testcases/t/36-floating-ws-empty.t
new file mode 100644 (file)
index 0000000..f33d04d
--- /dev/null
@@ -0,0 +1,48 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Regression test: when only having a floating window on a workspace, it should not be deleted.
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#############################################################################
+# 1: open a floating window, get it mapped
+#############################################################################
+
+ok(workspace_exists($tmp), "workspace $tmp exists");
+
+my $x = X11::XCB::Connection->new;
+
+# Create a floating window which is smaller than the minimum enforced size of i3
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+ok($window->mapped, 'Window is mapped');
+
+# switch to a different workspace, see if the window is still mapped?
+
+my $otmp = fresh_workspace;
+
+ok(workspace_exists($otmp), "new workspace $otmp exists");
+ok(workspace_exists($tmp), "old workspace $tmp still exists");
+
+done_testing;
diff --git a/testcases/t/37-floating-unmap.t b/testcases/t/37-floating-unmap.t
new file mode 100644 (file)
index 0000000..3ae4b12
--- /dev/null
@@ -0,0 +1,50 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Regression test: Floating windows were not correctly unmapped when switching
+# to a different workspace.
+
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#############################################################################
+# 1: open a floating window, get it mapped
+#############################################################################
+
+my $x = X11::XCB::Connection->new;
+
+# Create a floating window which is smaller than the minimum enforced size of i3
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+ok($window->mapped, 'Window is mapped');
+
+# switch to a different workspace, see if the window is still mapped?
+
+my $otmp = fresh_workspace;
+
+sleep 0.25;
+
+ok(!$window->mapped, 'Window is not mapped after switching ws');
+
+cmd "nop testcase done";
+
+done_testing;
diff --git a/testcases/t/38-floating-attach.t b/testcases/t/38-floating-attach.t
new file mode 100644 (file)
index 0000000..31bddaf
--- /dev/null
@@ -0,0 +1,108 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Regression test: New windows were attached to the container of a floating window
+# if only a floating window is present on the workspace.
+
+use i3test;
+use X11::XCB qw(:all);
+use Time::HiRes qw(sleep);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#############################################################################
+# 1: open a floating window, get it mapped
+#############################################################################
+
+my $x = X11::XCB::Connection->new;
+
+# Create a floating window
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+ok($window->mapped, 'Window is mapped');
+
+my $ws = get_ws($tmp);
+my ($nodes, $focus) = get_ws_content($tmp);
+
+is(@{$ws->{floating_nodes}}, 1, 'one floating node');
+is(@{$nodes}, 0, 'no tiling nodes');
+
+# Create a tiling window
+my $twindow = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+);
+
+isa_ok($twindow, 'X11::XCB::Window');
+
+$twindow->map;
+
+sleep 0.25;
+
+($nodes, $focus) = get_ws_content($tmp);
+
+is(@{$nodes}, 1, 'one tiling node');
+
+#############################################################################
+# 2: similar case: floating windows should be attached at the currently focused
+# position in the workspace (for example a stack), not just at workspace level.
+#############################################################################
+
+$tmp = fresh_workspace;
+
+my $first = open_standard_window($x);
+my $second = open_standard_window($x);
+
+cmd 'layout stacked';
+
+$ws = get_ws($tmp);
+is(@{$ws->{floating_nodes}}, 0, 'no floating nodes so far');
+is(@{$ws->{nodes}}, 1, 'one tiling node (stacked con)');
+
+# Create a floating window
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+ok($window->mapped, 'Window is mapped');
+
+$ws = get_ws($tmp);
+is(@{$ws->{floating_nodes}}, 1, 'one floating nodes');
+is(@{$ws->{nodes}}, 1, 'one tiling node (stacked con)');
+
+my $third = open_standard_window($x);
+
+
+$ws = get_ws($tmp);
+is(@{$ws->{floating_nodes}}, 1, 'one floating nodes');
+is(@{$ws->{nodes}}, 1, 'one tiling node (stacked con)');
+
+done_testing;
diff --git a/testcases/t/39-ws-numbers.t b/testcases/t/39-ws-numbers.t
new file mode 100644 (file)
index 0000000..3afd281
--- /dev/null
@@ -0,0 +1,60 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Check if numbered workspaces and named workspaces are sorted in the right way
+# in get_workspaces IPC output (necessary for i3bar etc.).
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $i3 = i3(get_socket_path());
+my $x = X11::XCB::Connection->new;
+
+sub check_order {
+    my ($msg) = @_;
+
+    my @ws = @{$i3->get_workspaces->recv};
+    my @nums = map { $_->{num} } grep { defined($_->{num}) } @ws;
+    my @sorted = sort @nums;
+
+    cmp_deeply(\@nums, \@sorted, $msg);
+}
+
+check_order('workspace order alright before testing');
+
+#############################################################################
+# open a window to keep this ws open
+#############################################################################
+
+cmd "workspace 93";
+
+open_standard_window($x);
+
+my @ws = @{$i3->get_workspaces->recv};
+my @f = grep { defined($_->{num}) && $_->{num} == 93 } @ws;
+is(@f, 1, 'ws 93 found by num');
+check_order('workspace order alright after opening 93');
+
+cmd "workspace 92";
+open_standard_window($x);
+check_order('workspace order alright after opening 92');
+
+cmd "workspace 94";
+open_standard_window($x);
+check_order('workspace order alright after opening 94');
+
+cmd "workspace 96";
+open_standard_window($x);
+check_order('workspace order alright after opening 96');
+
+cmd "workspace foo";
+open_standard_window($x);
+check_order('workspace order alright after opening foo');
+
+cmd "workspace 91";
+open_standard_window($x);
+check_order('workspace order alright after opening 91');
+
+done_testing;
diff --git a/testcases/t/40-focus-lost.t b/testcases/t/40-focus-lost.t
new file mode 100644 (file)
index 0000000..9df220d
--- /dev/null
@@ -0,0 +1,47 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Regression: Check if the focus stays the same when switching the layout
+# bug introduced by 77d0d42ed2d7ac8cafe267c92b35a81c1b9491eb
+use i3test;
+use X11::XCB qw(:all);
+use Time::HiRes qw(sleep);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $i3 = i3(get_socket_path());
+my $x = X11::XCB::Connection->new;
+
+sub check_order {
+    my ($msg) = @_;
+
+    my @ws = @{$i3->get_workspaces->recv};
+    my @nums = map { $_->{num} } grep { defined($_->{num}) } @ws;
+    my @sorted = sort @nums;
+
+    cmp_deeply(\@nums, \@sorted, $msg);
+}
+
+my $tmp = fresh_workspace;
+
+my $left = open_standard_window($x);
+sleep 0.25;
+my $mid = open_standard_window($x);
+sleep 0.25;
+my $right = open_standard_window($x);
+sleep 0.25;
+
+diag("left = " . $left->id . ", mid = " . $mid->id . ", right = " . $right->id);
+
+is($x->input_focus, $right->id, 'Right window focused');
+
+cmd 'focus left';
+
+is($x->input_focus, $mid->id, 'Mid window focused');
+
+cmd 'layout stacked';
+
+is($x->input_focus, $mid->id, 'Mid window focused');
+
+done_testing;
diff --git a/testcases/t/41-resize.t b/testcases/t/41-resize.t
new file mode 100644 (file)
index 0000000..1717e8f
--- /dev/null
@@ -0,0 +1,49 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# Tests resizing tiling containers
+use i3test;
+use X11::XCB qw(:all);
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+cmd 'split v';
+
+my $top = open_standard_window($x);
+sleep 0.25;
+my $bottom = open_standard_window($x);
+sleep 0.25;
+
+diag("top = " . $top->id . ", bottom = " . $bottom->id);
+
+is($x->input_focus, $bottom->id, 'Bottom window focused');
+
+############################################################
+# resize
+############################################################
+
+cmd 'resize grow up 10 px or 25 ppt';
+
+my ($nodes, $focus) = get_ws_content($tmp);
+
+is($nodes->[0]->{percent}, 0.25, 'top window got only 25%');
+is($nodes->[1]->{percent}, 0.75, 'bottom window got 75%');
+
+
+############################################################
+# split and check if the 'percent' factor is still correct
+############################################################
+
+cmd 'split h';
+
+($nodes, $focus) = get_ws_content($tmp);
+
+is($nodes->[0]->{percent}, 0.25, 'top window got only 25%');
+is($nodes->[1]->{percent}, 0.75, 'bottom window got 75%');
+
+done_testing;
diff --git a/testcases/t/42-regress-move-floating.t b/testcases/t/42-regress-move-floating.t
new file mode 100644 (file)
index 0000000..6b2df80
--- /dev/null
@@ -0,0 +1,17 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression: move a floating window to a different workspace crashes i3
+#
+use i3test;
+
+my $tmp = fresh_workspace;
+my $otmp = get_unused_workspace();
+
+cmd 'open';
+cmd 'mode toggle';
+cmd "move workspace $otmp";
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/43-regress-floating-restart.t b/testcases/t/43-regress-floating-restart.t
new file mode 100644 (file)
index 0000000..babbb57
--- /dev/null
@@ -0,0 +1,23 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression: floating windows are tiling after restarting, closing them crashes i3
+#
+use i3test;
+
+my $tmp = fresh_workspace;
+
+cmd 'open';
+cmd 'mode toggle';
+cmd 'restart';
+
+sleep 0.5;
+
+diag('Checking if i3 still lives');
+
+does_i3_live;
+
+my $ws = get_ws($tmp);
+diag('ws = ' . Dumper($ws));
+
+done_testing;
diff --git a/testcases/t/44-regress-floating-resize.t b/testcases/t/44-regress-floating-resize.t
new file mode 100644 (file)
index 0000000..de33eeb
--- /dev/null
@@ -0,0 +1,37 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression: when resizing two containers on a workspace, opening a floating
+# client, then closing it again, i3 will re-distribute the space on the
+# workspace as if a tiling container was closed, leading to the containers
+# taking much more space than they possibly could.
+#
+use i3test;
+use List::Util qw(sum);
+
+my $tmp = fresh_workspace;
+
+cmd 'exec /usr/bin/urxvt';
+sleep 0.5;
+cmd 'exec /usr/bin/urxvt';
+sleep 0.5;
+my ($nodes, $focus) = get_ws_content($tmp);
+my $old_sum = sum map { $_->{rect}->{width} } @{$nodes};
+#cmd 'open';
+cmd 'resize grow left 10 px or 25 ppt';
+cmd 'split v';
+#cmd 'open';
+cmd 'exec /usr/bin/urxvt';
+sleep 0.5;
+cmd 'mode toggle';
+sleep 0.5;
+cmd 'kill';
+
+sleep 0.5;
+
+($nodes, $focus) = get_ws_content($tmp);
+my $new_sum = sum map { $_->{rect}->{width} } @{$nodes};
+
+is($old_sum, $new_sum, 'combined container width is still equal');
+
+done_testing;
diff --git a/testcases/t/45-flattening.t b/testcases/t/45-flattening.t
new file mode 100644 (file)
index 0000000..98b93ef
--- /dev/null
@@ -0,0 +1,34 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# by moving the window in the opposite orientation that its parent has, we
+# force i3 to create a new split container with the appropriate orientation.
+# However, when doing that two times in a row, we end up with two split
+# containers which are then redundant (workspace is horizontal, then v-split,
+# then h-split – we could just append the children of the latest h-split to the
+# workspace itself).
+#
+# This testcase checks that the tree is properly flattened after moving.
+#
+use X11::XCB qw(:all);
+use i3test;
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+my $left = open_standard_window($x);
+sleep 0.25;
+my $mid = open_standard_window($x);
+sleep 0.25;
+my $right = open_standard_window($x);
+sleep 0.25;
+
+cmd 'move before v';
+cmd 'move after h';
+my $ws = get_ws($tmp);
+
+is($ws->{orientation}, 'horizontal', 'workspace orientation is horizontal');
+is(@{$ws->{nodes}}, 3, 'all three windows on workspace level');
+
+done_testing;
diff --git a/testcases/t/46-floating-reinsert.t b/testcases/t/46-floating-reinsert.t
new file mode 100644 (file)
index 0000000..a4e90d4
--- /dev/null
@@ -0,0 +1,63 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+use X11::XCB qw(:all);
+use Time::HiRes qw(sleep);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+my $left = open_standard_window($x);
+sleep 0.25;
+my $mid = open_standard_window($x);
+sleep 0.25;
+
+cmd 'split v';
+my $bottom = open_standard_window($x);
+sleep 0.25;
+
+my ($nodes, $focus) = get_ws_content($tmp);
+
+#############################################################################
+# 1: open a floating window, get it mapped
+#############################################################################
+
+my $x = X11::XCB::Connection->new;
+
+# Create a floating window
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#C0C0C0',
+    # replace the type with 'utility' as soon as the coercion works again in X11::XCB
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_UTILITY'),
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+ok($window->mapped, 'Window is mapped');
+
+($nodes, $focus) = get_ws_content($tmp);
+is(@{$nodes->[1]->{nodes}}, 2, 'two windows in split con');
+
+#############################################################################
+# 2: make it tiling, see where it ends up
+#############################################################################
+
+cmd 'floating toggle';
+
+my ($nodes, $focus) = get_ws_content($tmp);
+
+is(@{$nodes->[1]->{nodes}}, 3, 'three windows in split con after floating toggle');
+
+done_testing;
diff --git a/testcases/t/47-regress-floatingmove.t b/testcases/t/47-regress-floatingmove.t
new file mode 100644 (file)
index 0000000..6e04916
--- /dev/null
@@ -0,0 +1,47 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for moving a con outside of a floating con when there are no
+# tiling cons on a workspace
+#
+use X11::XCB qw(:all);
+use Time::HiRes qw(sleep);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+my $left = open_standard_window($x);
+sleep 0.25;
+my $mid = open_standard_window($x);
+sleep 0.25;
+my $right = open_standard_window($x);
+sleep 0.25;
+
+# go to workspace level
+cmd 'level up';
+sleep 0.25;
+
+# make it floating
+cmd 'mode toggle';
+sleep 0.25;
+
+# move the con outside the floating con
+cmd 'move before v';
+sleep 0.25;
+
+does_i3_live;
+
+# move another con outside
+cmd '[id="' . $mid->id . '"] focus';
+cmd 'move before v';
+sleep 0.25;
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/48-regress-floatingmovews.t b/testcases/t/48-regress-floatingmovews.t
new file mode 100644 (file)
index 0000000..0bec541
--- /dev/null
@@ -0,0 +1,38 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for correct focus behaviour when moving a floating con to
+# another workspace.
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+# open a tiling window on the first workspace
+open_standard_window($x);
+sleep 0.25;
+my $first = get_focused($tmp);
+
+# on a different ws, open a floating window
+my $otmp = fresh_workspace;
+open_standard_window($x);
+sleep 0.25;
+my $float = get_focused($otmp);
+cmd 'mode toggle';
+sleep 0.25;
+
+# move the floating con to first workspace
+cmd "move workspace $tmp";
+sleep 0.25;
+
+# switch to the first ws and check focus
+is(get_focused($tmp), $float, 'floating client correctly focused');
+
+done_testing;
diff --git a/testcases/t/50-regress-dock-restart.t b/testcases/t/50-regress-dock-restart.t
new file mode 100644 (file)
index 0000000..a4f7beb
--- /dev/null
@@ -0,0 +1,109 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for inplace restarting with dock clients
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# verify that there is no dock window yet
+#####################################################################
+
+# Children of all dockareas
+my @docked = get_dock_clients;
+
+is(@docked, 0, 'no dock clients yet');
+
+# open a dock client
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->map;
+
+sleep 0.25;
+
+#####################################################################
+# check that we can find it in the layout tree at the expected position
+#####################################################################
+
+@docked = get_dock_clients;
+is(@docked, 1, 'one dock client found');
+
+# verify the height
+my $docknode = $docked[0];
+
+is($docknode->{rect}->{height}, 30, 'dock node has unchanged height');
+
+# perform an inplace-restart
+cmd 'restart';
+
+sleep 0.25;
+
+does_i3_live;
+
+
+#####################################################################
+# check that we can still find the dock client
+#####################################################################
+
+@docked = get_dock_clients;
+is(@docked, 1, 'one dock client found');
+$docknode = $docked[0];
+
+is($docknode->{rect}->{height}, 30, 'dock node has unchanged height after restart');
+
+$window->destroy;
+
+sleep 0.25;
+
+@docked = get_dock_clients;
+is(@docked, 0, 'no dock clients found');
+
+#####################################################################
+# create a dock client with a 1px border
+#####################################################################
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    border => 1,
+    rect => [ 0, 0, 30, 20],
+    background_color => '#00FF00',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->map;
+
+sleep 0.25;
+
+@docked = get_dock_clients;
+is(@docked, 1, 'one dock client found');
+$docknode = $docked[0];
+
+is($docknode->{rect}->{height}, 20, 'dock node has unchanged height');
+
+cmd 'restart';
+sleep 0.25;
+
+@docked = get_dock_clients;
+is(@docked, 1, 'one dock client found');
+$docknode = $docked[0];
+
+is($docknode->{rect}->{height}, 20, 'dock node has unchanged height');
+
+
+done_testing;
diff --git a/testcases/t/51-regress-float-size.t b/testcases/t/51-regress-float-size.t
new file mode 100644 (file)
index 0000000..881ef8c
--- /dev/null
@@ -0,0 +1,17 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for setting a window to floating, tiling and opening a new window
+#
+use i3test;
+
+fresh_workspace;
+
+cmd 'open';
+cmd 'mode toggle';
+cmd 'mode toggle';
+cmd 'open';
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/52-regress-level-up.t b/testcases/t/52-regress-level-up.t
new file mode 100644 (file)
index 0000000..678cdd9
--- /dev/null
@@ -0,0 +1,18 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for using level-up to get to the 'content'-container and
+# toggle floating
+#
+use i3test;
+
+fresh_workspace;
+
+cmd 'open';
+cmd 'level up';
+cmd 'level up';
+cmd 'mode toggle';
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/53-floating-originalsize.t b/testcases/t/53-floating-originalsize.t
new file mode 100644 (file)
index 0000000..16e62c2
--- /dev/null
@@ -0,0 +1,50 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Test if the requested width/height is set after making the window floating.
+#
+use X11::XCB qw(:all);
+use i3test;
+
+my $tmp = fresh_workspace;
+
+my $x = X11::XCB::Connection->new;
+
+# Create a floating window which is smaller than the minimum enforced size of i3
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 400, 150],
+    background_color => '#C0C0C0',
+);
+
+isa_ok($window, 'X11::XCB::Window');
+
+$window->map;
+
+sleep 0.25;
+
+my ($absolute, $top) = $window->rect;
+
+ok($window->mapped, 'Window is mapped');
+cmp_ok($absolute->{width}, '>', 400, 'i3 raised the width');
+cmp_ok($absolute->{height}, '>', 150, 'i3 raised the height');
+
+cmd 'floating toggle';
+sleep 0.25;
+
+($absolute, $top) = $window->rect;
+
+diag('new width: ' . $absolute->{width});
+diag('new height: ' . $absolute->{height});
+
+# we compare with a tolerance of ± 20 pixels for borders in each direction
+# (overkill, but hey)
+cmp_ok($absolute->{width}, '>', 400-20, 'width now > 380');
+cmp_ok($absolute->{width}, '<', 400+20, 'width now < 420');
+cmp_ok($absolute->{height}, '>', 150-20, 'height now > 130');
+cmp_ok($absolute->{height}, '<', 150+20, 'height now < 170');
+
+#cmp_ok($absolute->{width}, '>=', 75, 'i3 raised the width to 75');
+#cmp_ok($absolute->{height}, '>=', 50, 'i3 raised the height to 50');
+
+done_testing;
diff --git a/testcases/t/54-regress-multiple-dock.t b/testcases/t/54-regress-multiple-dock.t
new file mode 100644 (file)
index 0000000..36070db
--- /dev/null
@@ -0,0 +1,70 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for closing one of multiple dock clients
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# verify that there is no dock window yet
+#####################################################################
+
+# Children of all dockareas
+my @docked = get_dock_clients;
+
+is(@docked, 0, 'no dock clients yet');
+
+#####################################################################
+# open a dock client
+#####################################################################
+
+my $first = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$first->map;
+
+sleep 0.25;
+
+#####################################################################
+# Open a second dock client
+#####################################################################
+
+my $second = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$second->map;
+
+sleep 0.25;
+
+#####################################################################
+# Kill the second dock client
+#####################################################################
+cmd "nop destroying dock client";
+$second->destroy;
+
+#####################################################################
+# Now issue a focus command
+#####################################################################
+cmd 'next v';
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/55-floating-split-size.t b/testcases/t/55-floating-split-size.t
new file mode 100644 (file)
index 0000000..ecffbb1
--- /dev/null
@@ -0,0 +1,68 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Test to see if i3 combines the geometry of all children in a split container
+# when setting the split container to floating
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# open a window with 200x80
+#####################################################################
+
+my $first = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 200, 80],
+    background_color => '#FF0000',
+);
+
+$first->map;
+
+sleep 0.25;
+
+#####################################################################
+# Open a second window with 300x90
+#####################################################################
+
+my $second = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 300, 90],
+    background_color => '#00FF00',
+);
+
+$second->map;
+
+sleep 0.25;
+
+#####################################################################
+# Set the parent to floating
+#####################################################################
+cmd 'nop setting floating';
+cmd 'focus parent';
+cmd 'floating enable';
+
+#####################################################################
+# Get geometry of the first floating node (the split container)
+#####################################################################
+
+my @nodes = @{get_ws($tmp)->{floating_nodes}};
+my $rect = $nodes[0]->{rect};
+
+# we compare the width with ± 20 pixels for borders
+cmp_ok($rect->{width}, '>', 500-20, 'width now > 480');
+cmp_ok($rect->{width}, '<', 500+20, 'width now < 520');
+# we compare the height with ± 40 pixels for decorations
+cmp_ok($rect->{height}, '>', 90-40, 'width now > 50');
+cmp_ok($rect->{height}, '<', 90+40, 'width now < 130');
+
+done_testing;
diff --git a/testcases/t/56-fullscreen-focus.t b/testcases/t/56-fullscreen-focus.t
new file mode 100644 (file)
index 0000000..ee60dc7
--- /dev/null
@@ -0,0 +1,63 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Test if new containers get focused when there is a fullscreen container at
+# the time of launching the new one.
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# open the left window
+#####################################################################
+
+my $left = open_standard_window($x, '#ff0000');
+
+is($x->input_focus, $left->id, 'left window focused');
+
+diag("left = " . $left->id);
+
+#####################################################################
+# Open the right window
+#####################################################################
+
+my $right = open_standard_window($x, '#00ff00');
+
+diag("right = " . $right->id);
+
+#####################################################################
+# Set the right window to fullscreen
+#####################################################################
+cmd 'nop setting fullscreen';
+cmd 'fullscreen';
+
+#####################################################################
+# Open a third window
+#####################################################################
+
+my $third = open_standard_window($x, '#0000ff');
+
+diag("third = " . $third->id);
+
+# move the fullscreen window to a different ws
+
+my $tmp2 = get_unused_workspace;
+
+cmd "move workspace $tmp2";
+
+# verify that the third window has the focus
+
+sleep 0.25;
+
+is($x->input_focus, $third->id, 'third window focused');
+
+done_testing;
diff --git a/testcases/t/57-regress-fullscreen-level-up.t b/testcases/t/57-regress-fullscreen-level-up.t
new file mode 100644 (file)
index 0000000..3e0b2fe
--- /dev/null
@@ -0,0 +1,49 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test: level up should be a noop during fullscreen mode
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# open a window, verify it’s not in fullscreen mode
+#####################################################################
+
+my $win = open_standard_window($x);
+
+my $nodes = get_ws_content $tmp;
+is(@$nodes, 1, 'exactly one client');
+is($nodes->[0]->{fullscreen_mode}, 0, 'client not fullscreen');
+
+#####################################################################
+# make it fullscreen
+#####################################################################
+
+cmd 'nop making fullscreen';
+cmd 'fullscreen';
+
+my $nodes = get_ws_content $tmp;
+is($nodes->[0]->{fullscreen_mode}, 1, 'client fullscreen now');
+
+#####################################################################
+# send level up, try to un-fullscreen
+#####################################################################
+cmd 'level up';
+cmd 'fullscreen';
+
+my $nodes = get_ws_content $tmp;
+is($nodes->[0]->{fullscreen_mode}, 0, 'client not fullscreen any longer');
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/58-wm_take_focus.t b/testcases/t/58-wm_take_focus.t
new file mode 100644 (file)
index 0000000..04c785a
--- /dev/null
@@ -0,0 +1,115 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests if the WM_TAKE_FOCUS protocol is correctly handled by i3
+#
+use X11::XCB qw(:all);
+use i3test;
+use v5.10;
+
+BEGIN {
+    use_ok('EV');
+    use_ok('AnyEvent');
+    use_ok('X11::XCB::Window');
+    use_ok('X11::XCB::Event::Generic');
+    use_ok('X11::XCB::Event::MapNotify');
+    use_ok('X11::XCB::Event::ClientMessage');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+subtest 'Window without WM_TAKE_FOCUS', sub {
+
+    my $tmp = fresh_workspace;
+
+    my $window = $x->root->create_child(
+        class => WINDOW_CLASS_INPUT_OUTPUT,
+        rect => [ 0, 0, 30, 30 ],
+        background_color => '#00ff00',
+        event_mask => [ 'structure_notify' ],
+    );
+
+    $window->name('Window 1');
+    $window->map;
+
+    my $cv = AE::cv;
+
+    my $prep = EV::prepare sub {
+        $x->flush;
+    };
+
+    my $check = EV::check sub {
+        while (defined(my $event = $x->poll_for_event)) {
+            if ($event->response_type == 161) {
+                # clientmessage
+                $cv->send(0);
+            }
+        }
+    };
+
+    my $w = EV::io $x->get_file_descriptor, EV::READ, sub {
+        # do nothing, we only need this watcher so that EV picks up the events
+    };
+
+    # Trigger timeout after 1 second
+    my $t = AE::timer 1, 0, sub {
+        $cv->send(1);
+    };
+
+    my $result = $cv->recv;
+    ok($result, 'cv result');
+
+    done_testing;
+};
+
+subtest 'Window with WM_TAKE_FOCUS', sub {
+
+    my $tmp = fresh_workspace;
+
+    my $window = $x->root->create_child(
+        class => WINDOW_CLASS_INPUT_OUTPUT,
+        rect => [ 0, 0, 30, 30 ],
+        background_color => '#00ff00',
+        event_mask => [ 'structure_notify' ],
+        protocols => [ $x->atom(name => 'WM_TAKE_FOCUS') ],
+    );
+
+    $window->name('Window 1');
+    $window->map;
+
+    my $cv = AE::cv;
+
+    my $prep = EV::prepare sub {
+        $x->flush;
+    };
+
+    my $check = EV::check sub {
+        while (defined(my $event = $x->poll_for_event)) {
+            if ($event->response_type == 161) {
+                $cv->send($event->data);
+            }
+        }
+    };
+
+    my $w = EV::io $x->get_file_descriptor, EV::READ, sub {
+        # do nothing, we only need this watcher so that EV picks up the events
+    };
+
+    my $t = AE::timer 1, 0, sub {
+        say "timer!";
+        $cv->send(undef);
+    };
+
+    my $result = $cv->recv;
+    ok(defined($result), 'got a ClientMessage');
+    if (defined($result)) {
+        my ($data, $time) = unpack("L2", $result);
+        is($data, $x->atom(name => 'WM_TAKE_FOCUS')->id, 'first uint32_t contains WM_TAKE_FOCUS atom');
+    }
+
+    done_testing;
+};
+
+
+done_testing;
diff --git a/testcases/t/59-socketpaths.t b/testcases/t/59-socketpaths.t
new file mode 100644 (file)
index 0000000..3335092
--- /dev/null
@@ -0,0 +1,84 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3
+#
+# Tests if the various ipc_socket_path options are correctly handled
+#
+use i3test;
+use Cwd qw(abs_path);
+use Proc::Background;
+use File::Temp qw(tempfile tempdir);
+use POSIX qw(getuid);
+use v5.10;
+
+# assuming we are run by complete-run.pl
+my $i3_path = abs_path("../i3");
+
+#####################################################################
+# default case: socket will be created in /tmp/i3-<username>/ipc-socket.<pid>
+#####################################################################
+
+my ($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+close($fh);
+
+diag("Starting i3");
+my $i3cmd = "unset XDG_RUNTIME_DIR; exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+my $process = Proc::Background->new($i3cmd);
+sleep 1;
+
+diag("pid = " . $process->pid);
+
+my $folder = "/tmp/i3-" . getpwuid(getuid());
+ok(-d $folder, "folder $folder exists");
+my $socketpath = "$folder/ipc-socket." . $process->pid;
+ok(-S $socketpath, "file $socketpath exists and is a socket");
+
+exit_gracefully($process->pid, $socketpath);
+
+sleep 0.25;
+
+#####################################################################
+# XDG_RUNTIME_DIR case: socket gets created in $XDG_RUNTIME_DIR/i3/ipc-socket.<pid>
+#####################################################################
+
+my $rtdir = tempdir(CLEANUP => 1);
+
+ok(! -e "$rtdir/i3", "$rtdir/i3 does not exist yet");
+
+$i3cmd = "export XDG_RUNTIME_DIR=$rtdir; exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+ok(-d "$rtdir/i3", "$rtdir/i3 exists and is a directory");
+$socketpath = "$rtdir/i3/ipc-socket." . $process->pid;
+ok(-S $socketpath, "file $socketpath exists and is a socket");
+
+exit_gracefully($process->pid, $socketpath);
+
+sleep 0.25;
+
+#####################################################################
+# configuration file case: socket gets placed whereever we specify
+#####################################################################
+
+my $tmpdir = tempdir(CLEANUP => 1);
+$socketpath = $tmpdir . "/config.sock";
+ok(! -e $socketpath, "$socketpath does not exist yet");
+
+($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+close($fh);
+
+$i3cmd = "export XDG_RUNTIME_DIR=$rtdir; exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+ok(-S $socketpath, "file $socketpath exists and is a socket");
+
+exit_gracefully($process->pid, $socketpath);
+
+done_testing;
diff --git a/testcases/t/61-regress-borders-restart.t b/testcases/t/61-regress-borders-restart.t
new file mode 100644 (file)
index 0000000..1acf6c6
--- /dev/null
@@ -0,0 +1,39 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test to check if borders are correctly restored after an inplace
+# restart.
+# found in eb8ad348b28e243cba1972e802ca8ee636472fc9
+#
+use X11::XCB qw(:all);
+use List::Util qw(first);
+use i3test;
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+my $tmp = fresh_workspace;
+my $window = open_standard_window($x);
+
+sub get_border_style {
+    my @content = @{get_ws_content($tmp)};
+    my $wininfo = first { $_->{window} == $window->id } @content;
+
+    return $wininfo->{border};
+}
+
+is(get_border_style(), 'normal', 'border style normal');
+
+cmd 'border 1pixel';
+
+is(get_border_style(), '1pixel', 'border style 1pixel after changing');
+
+# perform an inplace-restart
+cmd 'restart';
+
+sleep 0.25;
+
+does_i3_live;
+
+is(get_border_style(), '1pixel', 'border style still 1pixel after restart');
+
+done_testing;
diff --git a/testcases/t/62-regress-dock-urgent.t b/testcases/t/62-regress-dock-urgent.t
new file mode 100644 (file)
index 0000000..8d18873
--- /dev/null
@@ -0,0 +1,59 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Regression test for setting the urgent hint on dock clients.
+# found in 4be3178d4d360c2996217d811e61161c84d25898
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+}
+
+my $x = X11::XCB::Connection->new;
+my $i3 = i3(get_socket_path());
+
+my $tmp = fresh_workspace;
+
+#####################################################################
+# verify that there is no dock window yet
+#####################################################################
+
+# Children of all dockareas
+my @docked = get_dock_clients;
+
+is(@docked, 0, 'no dock clients yet');
+
+# open a dock client
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30],
+    background_color => '#FF0000',
+    window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+);
+
+$window->map;
+
+sleep 0.25;
+
+#####################################################################
+# check that we can find it in the layout tree at the expected position
+#####################################################################
+
+@docked = get_dock_clients;
+is(@docked, 1, 'one dock client found');
+
+# verify the height
+my $docknode = $docked[0];
+
+is($docknode->{rect}->{height}, 30, 'dock node has unchanged height');
+
+$window->add_hint('urgency');
+
+sleep 0.25;
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/63-wm-state.t b/testcases/t/63-wm-state.t
new file mode 100644 (file)
index 0000000..7e98328
--- /dev/null
@@ -0,0 +1,41 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests if WM_STATE is WM_STATE_NORMAL when mapped and WM_STATE_WITHDRAWN when
+# unmapped.
+#
+use X11::XCB qw(:all);
+use i3test;
+
+BEGIN {
+    use_ok('X11::XCB::Window');
+    use_ok('X11::XCB::Event::Generic');
+    use_ok('X11::XCB::Event::MapNotify');
+    use_ok('X11::XCB::Event::ClientMessage');
+}
+
+my $x = X11::XCB::Connection->new;
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+    event_mask => [ 'structure_notify' ],
+);
+
+$window->name('Window 1');
+$window->map;
+
+diag('window mapped');
+
+sleep 0.5;
+
+is($window->state, ICCCM_WM_STATE_NORMAL, 'WM_STATE normal');
+
+$window->unmap;
+
+sleep 0.5;
+
+is($window->state, ICCCM_WM_STATE_WITHDRAWN, 'WM_STATE withdrawn');
+
+done_testing;
diff --git a/testcases/t/64-kill-win-vs-client.t b/testcases/t/64-kill-win-vs-client.t
new file mode 100644 (file)
index 0000000..2e0669b
--- /dev/null
@@ -0,0 +1,66 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests if WM_STATE is WM_STATE_NORMAL when mapped and WM_STATE_WITHDRAWN when
+# unmapped.
+#
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+use i3test;
+
+my $x = X11::XCB::Connection->new;
+
+sub two_windows {
+    my $tmp = fresh_workspace;
+
+    ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+    my $first = open_standard_window($x);
+    my $second = open_standard_window($x);
+
+    is($x->input_focus, $second->id, 'second window focused');
+    ok(@{get_ws_content($tmp)} == 2, 'two containers opened');
+
+    return $tmp;
+}
+
+##############################################################
+# 1: open two windows (in the same client), kill one and see if
+# the other one is still there
+##############################################################
+
+my $tmp = two_windows;
+
+cmd 'kill';
+
+sleep 0.25;
+
+ok(@{get_ws_content($tmp)} == 1, 'one container left after killing');
+
+##############################################################
+# 2: same test case as test 1, but with the explicit variant
+# 'kill window'
+##############################################################
+
+my $tmp = two_windows;
+
+cmd 'kill window';
+
+sleep 0.25;
+
+ok(@{get_ws_content($tmp)} == 1, 'one container left after killing');
+
+##############################################################
+# 3: open two windows (in the same client), use 'kill client'
+# and check if both are gone
+##############################################################
+
+my $tmp = two_windows;
+
+cmd 'kill client';
+
+sleep 0.25;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers left after killing');
+
+done_testing;
diff --git a/testcases/t/65-for_window.t b/testcases/t/65-for_window.t
new file mode 100644 (file)
index 0000000..d295254
--- /dev/null
@@ -0,0 +1,160 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+#
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+use i3test;
+
+my $x = X11::XCB::Connection->new;
+
+my $tmp = fresh_workspace;
+
+##############################################################
+# 1: test the following directive:
+#    for_window [class="borderless"] border none
+# by first creating a window with a different class (should get
+# the normal border), then creating a window with the class
+# "borderless" (should get no border)
+##############################################################
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+);
+
+$window->name('Border window');
+$window->map;
+sleep 0.25;
+
+my @content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 1, 'one node on this workspace now');
+is($content[0]->{border}, 'normal', 'normal border');
+
+$window->unmap;
+sleep 0.25;
+
+my @content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 0, 'no more nodes');
+diag('content = '. Dumper(\@content));
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+);
+
+$window->_create;
+
+# TODO: move this to X11::XCB::Window
+sub set_wm_class {
+    my ($id, $class, $instance) = @_;
+
+    # Add a _NET_WM_STRUT_PARTIAL hint
+    my $atomname = $x->atom(name => 'WM_CLASS');
+    my $atomtype = $x->atom(name => 'STRING');
+
+    $x->change_property(
+        PROP_MODE_REPLACE,
+        $id,
+        $atomname->id,
+        $atomtype->id,
+        8,
+        length($class) + length($instance) + 2,
+        "$instance\x00$class\x00"
+    );
+}
+
+set_wm_class($window->id, 'borderless', 'borderless');
+$window->name('Borderless window');
+$window->map;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 1, 'one node on this workspace now');
+is($content[0]->{border}, 'none', 'no border');
+
+$window->unmap;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 0, 'no more nodes');
+
+##############################################################
+# 2: match on the title, check if for_window is really executed
+# only once
+##############################################################
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+);
+
+$window->name('special title');
+$window->map;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 1, 'one node on this workspace now');
+is($content[0]->{border}, 'normal', 'normal border');
+
+$window->name('special borderless title');
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+is($content[0]->{border}, 'none', 'no border');
+
+$window->name('special title');
+sleep 0.25;
+
+cmd 'border normal';
+
+@content = @{get_ws_content($tmp)};
+is($content[0]->{border}, 'normal', 'border reset to normal');
+
+$window->name('special borderless title');
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+is($content[0]->{border}, 'normal', 'still normal border');
+
+$window->unmap;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 0, 'no more nodes');
+
+##############################################################
+# 3: match on the title, set border style *and* a mark
+##############################################################
+
+$window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#00ff00',
+);
+
+$window->name('special mark title');
+$window->map;
+sleep 0.25;
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 1, 'one node on this workspace now');
+is($content[0]->{border}, 'none', 'no border');
+
+my $other = open_standard_window($x);
+
+@content = @{get_ws_content($tmp)};
+cmp_ok(@content, '==', 2, 'two nodes');
+is($content[0]->{border}, 'none', 'no border');
+is($content[1]->{border}, 'normal', 'normal border');
+ok(!$content[0]->{focused}, 'first one not focused');
+
+cmd qq|[con_mark="bleh"] focus|;
+
+@content = @{get_ws_content($tmp)};
+ok($content[0]->{focused}, 'first node focused');
+
+done_testing;
diff --git a/testcases/t/66-assign.t b/testcases/t/66-assign.t
new file mode 100644 (file)
index 0000000..8e70127
--- /dev/null
@@ -0,0 +1,228 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3
+#
+# Tests if assignments work
+#
+use i3test;
+use Cwd qw(abs_path);
+use Proc::Background;
+use File::Temp qw(tempfile tempdir);
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+use v5.10;
+
+my $x = X11::XCB::Connection->new;
+
+# assuming we are run by complete-run.pl
+my $i3_path = abs_path("../i3");
+
+# TODO: move to X11::XCB
+sub set_wm_class {
+    my ($id, $class, $instance) = @_;
+
+    # Add a _NET_WM_STRUT_PARTIAL hint
+    my $atomname = $x->atom(name => 'WM_CLASS');
+    my $atomtype = $x->atom(name => 'STRING');
+
+    $x->change_property(
+        PROP_MODE_REPLACE,
+        $id,
+        $atomname->id,
+        $atomtype->id,
+        8,
+        length($class) + length($instance) + 2,
+        "$instance\x00$class\x00"
+    );
+}
+
+
+#####################################################################
+# start a window and see that it does not get assigned with an empty config
+#####################################################################
+
+my $socketpath = File::Temp::tempnam('/tmp', 'i3-test-socket-');
+
+my ($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+close($fh);
+
+diag("Starting i3");
+my $i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+my $process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#0000ff',
+);
+
+$window->_create;
+set_wm_class($window->id, 'special', 'special');
+$window->name('special window');
+$window->map;
+sleep 0.25;
+
+ok(@{get_ws_content($tmp)} == 1, 'special window got managed to current (random) workspace');
+
+exit_gracefully($process->pid);
+
+$window->destroy;
+
+sleep 0.25;
+
+#####################################################################
+# start a window and see that it gets assigned to a formerly unused
+# workspace
+#####################################################################
+
+($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+say $fh q|assign "special" → targetws|;
+close($fh);
+
+diag("Starting i3");
+$i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+my $workspaces = get_workspace_names;
+ok(!("targetws" ~~ @{$workspaces}), 'targetws does not exist yet');
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#0000ff',
+);
+
+$window->_create;
+set_wm_class($window->id, 'special', 'special');
+$window->name('special window');
+$window->map;
+sleep 0.25;
+
+ok(@{get_ws_content($tmp)} == 0, 'still no containers');
+ok("targetws" ~~ @{get_workspace_names()}, 'targetws exists');
+
+$window->destroy;
+
+exit_gracefully($process->pid);
+
+sleep 0.25;
+
+#####################################################################
+# start a window and see that it gets assigned to a workspace which has content
+# already, next to the existing node.
+#####################################################################
+
+diag("Starting i3");
+$i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+# initialize the target workspace, then go to a fresh one
+ok(!("targetws" ~~ @{get_workspace_names()}), 'targetws does not exist yet');
+cmd 'workspace targetws';
+cmp_ok(@{get_ws_content('targetws')}, '==', 0, 'no containers on targetws yet');
+cmd 'open';
+cmp_ok(@{get_ws_content('targetws')}, '==', 1, 'one container on targetws');
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+ok("targetws" ~~ @{get_workspace_names()}, 'targetws does not exist yet');
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#0000ff',
+);
+
+$window->_create;
+set_wm_class($window->id, 'special', 'special');
+$window->name('special window');
+$window->map;
+sleep 0.25;
+
+ok(@{get_ws_content($tmp)} == 0, 'still no containers');
+ok(@{get_ws_content('targetws')} == 2, 'two containers on targetws');
+
+exit_gracefully($process->pid);
+
+#####################################################################
+# start a window and see that it gets assigned to a workspace which has content
+# already, next to the existing node.
+#####################################################################
+
+($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+say $fh q|assign "special" → ~|;
+close($fh);
+
+diag("Starting i3");
+$i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+my $workspaces = get_workspace_names;
+ok(!("targetws" ~~ @{$workspaces}), 'targetws does not exist yet');
+
+my $window = $x->root->create_child(
+    class => WINDOW_CLASS_INPUT_OUTPUT,
+    rect => [ 0, 0, 30, 30 ],
+    background_color => '#0000ff',
+);
+
+$window->_create;
+set_wm_class($window->id, 'special', 'special');
+$window->name('special window');
+$window->map;
+sleep 0.25;
+
+my $content = get_ws($tmp);
+ok(@{$content->{nodes}} == 0, 'no tiling cons');
+ok(@{$content->{floating_nodes}} == 1, 'one floating con');
+
+$window->destroy;
+
+exit_gracefully($process->pid);
+
+sleep 0.25;
+
+done_testing;
diff --git a/testcases/t/67-workspace_layout.t b/testcases/t/67-workspace_layout.t
new file mode 100644 (file)
index 0000000..cfe8bf6
--- /dev/null
@@ -0,0 +1,149 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3
+#
+# Tests the workspace_layout config option.
+#
+
+use i3test;
+use Cwd qw(abs_path);
+use Proc::Background;
+use File::Temp qw(tempfile tempdir);
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+
+my $x = X11::XCB::Connection->new;
+
+# assuming we are run by complete-run.pl
+my $i3_path = abs_path("../i3");
+
+#####################################################################
+# 1: check that with an empty config, cons are place next to each
+# other and no split containers are created
+#####################################################################
+
+my $socketpath = File::Temp::tempnam('/tmp', 'i3-test-socket-');
+
+my ($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+close($fh);
+
+diag("Starting i3");
+my $i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+my $process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $first = open_standard_window($x);
+my $second = open_standard_window($x);
+
+is($x->input_focus, $second->id, 'second window focused');
+ok(@{get_ws_content($tmp)} == 2, 'two containers opened');
+isnt($content[0]->{layout}, 'stacked', 'layout not stacked');
+isnt($content[1]->{layout}, 'stacked', 'layout not stacked');
+
+exit_gracefully($process->pid);
+
+#####################################################################
+# 2: set workspace_layout stacked, check that when opening two cons,
+# they end up in a stacked con
+#####################################################################
+
+($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+say $fh "workspace_layout stacked";
+close($fh);
+
+diag("Starting i3");
+$i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+$first = open_standard_window($x);
+$second = open_standard_window($x);
+
+is($x->input_focus, $second->id, 'second window focused');
+my @content = @{get_ws_content($tmp)};
+ok(@content == 1, 'one con at workspace level');
+is($content[0]->{layout}, 'stacked', 'layout stacked');
+
+#####################################################################
+# 3: focus parent, open two new cons, check that they end up in a stacked
+# con
+#####################################################################
+
+cmd 'focus parent';
+my $right_top = open_standard_window($x);
+my $right_bot = open_standard_window($x);
+
+@content = @{get_ws_content($tmp)};
+is(@content, 2, 'two cons at workspace level after focus parent');
+is($content[0]->{layout}, 'stacked', 'layout stacked');
+is($content[1]->{layout}, 'stacked', 'layout stacked');
+
+#####################################################################
+# 4: move one of the cons to the right, check that it will end up in
+# a stacked con
+#####################################################################
+
+cmd 'move right';
+
+@content = @{get_ws_content($tmp)};
+is(@content, 3, 'three cons at workspace level after move');
+is($content[0]->{layout}, 'stacked', 'layout stacked');
+is($content[1]->{layout}, 'stacked', 'layout stacked');
+is($content[2]->{layout}, 'stacked', 'layout stacked');
+
+#####################################################################
+# 5: move it to the left again, check that the stacked con is deleted
+#####################################################################
+
+cmd 'move left';
+
+@content = @{get_ws_content($tmp)};
+is(@content, 2, 'two cons at workspace level after moving back');
+is($content[0]->{layout}, 'stacked', 'layout stacked');
+is($content[1]->{layout}, 'stacked', 'layout stacked');
+
+#####################################################################
+# 6: move it to a different workspace, check that it ends up in a
+# stacked con
+#####################################################################
+
+my $otmp = get_unused_workspace;
+
+cmd "move workspace $otmp";
+
+@content = @{get_ws_content($tmp)};
+is(@content, 2, 'still two cons on this workspace');
+is($content[0]->{layout}, 'stacked', 'layout stacked');
+is($content[1]->{layout}, 'stacked', 'layout stacked');
+
+@content = @{get_ws_content($otmp)};
+is(@content, 1, 'one con on target workspace');
+is($content[0]->{layout}, 'stacked', 'layout stacked');
+
+exit_gracefully($process->pid);
+
+done_testing;
diff --git a/testcases/t/68-regress-fullscreen-restart.t b/testcases/t/68-regress-fullscreen-restart.t
new file mode 100644 (file)
index 0000000..fcc9ac7
--- /dev/null
@@ -0,0 +1,28 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Verifies that i3 survives inplace restarts with fullscreen containers
+#
+use i3test;
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+
+my $x = X11::XCB::Connection->new;
+
+fresh_workspace;
+
+open_standard_window($x);
+open_standard_window($x);
+
+cmd 'layout stacking';
+sleep 1;
+
+cmd 'fullscreen';
+sleep 1;
+
+cmd 'restart';
+sleep 1;
+
+does_i3_live;
+
+done_testing;
diff --git a/testcases/t/69-border-toggle.t b/testcases/t/69-border-toggle.t
new file mode 100644 (file)
index 0000000..aec8df6
--- /dev/null
@@ -0,0 +1,40 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests if the 'border toggle' command works correctly
+#
+use i3test;
+
+my $tmp = fresh_workspace;
+
+cmd 'open';
+
+my @nodes = @{get_ws_content($tmp)};
+is(@nodes, 1, 'one container on this workspace');
+is($nodes[0]->{border}, 'normal', 'border style normal');
+
+cmd 'border 1pixel';
+@nodes = @{get_ws_content($tmp)};
+is($nodes[0]->{border}, '1pixel', 'border style 1pixel');
+
+cmd 'border none';
+@nodes = @{get_ws_content($tmp)};
+is($nodes[0]->{border}, 'none', 'border style none');
+
+cmd 'border normal';
+@nodes = @{get_ws_content($tmp)};
+is($nodes[0]->{border}, 'normal', 'border style back to normal');
+
+cmd 'border toggle';
+@nodes = @{get_ws_content($tmp)};
+is($nodes[0]->{border}, 'none', 'border style none');
+
+cmd 'border toggle';
+@nodes = @{get_ws_content($tmp)};
+is($nodes[0]->{border}, '1pixel', 'border style 1pixel');
+
+cmd 'border toggle';
+@nodes = @{get_ws_content($tmp)};
+is($nodes[0]->{border}, 'normal', 'border style back to normal');
+
+done_testing;
diff --git a/testcases/t/70-force_focus_wrapping.t b/testcases/t/70-force_focus_wrapping.t
new file mode 100644 (file)
index 0000000..020a360
--- /dev/null
@@ -0,0 +1,119 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3
+#
+# Tests if the 'force_focus_wrapping' config directive works correctly.
+#
+use i3test;
+use Cwd qw(abs_path);
+use Proc::Background;
+use File::Temp qw(tempfile tempdir);
+use X11::XCB qw(:all);
+use X11::XCB::Connection;
+
+my $x = X11::XCB::Connection->new;
+
+# assuming we are run by complete-run.pl
+my $i3_path = abs_path("../i3");
+my $socketpath = File::Temp::tempnam('/tmp', 'i3-test-socket-');
+
+#####################################################################
+# 1: test the wrapping behaviour without force_focus_wrapping
+#####################################################################
+
+my ($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+close($fh);
+
+diag("Starting i3");
+my $i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+my $process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+my $tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+my $first = open_standard_window($x);
+my $second = open_standard_window($x);
+
+cmd 'layout tabbed';
+cmd 'focus parent';
+
+my $third = open_standard_window($x);
+is($x->input_focus, $third->id, 'third window focused');
+
+cmd 'focus left';
+is($x->input_focus, $second->id, 'second window focused');
+
+cmd 'focus left';
+is($x->input_focus, $first->id, 'first window focused');
+
+# now test the wrapping
+cmd 'focus left';
+is($x->input_focus, $second->id, 'second window focused');
+
+# but focusing right should not wrap now, but instead focus the third window
+cmd 'focus right';
+is($x->input_focus, $third->id, 'third window focused');
+
+exit_gracefully($process->pid);
+
+#####################################################################
+# 2: test the wrapping behaviour with force_focus_wrapping
+#####################################################################
+
+($fh, $tmpfile) = tempfile();
+say $fh "# i3 config file (v4)";
+say $fh "font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1";
+say $fh "ipc-socket $socketpath";
+say $fh "force_focus_wrapping true";
+close($fh);
+
+diag("Starting i3");
+$i3cmd = "exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c $tmpfile >/dev/null 2>/dev/null";
+$process = Proc::Background->new($i3cmd);
+sleep 1;
+
+# force update of the cached socket path in lib/i3test
+get_socket_path(0);
+
+diag("pid = " . $process->pid);
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+$first = open_standard_window($x);
+$second = open_standard_window($x);
+
+cmd 'layout tabbed';
+cmd 'focus parent';
+
+$third = open_standard_window($x);
+is($x->input_focus, $third->id, 'third window focused');
+
+cmd 'focus left';
+is($x->input_focus, $second->id, 'second window focused');
+
+cmd 'focus left';
+is($x->input_focus, $first->id, 'first window focused');
+
+# now test the wrapping
+cmd 'focus left';
+is($x->input_focus, $second->id, 'second window focused');
+
+# focusing right should now be forced to wrap
+cmd 'focus right';
+is($x->input_focus, $first->id, 'first window focused');
+
+exit_gracefully($process->pid);
+
+done_testing;
diff --git a/testcases/t/71-config-migrate.t b/testcases/t/71-config-migrate.t
new file mode 100644 (file)
index 0000000..4e97fb2
--- /dev/null
@@ -0,0 +1,345 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3
+#
+# Tests if i3-migrate-config-to-v4 correctly migrates all config file
+# directives and commands
+#
+use i3test;
+use Cwd qw(abs_path);
+use Proc::Background;
+use File::Temp qw(tempfile tempdir);
+use POSIX qw(getuid);
+use Data::Dumper;
+use v5.10;
+
+# reads in a whole file
+sub slurp {
+    open my $fh, '<', shift;
+    local $/;
+    <$fh>;
+}
+
+sub migrate_config {
+    my ($config) = @_;
+
+    my ($fh, $tmpfile) = tempfile();
+    print $fh $config;
+    close($fh);
+
+    my $cmd = "sh -c 'exec " . abs_path("../i3-migrate-config-to-v4") . " --v3 <$tmpfile'";
+    return [ split /\n/, qx($cmd) ];
+}
+
+sub line_exists {
+    my ($lines, $pattern) = @_;
+
+    for my $line (@$lines) {
+        return 1 if $line =~ $pattern;
+    }
+
+    return 0
+}
+
+#####################################################################
+# check that some directives remain untouched
+#####################################################################
+
+my $input = <<EOT;
+    font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+EOT
+
+my $output = migrate_config($input);
+ok(line_exists($output, qr|font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1|), 'font directive unchanged');
+
+$input = <<EOT;
+    floating_Modifier Mod1
+    focus_follows_mouse true
+    ipc-socket /tmp/i3-ipc.sock
+    ipc_socket /tmp/i3-ipc.sock
+    exec /usr/bin/i3
+    set stuff Mod1
+    assign "XTerm" → 3
+    assign "XTerm" → ~5
+    client.focused #2F343A #900000 #FFFFFF
+    client.focused_inactive #FF0000 #FF0000 #FF0000
+    client.unfocused #00FF00 #00FF00 #00FF00
+    client.urgent #0000FF #0000FF #0000FF
+    client.background #000000
+EOT
+
+$output = migrate_config($input);
+ok(line_exists($output, qr|^floating_Modifier Mod1$|), 'floating_modifier unchanged');
+ok(line_exists($output, qr|^focus_follows_mouse true$|), 'focus_follows_mouse unchanged');
+ok(line_exists($output, qr|^ipc-socket /tmp/i3-ipc.sock$|), 'ipc-socket unchanged');
+ok(line_exists($output, qr|^ipc_socket /tmp/i3-ipc.sock$|), 'ipc_socket unchanged');
+ok(line_exists($output, qr|^exec /usr/bin/i3|), 'exec unchanged');
+ok(line_exists($output, qr|^set stuff Mod1|), 'set unchanged');
+ok(line_exists($output, qr|^assign "XTerm" → 3|), 'assign unchanged');
+ok(line_exists($output, qr|^assign "XTerm" → ~5|), 'assign unchanged');
+ok(line_exists($output, qr|^client\.focused #2F343A #900000 #FFFFFF$|), 'client.focused unchanged');
+ok(line_exists($output, qr|^client\.focused_inactive #FF0000 #FF0000 #FF0000$|), 'client.focused_inactive unchanged');
+ok(line_exists($output, qr|^client\.unfocused #00FF00 #00FF00 #00FF00$|), 'client.unfocused unchanged');
+ok(line_exists($output, qr|^client\.urgent #0000FF #0000FF #0000FF$|), 'client.urgent unchanged');
+ok(line_exists($output, qr|^client\.background #000000$|), 'client.background unchanged');
+
+#####################################################################
+# check whether the bar colors get removed properly
+#####################################################################
+
+$input = <<EOT;
+    bar.focused #FFFF00 #FFFF00 #FFFF00
+    bar.unfocused #FFFF00 #FFFF00 #FFFF00
+    bar.urgent #FFFF00 #FFFF00 #FFFF00
+EOT
+
+$output = migrate_config($input);
+ok(!line_exists($output, qr|^bar\.|), 'no bar. lines');
+ok(line_exists($output, qr|^#.*REMOVED bar|), 'note bar. removed');
+
+
+#####################################################################
+# check whether the other directives get converted correctly
+#####################################################################
+
+$input = <<EOT;
+    new_container stacking
+    workspace_bar no
+    new_window bb
+EOT
+
+$output = migrate_config($input);
+ok(line_exists($output, qr|^workspace_layout stacking$|), 'new_container changed');
+ok(line_exists($output, qr|REMOVED workspace_bar|), 'workspace_bar removed');
+ok(!line_exists($output, qr|^workspace_bar|), 'no workspace_bar in the output');
+ok(line_exists($output, qr|^new_window none$|), 'new_window changed');
+
+#####################################################################
+# check whether new_window's parameters get changed correctly
+#####################################################################
+
+$output = migrate_config('new_window bb');
+ok(line_exists($output, qr|^new_window none$|), 'new_window bb changed');
+
+$output = migrate_config('new_window bn');
+ok(line_exists($output, qr|^new_window normal$|), 'new_window bn changed');
+
+$output = migrate_config('new_window bp');
+ok(line_exists($output, qr|^new_window 1pixel$|), 'new_window bp changed');
+
+#####################################################################
+# check that some commands remain untouched
+#####################################################################
+
+$input = <<EOT;
+    bindsym Mod1+s exec /usr/bin/urxvt
+    bindsym Mod1+s mark foo
+    bindsym Mod1+s restart
+    bindsym Mod1+s reload
+    bindsym Mod1+s exit
+    bindsym Mod1+s stack-limit cols 2
+    bindsym Mod1+s stack-limit rows 3
+    bind Mod1+c exec /usr/bin/urxvt
+    mode "asdf" {
+        bind 36 mode default
+    }
+EOT
+
+$output = migrate_config($input);
+ok(line_exists($output, qr|^bindsym Mod1\+s exec /usr/bin/urxvt$|), 'exec unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+s mark foo$|), 'mark unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+s restart$|), 'restart unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+s reload$|), 'reload unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+s exit$|), 'exit unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+s stack-limit cols 2$|), 'stack-limit unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+s stack-limit rows 3$|), 'stack-limit unchanged');
+ok(line_exists($output, qr|^bindcode Mod1\+c exec /usr/bin/urxvt$|), 'bind changed to bindcode');
+ok(line_exists($output, qr|^mode "asdf" {$|), 'mode asdf unchanged');
+ok(line_exists($output, qr|^bindcode 36 mode \"default\"$|), 'mode default unchanged');
+ok(line_exists($output, qr|^}$|), 'closing mode bracket still there');
+
+#####################################################################
+# check the simple command replacements
+#####################################################################
+
+$input = <<EOT;
+    bindsym Mod1+s s
+    bindsym Mod1+s d
+    bindsym Mod1+s T
+
+    bindsym Mod1+s f
+    bindsym Mod1+s fg
+
+    bindsym Mod1+s t
+
+    bindsym Mod1+s h
+    bindsym Mod1+s j
+    bindsym Mod1+s k
+    bindsym Mod1+s l
+
+    bindsym Mod1+s mh
+    bindsym Mod1+s mj
+    bindsym Mod1+s mk
+    bindsym Mod1+s ml
+
+    bindsym Mod1+s bn
+    bindsym Mod1+s bp
+    bindsym Mod1+s bb
+    bindsym Mod1+s bt
+
+    bindsym Mod1+j wch
+    bindsym Mod1+j wcml
+
+    bindsym Mod1+k kill
+
+    bindsym Mod1+n nw
+    bindsym Mod1+p pw
+EOT
+
+$output = migrate_config($input);
+ok(line_exists($output, qr|^bindsym Mod1\+s layout stacking$|), 's replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s layout default$|), 'd replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s layout tabbed$|), 'T replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s fullscreen$|), 'f replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s fullscreen global$|), 'fg replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s floating toggle$|), 't replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s focus left$|), 'h replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s focus down$|), 'j replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s focus up$|), 'k replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s focus right$|), 'l replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s move left$|), 'mh replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s move down$|), 'mj replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s move up$|), 'mk replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s move right$|), 'ml replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s border normal$|), 'bn replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s border 1pixel$|), 'bp replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s border none$|), 'bb replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+s border toggle$|), 'bt replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+j focus parent; focus left$|), 'with container replaced with focus parent; focus left');
+ok(line_exists($output, qr|^bindsym Mod1\+j focus parent; move right$|), 'with container replaced with focus parent; move right');
+ok(line_exists($output, qr|^bindsym Mod1\+k kill$|), 'kill unchanged');
+ok(line_exists($output, qr|^bindsym Mod1\+n workspace next$|), 'nw replaced');
+ok(line_exists($output, qr|^bindsym Mod1\+p workspace prev$|), 'pw replaced');
+
+#####################################################################
+# check more advanced replacements
+#####################################################################
+
+$input = <<EOT;
+    bindsym Mod1+s goto foo
+EOT
+
+$output = migrate_config($input);
+ok(line_exists($output, qr|^bindsym Mod1\+s \[con_mark="foo"\] focus$|), 'goto replaced');
+
+#####################################################################
+# check whether focus's parameters get changed correctly
+#####################################################################
+
+$output = migrate_config('bindsym Mod1+f focus 3');
+ok(line_exists($output, qr|^#.*focus.*obsolete.*focus 3$|), 'focus [number] gone');
+
+$output = migrate_config('bindsym Mod1+f focus floating');
+ok(line_exists($output, qr|^bindsym Mod1\+f focus floating$|), 'focus floating unchanged');
+
+$output = migrate_config('bindsym Mod1+f focus tiling');
+ok(line_exists($output, qr|^bindsym Mod1\+f focus tiling$|), 'focus tiling unchanged');
+
+$output = migrate_config('bindsym Mod1+f focus ft');
+ok(line_exists($output, qr|^bindsym Mod1\+f focus mode_toggle$|), 'focus ft changed');
+
+#####################################################################
+# check whether resize's parameters get changed correctly
+#####################################################################
+
+$output = migrate_config('bindsym Mod1+f resize left +10');
+ok(line_exists($output, qr|^bindsym Mod1\+f resize grow left 10 px$|), 'resize left changed');
+
+$output = migrate_config('bindsym Mod1+f resize top -20');
+ok(line_exists($output, qr|^bindsym Mod1\+f resize shrink top 20 px$|), 'resize top changed');
+
+$output = migrate_config('bindsym Mod1+f resize right -20');
+ok(line_exists($output, qr|^bindsym Mod1\+f resize shrink right 20 px$|), 'resize right changed');
+
+$output = migrate_config('bindsym Mod1+f resize bottom +23');
+ok(line_exists($output, qr|^bindsym Mod1\+f resize grow bottom 23 px$|), 'resize bottom changed');
+
+#####################################################################
+# check whether jump's parameters get changed correctly
+#####################################################################
+
+$output = migrate_config('bindsym Mod1+f jump 3');
+ok(line_exists($output, qr|^#.*obsolete.*jump 3$|), 'jump to workspace removed');
+
+$output = migrate_config('bindsym Mod1+f jump 3 4 5');
+ok(line_exists($output, qr|^#.*obsolete.*jump 3 4 5$|), 'jump to workspace + col/row removed');
+
+$output = migrate_config('bindsym Mod1+f jump "XTerm"');
+ok(line_exists($output, qr|^bindsym Mod1\+f \[class="XTerm"\] focus$|), 'jump changed');
+
+$output = migrate_config('bindsym Mod1+f jump "XTerm/irssi"');
+ok(line_exists($output, qr|^bindsym Mod1\+f \[class="XTerm" title="irssi"\] focus$|), 'jump changed');
+
+#####################################################################
+# check whether workspace commands are handled correctly
+#####################################################################
+
+$output = migrate_config('workspace 3 output VGA-1');
+ok(line_exists($output, qr|^workspace 3 output VGA-1$|), 'workspace assignment unchanged');
+
+$output = migrate_config('workspace 3 work');
+ok(!line_exists($output, qr|^workspace|), 'workspace name not present');
+ok(line_exists($output, qr|#.*workspace name.*bindings|), 'note present');
+
+$input = <<EOT;
+    workspace 3 work
+    bindsym Mod1+3 3
+EOT
+$output = migrate_config($input);
+ok(!line_exists($output, qr|^workspace|), 'workspace name not present');
+ok(line_exists($output, qr|^bindsym Mod1\+3 workspace work|), 'named workspace in bindings');
+
+# The same, but in reverse order
+$input = <<EOT;
+    bindsym Mod1+3 3
+    workspace 3 work
+EOT
+$output = migrate_config($input);
+ok(!line_exists($output, qr|^workspace|), 'workspace name not present');
+ok(line_exists($output, qr|^bindsym Mod1\+3 workspace work|), 'named workspace in bindings');
+
+$output = migrate_config('bindsym Mod1+3 3');
+ok(line_exists($output, qr|^bindsym Mod1\+3 workspace 3|), 'workspace changed');
+
+$output = migrate_config('bindsym Mod1+3 m3');
+ok(line_exists($output, qr|^bindsym Mod1\+3 move workspace 3|), 'move workspace changed');
+
+$input = <<EOT;
+    workspace 3 work
+    bindsym Mod1+3 m3
+EOT
+$output = migrate_config($input);
+ok(!line_exists($output, qr|^workspace|), 'workspace name not present');
+ok(line_exists($output, qr|^bindsym Mod1\+3 move workspace work|), 'move to named workspace in bindings');
+
+#####################################################################
+# check whether an i3bar call is added if the workspace bar bar was enabled
+#####################################################################
+
+$output = migrate_config('');
+ok(line_exists($output, qr|i3bar|), 'i3bar added');
+
+$output = migrate_config('workspace_bar enable');
+ok(line_exists($output, qr|i3bar|), 'i3bar added');
+
+$output = migrate_config('workspace_bar no');
+ok(!line_exists($output, qr|i3bar|), 'no i3bar added');
+
+#####################################################################
+# check whether the mode command gets quotes
+#####################################################################
+
+$output = migrate_config('bindsym Mod1+m mode foobar');
+ok(line_exists($output, qr|^bindsym Mod1\+m mode "foobar"|), 'mode got quotes');
+
+done_testing();
diff --git a/testcases/t/lib/i3test.pm b/testcases/t/lib/i3test.pm
new file mode 100644 (file)
index 0000000..bd40f56
--- /dev/null
@@ -0,0 +1,232 @@
+package i3test;
+# vim:ts=4:sw=4:expandtab
+
+use File::Temp qw(tmpnam);
+use Test::Builder;
+use X11::XCB::Rect;
+use X11::XCB::Window;
+use X11::XCB qw(:all);
+use AnyEvent::I3;
+use List::Util qw(first);
+use List::MoreUtils qw(lastval);
+use Time::HiRes qw(sleep);
+use Try::Tiny;
+use v5.10;
+
+use Exporter ();
+our @EXPORT = qw(get_workspace_names get_unused_workspace fresh_workspace get_ws_content get_ws get_focused open_empty_con open_standard_window get_dock_clients cmd does_i3_live exit_gracefully workspace_exists focused_ws get_socket_path);
+
+my $tester = Test::Builder->new();
+my $_cached_socket_path = undef;
+
+BEGIN {
+    my $window_count = 0;
+    sub counter_window {
+        return $window_count++;
+    }
+}
+
+sub import {
+    my $class = shift;
+    my $pkg = caller;
+    eval "package $pkg;
+use Test::Most" . (@_ > 0 ? " qw(@_)" : "") . ";
+use Data::Dumper;
+use AnyEvent::I3;
+use Time::HiRes qw(sleep);
+use Test::Deep qw(eq_deeply cmp_deeply cmp_set cmp_bag cmp_methods useclass noclass set bag subbagof superbagof subsetof supersetof superhashof subhashof bool str arraylength Isa ignore methods regexprefonly regexpmatches num regexponly scalref reftype hashkeysonly blessed array re hash regexpref hash_each shallow array_each code arrayelementsonly arraylengthonly scalarrefonly listmethods any hashkeys isa);
+use v5.10;
+use strict;
+use warnings;
+";
+    @_ = ($class);
+    goto \&Exporter::import;
+}
+
+sub open_standard_window {
+    my ($x, $color) = @_;
+
+    $color ||= '#c0c0c0';
+
+    my $window = $x->root->create_child(
+        class => WINDOW_CLASS_INPUT_OUTPUT,
+        rect => [ 0, 0, 30, 30 ],
+        background_color => $color,
+    );
+
+    $window->name('Window ' . counter_window());
+    $window->map;
+
+    sleep(0.25);
+
+    return $window;
+}
+
+sub open_empty_con {
+    my ($i3) = @_;
+
+    my $reply = $i3->command('open')->recv;
+    return $reply->{id};
+}
+
+sub get_workspace_names {
+    my $i3 = i3(get_socket_path());
+    my $tree = $i3->get_tree->recv;
+    my @outputs = @{$tree->{nodes}};
+    my @cons;
+    for my $output (@outputs) {
+        # get the first CT_CON of each output
+        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        @cons = (@cons, @{$content->{nodes}});
+    }
+    [ map { $_->{name} } @cons ]
+}
+
+sub get_unused_workspace {
+    my @names = get_workspace_names();
+    my $tmp;
+    do { $tmp = tmpnam() } while ($tmp ~~ @names);
+    $tmp
+}
+
+sub fresh_workspace {
+    my $unused = get_unused_workspace;
+    cmd("workspace $unused");
+    $unused
+}
+
+sub get_ws {
+    my ($name) = @_;
+    my $i3 = i3(get_socket_path());
+    my $tree = $i3->get_tree->recv;
+
+    my @outputs = @{$tree->{nodes}};
+    my @workspaces;
+    for my $output (@outputs) {
+        # get the first CT_CON of each output
+        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        @workspaces = (@workspaces, @{$content->{nodes}});
+    }
+
+    # as there can only be one workspace with this name, we can safely
+    # return the first entry
+    return first { $_->{name} eq $name } @workspaces;
+}
+
+#
+# returns the content (== tree, starting from the node of a workspace)
+# of a workspace. If called in array context, also includes the focus
+# stack of the workspace
+#
+sub get_ws_content {
+    my ($name) = @_;
+    my $con = get_ws($name);
+    return wantarray ? ($con->{nodes}, $con->{focus}) : $con->{nodes};
+}
+
+sub get_focused {
+    my ($ws) = @_;
+    my $con = get_ws($ws);
+
+    my @focused = @{$con->{focus}};
+    my $lf;
+    while (@focused > 0) {
+        $lf = $focused[0];
+        last unless defined($con->{focus});
+        @focused = @{$con->{focus}};
+        @cons = grep { $_->{id} == $lf } (@{$con->{nodes}}, @{$con->{'floating_nodes'}});
+        $con = $cons[0];
+    }
+
+    return $lf;
+}
+
+sub get_dock_clients {
+    my $which = shift;
+
+    my $tree = i3(get_socket_path())->get_tree->recv;
+    my @outputs = @{$tree->{nodes}};
+    # Children of all dockareas
+    my @docked;
+    for my $output (@outputs) {
+        if (!defined($which)) {
+            @docked = (@docked, map { @{$_->{nodes}} }
+                                grep { $_->{type} == 5 }
+                                @{$output->{nodes}});
+        } elsif ($which eq 'top') {
+            my $first = first { $_->{type} == 5 } @{$output->{nodes}};
+            @docked = (@docked, @{$first->{nodes}});
+        } elsif ($which eq 'bottom') {
+            my $last = lastval { $_->{type} == 5 } @{$output->{nodes}};
+            @docked = (@docked, @{$last->{nodes}});
+        }
+    }
+    return @docked;
+}
+
+sub cmd {
+    i3(get_socket_path())->command(@_)->recv
+}
+
+sub workspace_exists {
+    my ($name) = @_;
+    ($name ~~ @{get_workspace_names()})
+}
+
+sub focused_ws {
+    my $i3 = i3(get_socket_path());
+    my $tree = $i3->get_tree->recv;
+    my @outputs = @{$tree->{nodes}};
+    my @cons;
+    for my $output (@outputs) {
+        # get the first CT_CON of each output
+        my $content = first { $_->{type} == 2 } @{$output->{nodes}};
+        my $first = first { $_->{fullscreen_mode} == 1 } @{$content->{nodes}};
+        return $first->{name}
+    }
+}
+
+sub does_i3_live {
+    my $tree = i3(get_socket_path())->get_tree->recv;
+    my @nodes = @{$tree->{nodes}};
+    my $ok = (@nodes > 0);
+    $tester->ok($ok, 'i3 still lives');
+    return $ok;
+}
+
+# Tries to exit i3 gracefully (with the 'exit' cmd) or kills the PID if that fails
+sub exit_gracefully {
+    my ($pid, $socketpath) = @_;
+    $socketpath ||= get_socket_path();
+
+    my $exited = 0;
+    try {
+        say "Exiting i3 cleanly...";
+        i3($socketpath)->command('exit')->recv;
+        $exited = 1;
+    };
+
+    if (!$exited) {
+        kill(9, $pid) or die "could not kill i3";
+    }
+}
+
+# Gets the socket path from the I3_SOCKET_PATH atom stored on the X11 root window
+sub get_socket_path {
+    my ($cache) = @_;
+    $cache ||= 1;
+
+    if ($cache && defined($_cached_socket_path)) {
+        return $_cached_socket_path;
+    }
+
+    my $x = X11::XCB::Connection->new;
+    my $atom = $x->atom(name => 'I3_SOCKET_PATH');
+    my $cookie = $x->get_property(0, $x->get_root_window(), $atom->id, GET_PROPERTY_TYPE_ANY, 0, 256);
+    my $reply = $x->get_property_reply($cookie->{sequence});
+    my $socketpath = $reply->{value};
+    $_cached_socket_path = $socketpath;
+    return $socketpath;
+}
+
+1
diff --git a/tests/queue.h b/tests/queue.h
new file mode 100644 (file)
index 0000000..75bb957
--- /dev/null
@@ -0,0 +1,527 @@
+/*     $OpenBSD: queue.h,v 1.1 2007/10/26 03:14:08 niallo Exp $        */
+/*     $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $       */
+
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)queue.h     8.5 (Berkeley) 8/20/94
+ */
+
+#ifndef        _SYS_QUEUE_H_
+#define        _SYS_QUEUE_H_
+
+/*
+ * This file defines five types of data structures: singly-linked lists,
+ * lists, simple queues, tail queues, and circular queues.
+ *
+ *
+ * A singly-linked list is headed by a single forward pointer. The elements
+ * are singly linked for minimum space and pointer manipulation overhead at
+ * the expense of O(n) removal for arbitrary elements. New elements can be
+ * added to the list after an existing element or at the head of the list.
+ * Elements being removed from the head of the list should use the explicit
+ * macro for this purpose for optimum efficiency. A singly-linked list may
+ * only be traversed in the forward direction.  Singly-linked lists are ideal
+ * for applications with large datasets and few or no removals or for
+ * implementing a LIFO queue.
+ *
+ * A list is headed by a single forward pointer (or an array of forward
+ * pointers for a hash table header). The elements are doubly linked
+ * so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before
+ * or after an existing element or at the head of the list. A list
+ * may only be traversed in the forward direction.
+ *
+ * A simple queue is headed by a pair of pointers, one the head of the
+ * list and the other to the tail of the list. The elements are singly
+ * linked to save space, so elements can only be removed from the
+ * head of the list. New elements can be added to the list before or after
+ * an existing element, at the head of the list, or at the end of the
+ * list. A simple queue may only be traversed in the forward direction.
+ *
+ * A tail queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or
+ * after an existing element, at the head of the list, or at the end of
+ * the list. A tail queue may be traversed in either direction.
+ *
+ * A circle queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or after
+ * an existing element, at the head of the list, or at the end of the list.
+ * A circle queue may be traversed in either direction, but has a more
+ * complex end of list detection.
+ *
+ * For details on the use of these macros, see the queue(3) manual page.
+ */
+
+#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC))
+#define _Q_INVALIDATE(a) (a) = ((void *)-1)
+#else
+#define _Q_INVALIDATE(a)
+#endif
+
+/*
+ * Singly-linked List definitions.
+ */
+#define SLIST_HEAD(name, type)                                         \
+struct name {                                                          \
+       struct type *slh_first; /* first element */                     \
+}
+
+#define        SLIST_HEAD_INITIALIZER(head)                                    \
+       { NULL }
+
+#define SLIST_ENTRY(type)                                              \
+struct {                                                               \
+       struct type *sle_next;  /* next element */                      \
+}
+
+/*
+ * Singly-linked List access methods.
+ */
+#define        SLIST_FIRST(head)       ((head)->slh_first)
+#define        SLIST_END(head)         NULL
+#define        SLIST_EMPTY(head)       (SLIST_FIRST(head) == SLIST_END(head))
+#define        SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
+
+#define        SLIST_FOREACH(var, head, field)                                 \
+       for((var) = SLIST_FIRST(head);                                  \
+           (var) != SLIST_END(head);                                   \
+           (var) = SLIST_NEXT(var, field))
+
+#define        SLIST_FOREACH_PREVPTR(var, varp, head, field)                   \
+       for ((varp) = &SLIST_FIRST((head));                             \
+           ((var) = *(varp)) != SLIST_END(head);                       \
+           (varp) = &SLIST_NEXT((var), field))
+
+/*
+ * Singly-linked List functions.
+ */
+#define        SLIST_INIT(head) {                                              \
+       SLIST_FIRST(head) = SLIST_END(head);                            \
+}
+
+#define        SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \
+       (elm)->field.sle_next = (slistelm)->field.sle_next;             \
+       (slistelm)->field.sle_next = (elm);                             \
+} while (0)
+
+#define        SLIST_INSERT_HEAD(head, elm, field) do {                        \
+       (elm)->field.sle_next = (head)->slh_first;                      \
+       (head)->slh_first = (elm);                                      \
+} while (0)
+
+#define        SLIST_REMOVE_NEXT(head, elm, field) do {                        \
+       (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next;  \
+} while (0)
+
+#define        SLIST_REMOVE_HEAD(head, field) do {                             \
+       (head)->slh_first = (head)->slh_first->field.sle_next;          \
+} while (0)
+
+#define SLIST_REMOVE(head, elm, type, field) do {                      \
+       if ((head)->slh_first == (elm)) {                               \
+               SLIST_REMOVE_HEAD((head), field);                       \
+       } else {                                                        \
+               struct type *curelm = (head)->slh_first;                \
+                                                                       \
+               while (curelm->field.sle_next != (elm))                 \
+                       curelm = curelm->field.sle_next;                \
+               curelm->field.sle_next =                                \
+                   curelm->field.sle_next->field.sle_next;             \
+               _Q_INVALIDATE((elm)->field.sle_next);                   \
+       }                                                               \
+} while (0)
+
+/*
+ * List definitions.
+ */
+#define LIST_HEAD(name, type)                                          \
+struct name {                                                          \
+       struct type *lh_first;  /* first element */                     \
+}
+
+#define LIST_HEAD_INITIALIZER(head)                                    \
+       { NULL }
+
+#define LIST_ENTRY(type)                                               \
+struct {                                                               \
+       struct type *le_next;   /* next element */                      \
+       struct type **le_prev;  /* address of previous next element */  \
+}
+
+/*
+ * List access methods
+ */
+#define        LIST_FIRST(head)                ((head)->lh_first)
+#define        LIST_END(head)                  NULL
+#define        LIST_EMPTY(head)                (LIST_FIRST(head) == LIST_END(head))
+#define        LIST_NEXT(elm, field)           ((elm)->field.le_next)
+
+#define LIST_FOREACH(var, head, field)                                 \
+       for((var) = LIST_FIRST(head);                                   \
+           (var)!= LIST_END(head);                                     \
+           (var) = LIST_NEXT(var, field))
+
+/*
+ * List functions.
+ */
+#define        LIST_INIT(head) do {                                            \
+       LIST_FIRST(head) = LIST_END(head);                              \
+} while (0)
+
+#define LIST_INSERT_AFTER(listelm, elm, field) do {                    \
+       if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
+               (listelm)->field.le_next->field.le_prev =               \
+                   &(elm)->field.le_next;                              \
+       (listelm)->field.le_next = (elm);                               \
+       (elm)->field.le_prev = &(listelm)->field.le_next;               \
+} while (0)
+
+#define        LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
+       (elm)->field.le_prev = (listelm)->field.le_prev;                \
+       (elm)->field.le_next = (listelm);                               \
+       *(listelm)->field.le_prev = (elm);                              \
+       (listelm)->field.le_prev = &(elm)->field.le_next;               \
+} while (0)
+
+#define LIST_INSERT_HEAD(head, elm, field) do {                                \
+       if (((elm)->field.le_next = (head)->lh_first) != NULL)          \
+               (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
+       (head)->lh_first = (elm);                                       \
+       (elm)->field.le_prev = &(head)->lh_first;                       \
+} while (0)
+
+#define LIST_REMOVE(elm, field) do {                                   \
+       if ((elm)->field.le_next != NULL)                               \
+               (elm)->field.le_next->field.le_prev =                   \
+                   (elm)->field.le_prev;                               \
+       *(elm)->field.le_prev = (elm)->field.le_next;                   \
+       _Q_INVALIDATE((elm)->field.le_prev);                            \
+       _Q_INVALIDATE((elm)->field.le_next);                            \
+} while (0)
+
+#define LIST_REPLACE(elm, elm2, field) do {                            \
+       if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)     \
+               (elm2)->field.le_next->field.le_prev =                  \
+                   &(elm2)->field.le_next;                             \
+       (elm2)->field.le_prev = (elm)->field.le_prev;                   \
+       *(elm2)->field.le_prev = (elm2);                                \
+       _Q_INVALIDATE((elm)->field.le_prev);                            \
+       _Q_INVALIDATE((elm)->field.le_next);                            \
+} while (0)
+
+/*
+ * Simple queue definitions.
+ */
+#define SIMPLEQ_HEAD(name, type)                                       \
+struct name {                                                          \
+       struct type *sqh_first; /* first element */                     \
+       struct type **sqh_last; /* addr of last next element */         \
+}
+
+#define SIMPLEQ_HEAD_INITIALIZER(head)                                 \
+       { NULL, &(head).sqh_first }
+
+#define SIMPLEQ_ENTRY(type)                                            \
+struct {                                                               \
+       struct type *sqe_next;  /* next element */                      \
+}
+
+/*
+ * Simple queue access methods.
+ */
+#define        SIMPLEQ_FIRST(head)         ((head)->sqh_first)
+#define        SIMPLEQ_END(head)           NULL
+#define        SIMPLEQ_EMPTY(head)         (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
+#define        SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
+
+#define SIMPLEQ_FOREACH(var, head, field)                              \
+       for((var) = SIMPLEQ_FIRST(head);                                \
+           (var) != SIMPLEQ_END(head);                                 \
+           (var) = SIMPLEQ_NEXT(var, field))
+
+/*
+ * Simple queue functions.
+ */
+#define        SIMPLEQ_INIT(head) do {                                         \
+       (head)->sqh_first = NULL;                                       \
+       (head)->sqh_last = &(head)->sqh_first;                          \
+} while (0)
+
+#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {                     \
+       if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)        \
+               (head)->sqh_last = &(elm)->field.sqe_next;              \
+       (head)->sqh_first = (elm);                                      \
+} while (0)
+
+#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {                     \
+       (elm)->field.sqe_next = NULL;                                   \
+       *(head)->sqh_last = (elm);                                      \
+       (head)->sqh_last = &(elm)->field.sqe_next;                      \
+} while (0)
+
+#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {           \
+       if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
+               (head)->sqh_last = &(elm)->field.sqe_next;              \
+       (listelm)->field.sqe_next = (elm);                              \
+} while (0)
+
+#define SIMPLEQ_REMOVE_HEAD(head, field) do {                  \
+       if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
+               (head)->sqh_last = &(head)->sqh_first;                  \
+} while (0)
+
+/*
+ * Tail queue definitions.
+ */
+#define TAILQ_HEAD(name, type)                                         \
+struct name {                                                          \
+       struct type *tqh_first; /* first element */                     \
+       struct type **tqh_last; /* addr of last next element */         \
+}
+
+#define TAILQ_HEAD_INITIALIZER(head)                                   \
+       { NULL, &(head).tqh_first }
+
+#define TAILQ_ENTRY(type)                                              \
+struct {                                                               \
+       struct type *tqe_next;  /* next element */                      \
+       struct type **tqe_prev; /* address of previous next element */  \
+}
+
+/*
+ * tail queue access methods
+ */
+#define        TAILQ_FIRST(head)               ((head)->tqh_first)
+#define        TAILQ_END(head)                 NULL
+#define        TAILQ_NEXT(elm, field)          ((elm)->field.tqe_next)
+#define TAILQ_LAST(head, headname)                                     \
+       (*(((struct headname *)((head)->tqh_last))->tqh_last))
+/* XXX */
+#define TAILQ_PREV(elm, headname, field)                               \
+       (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+#define        TAILQ_EMPTY(head)                                               \
+       (TAILQ_FIRST(head) == TAILQ_END(head))
+
+#define TAILQ_FOREACH(var, head, field)                                        \
+       for((var) = TAILQ_FIRST(head);                                  \
+           (var) != TAILQ_END(head);                                   \
+           (var) = TAILQ_NEXT(var, field))
+
+#define TAILQ_FOREACH_REVERSE(var, head, headname, field)              \
+       for((var) = TAILQ_LAST(head, headname);                         \
+           (var) != TAILQ_END(head);                                   \
+           (var) = TAILQ_PREV(var, headname, field))
+
+/*
+ * Tail queue functions.
+ */
+#define        TAILQ_INIT(head) do {                                           \
+       (head)->tqh_first = NULL;                                       \
+       (head)->tqh_last = &(head)->tqh_first;                          \
+} while (0)
+
+#define TAILQ_INSERT_HEAD(head, elm, field) do {                       \
+       if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)        \
+               (head)->tqh_first->field.tqe_prev =                     \
+                   &(elm)->field.tqe_next;                             \
+       else                                                            \
+               (head)->tqh_last = &(elm)->field.tqe_next;              \
+       (head)->tqh_first = (elm);                                      \
+       (elm)->field.tqe_prev = &(head)->tqh_first;                     \
+} while (0)
+
+#define TAILQ_INSERT_TAIL(head, elm, field) do {                       \
+       (elm)->field.tqe_next = NULL;                                   \
+       (elm)->field.tqe_prev = (head)->tqh_last;                       \
+       *(head)->tqh_last = (elm);                                      \
+       (head)->tqh_last = &(elm)->field.tqe_next;                      \
+} while (0)
+
+#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {             \
+       if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
+               (elm)->field.tqe_next->field.tqe_prev =                 \
+                   &(elm)->field.tqe_next;                             \
+       else                                                            \
+               (head)->tqh_last = &(elm)->field.tqe_next;              \
+       (listelm)->field.tqe_next = (elm);                              \
+       (elm)->field.tqe_prev = &(listelm)->field.tqe_next;             \
+} while (0)
+
+#define        TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
+       (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
+       (elm)->field.tqe_next = (listelm);                              \
+       *(listelm)->field.tqe_prev = (elm);                             \
+       (listelm)->field.tqe_prev = &(elm)->field.tqe_next;             \
+} while (0)
+
+#define TAILQ_REMOVE(head, elm, field) do {                            \
+       if (((elm)->field.tqe_next) != NULL)                            \
+               (elm)->field.tqe_next->field.tqe_prev =                 \
+                   (elm)->field.tqe_prev;                              \
+       else                                                            \
+               (head)->tqh_last = (elm)->field.tqe_prev;               \
+       *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
+       _Q_INVALIDATE((elm)->field.tqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.tqe_next);                           \
+} while (0)
+
+#define TAILQ_REPLACE(head, elm, elm2, field) do {                     \
+       if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)   \
+               (elm2)->field.tqe_next->field.tqe_prev =                \
+                   &(elm2)->field.tqe_next;                            \
+       else                                                            \
+               (head)->tqh_last = &(elm2)->field.tqe_next;             \
+       (elm2)->field.tqe_prev = (elm)->field.tqe_prev;                 \
+       *(elm2)->field.tqe_prev = (elm2);                               \
+       _Q_INVALIDATE((elm)->field.tqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.tqe_next);                           \
+} while (0)
+
+/*
+ * Circular queue definitions.
+ */
+#define CIRCLEQ_HEAD(name, type)                                       \
+struct name {                                                          \
+       struct type *cqh_first;         /* first element */             \
+       struct type *cqh_last;          /* last element */              \
+}
+
+#define CIRCLEQ_HEAD_INITIALIZER(head)                                 \
+       { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
+
+#define CIRCLEQ_ENTRY(type)                                            \
+struct {                                                               \
+       struct type *cqe_next;          /* next element */              \
+       struct type *cqe_prev;          /* previous element */          \
+}
+
+/*
+ * Circular queue access methods
+ */
+#define        CIRCLEQ_FIRST(head)             ((head)->cqh_first)
+#define        CIRCLEQ_LAST(head)              ((head)->cqh_last)
+#define        CIRCLEQ_END(head)               ((void *)(head))
+#define        CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
+#define        CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
+#define        CIRCLEQ_EMPTY(head)                                             \
+       (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
+
+#define CIRCLEQ_FOREACH(var, head, field)                              \
+       for((var) = CIRCLEQ_FIRST(head);                                \
+           (var) != CIRCLEQ_END(head);                                 \
+           (var) = CIRCLEQ_NEXT(var, field))
+
+#define CIRCLEQ_FOREACH_REVERSE(var, head, field)                      \
+       for((var) = CIRCLEQ_LAST(head);                                 \
+           (var) != CIRCLEQ_END(head);                                 \
+           (var) = CIRCLEQ_PREV(var, field))
+
+/*
+ * Circular queue functions.
+ */
+#define        CIRCLEQ_INIT(head) do {                                         \
+       (head)->cqh_first = CIRCLEQ_END(head);                          \
+       (head)->cqh_last = CIRCLEQ_END(head);                           \
+} while (0)
+
+#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {           \
+       (elm)->field.cqe_next = (listelm)->field.cqe_next;              \
+       (elm)->field.cqe_prev = (listelm);                              \
+       if ((listelm)->field.cqe_next == CIRCLEQ_END(head))             \
+               (head)->cqh_last = (elm);                               \
+       else                                                            \
+               (listelm)->field.cqe_next->field.cqe_prev = (elm);      \
+       (listelm)->field.cqe_next = (elm);                              \
+} while (0)
+
+#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {          \
+       (elm)->field.cqe_next = (listelm);                              \
+       (elm)->field.cqe_prev = (listelm)->field.cqe_prev;              \
+       if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))             \
+               (head)->cqh_first = (elm);                              \
+       else                                                            \
+               (listelm)->field.cqe_prev->field.cqe_next = (elm);      \
+       (listelm)->field.cqe_prev = (elm);                              \
+} while (0)
+
+#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                     \
+       (elm)->field.cqe_next = (head)->cqh_first;                      \
+       (elm)->field.cqe_prev = CIRCLEQ_END(head);                      \
+       if ((head)->cqh_last == CIRCLEQ_END(head))                      \
+               (head)->cqh_last = (elm);                               \
+       else                                                            \
+               (head)->cqh_first->field.cqe_prev = (elm);              \
+       (head)->cqh_first = (elm);                                      \
+} while (0)
+
+#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                     \
+       (elm)->field.cqe_next = CIRCLEQ_END(head);                      \
+       (elm)->field.cqe_prev = (head)->cqh_last;                       \
+       if ((head)->cqh_first == CIRCLEQ_END(head))                     \
+               (head)->cqh_first = (elm);                              \
+       else                                                            \
+               (head)->cqh_last->field.cqe_next = (elm);               \
+       (head)->cqh_last = (elm);                                       \
+} while (0)
+
+#define        CIRCLEQ_REMOVE(head, elm, field) do {                           \
+       if ((elm)->field.cqe_next == CIRCLEQ_END(head))                 \
+               (head)->cqh_last = (elm)->field.cqe_prev;               \
+       else                                                            \
+               (elm)->field.cqe_next->field.cqe_prev =                 \
+                   (elm)->field.cqe_prev;                              \
+       if ((elm)->field.cqe_prev == CIRCLEQ_END(head))                 \
+               (head)->cqh_first = (elm)->field.cqe_next;              \
+       else                                                            \
+               (elm)->field.cqe_prev->field.cqe_next =                 \
+                   (elm)->field.cqe_next;                              \
+       _Q_INVALIDATE((elm)->field.cqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.cqe_next);                           \
+} while (0)
+
+#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {                   \
+       if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==         \
+           CIRCLEQ_END(head))                                          \
+               (head)->cqh_last = (elm2);                              \
+       else                                                            \
+               (elm2)->field.cqe_next->field.cqe_prev = (elm2);        \
+       if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==         \
+           CIRCLEQ_END(head))                                          \
+               (head)->cqh_first = (elm2);                             \
+       else                                                            \
+               (elm2)->field.cqe_prev->field.cqe_next = (elm2);        \
+       _Q_INVALIDATE((elm)->field.cqe_prev);                           \
+       _Q_INVALIDATE((elm)->field.cqe_next);                           \
+} while (0)
+
+#endif /* !_SYS_QUEUE_H_ */
diff --git a/tests/swap.c b/tests/swap.c
new file mode 100644 (file)
index 0000000..606b0f7
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "queue.h"
+
+struct obj {
+    int abc;
+    TAILQ_ENTRY(obj) entry;
+};
+
+TAILQ_HEAD(objhead, obj) head;
+
+void dump() {
+    struct obj *e;
+    printf("dump:\n");
+    e = TAILQ_FIRST(&head);
+    printf("first: %d\n", e->abc);
+    e = TAILQ_LAST(&head, objhead);
+    printf("last: %d\n", e->abc);
+    TAILQ_FOREACH(e, &head, entry) {
+        printf("  %d\n", e->abc);
+    }
+    printf("again, but reverse:\n");
+    TAILQ_FOREACH_REVERSE(e, &head, objhead, entry) {
+        printf("  %d\n", e->abc);
+    }
+    printf("done\n\n");
+}
+
+#define TAILQ_SWAP(first, second, head, field) do { \
+    *((first)->field.tqe_prev) = (second); \
+    (second)->field.tqe_prev = (first)->field.tqe_prev; \
+    (first)->field.tqe_prev = &((second)->field.tqe_next); \
+    (first)->field.tqe_next = (second)->field.tqe_next; \
+    if ((second)->field.tqe_next) \
+        (second)->field.tqe_next->field.tqe_prev = &((first)->field.tqe_next); \
+    (second)->field.tqe_next = first; \
+    if ((head)->tqh_last == &((second)->field.tqe_next)) \
+        (head)->tqh_last = &((first)->field.tqe_next); \
+} while (0)
+
+void _TAILQ_SWAP(struct obj *first, struct obj *second, struct objhead *head) {
+    struct obj **tqe_prev = first->entry.tqe_prev;
+    *tqe_prev = second;
+
+    second->entry.tqe_prev = first->entry.tqe_prev;
+
+    first->entry.tqe_prev = &(second->entry.tqe_next);
+
+    first->entry.tqe_next = second->entry.tqe_next;
+
+    if (second->entry.tqe_next) {
+        struct obj *tqe_next = second->entry.tqe_next;
+        tqe_next->entry.tqe_prev = &(first->entry.tqe_next);
+    }
+
+    second->entry.tqe_next = first;
+
+    if (head->tqh_last == &(second->entry.tqe_next))
+        head->tqh_last = &(first->entry.tqe_next);
+
+}
+
+int main() {
+    printf("hello\n");
+
+    TAILQ_INIT(&head);
+
+    struct obj first;
+    first.abc = 123;
+
+    struct obj second;
+    second.abc = 456;
+
+    struct obj third;
+    third.abc = 789;
+
+    struct obj fourth;
+    fourth.abc = 999;
+
+
+    struct obj fifth;
+    fifth.abc = 5555;
+
+    /*
+     * ************************************************
+     */
+    printf("swapping first two elements:\n");
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+
+    dump();
+
+    TAILQ_SWAP(&first, &second, &head, entry);
+
+    dump();
+
+    /*
+     * ************************************************
+     */
+    printf("swapping last two elements:\n");
+
+    TAILQ_INIT(&head);
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+
+    dump();
+
+    TAILQ_SWAP(&second, &third, &head, entry);
+
+    dump();
+
+    /*
+     * ************************************************
+     */
+    printf("longer list:\n");
+
+    TAILQ_INIT(&head);
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+    TAILQ_INSERT_TAIL(&head, &fourth, entry);
+
+    dump();
+
+    TAILQ_SWAP(&first, &second, &head, entry);
+
+    dump();
+
+    /*
+     * ************************************************
+     */
+    printf("longer list 2:\n");
+
+    TAILQ_INIT(&head);
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+    TAILQ_INSERT_TAIL(&head, &fourth, entry);
+
+    dump();
+
+    TAILQ_SWAP(&second, &third, &head, entry);
+
+    dump();
+
+
+    /*
+     * ************************************************
+     */
+    printf("longer list, swap, then insert:\n");
+
+    TAILQ_INIT(&head);
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+    TAILQ_INSERT_TAIL(&head, &fourth, entry);
+
+    dump();
+
+    TAILQ_SWAP(&second, &third, &head, entry);
+
+    dump();
+
+    TAILQ_INSERT_AFTER(&head, &third, &fifth, entry);
+
+    dump();
+
+
+    /*
+     * ************************************************
+     */
+    printf("longer list, swap, then append:\n");
+
+    TAILQ_INIT(&head);
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+    TAILQ_INSERT_TAIL(&head, &fourth, entry);
+
+    dump();
+
+    TAILQ_SWAP(&second, &third, &head, entry);
+
+    dump();
+
+    TAILQ_INSERT_TAIL(&head, &fifth, entry);
+
+    dump();
+
+
+    /*
+     * ************************************************
+     */
+    printf("longer list, swap, then remove:\n");
+
+    TAILQ_INIT(&head);
+
+    TAILQ_INSERT_TAIL(&head, &first, entry);
+    TAILQ_INSERT_TAIL(&head, &second, entry);
+    TAILQ_INSERT_TAIL(&head, &third, entry);
+    TAILQ_INSERT_TAIL(&head, &fourth, entry);
+
+    dump();
+
+    TAILQ_SWAP(&second, &third, &head, entry);
+
+    dump();
+
+    TAILQ_REMOVE(&head, &second, entry);
+
+    dump();
+
+}
diff --git a/tests/test_table.c b/tests/test_table.c
new file mode 100644 (file)
index 0000000..14e36de
--- /dev/null
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include "table.h"
+
+void print_table() {
+       int r, c;
+       printf("printing table...\n");
+       for (c = 0; c < table_dims.x; c++)
+               for (r = 0; r < table_dims.y; r++)
+                       printf("table[%d][%d] = %p\n", c, r, table[c][r]);
+       printf("done\n");
+}
+
+int main() {
+       printf("table.c tests\n");
+       printf("table_dimensions = %d, %d\n", table_dims.x, table_dims.y);
+       init_table();
+       printf("table_dimensions = %d, %d\n", table_dims.x, table_dims.y);
+       print_table();
+
+       printf("expand_table_cols()\n");
+       expand_table_cols();
+       printf("table_dimensions = %d, %d\n", table_dims.x, table_dims.y);
+       print_table();
+
+       printf("expand_table_rows()\n");
+       expand_table_rows();
+       printf("table_dimensions = %d, %d\n", table_dims.x, table_dims.y);
+       print_table();
+
+}
diff --git a/yajl-fallback/yajl/yajl_version.h b/yajl-fallback/yajl/yajl_version.h
new file mode 100644 (file)
index 0000000..c6da442
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef YAJL_VERSION_H_
+#define YAJL_VERSION_H_
+/* Fallback for libyajl 1 which does not provide yajl_version.h */
+#define YAJL_MAJOR 1
+#define YAJL_MINOR 0
+#define YAJL_MICRO 0
+#endif